Programmer le jeu Sudoku

Signaler
-
 trifou -
Bonjour,

Voici un exercice ou on demande de compléter le programme. J''ai commencé mais je suis bloqué. Quelqu'un(e) peut il m'aider svp?
On va programmer le jeu Sudoku (https://fr.wikipedia.org/wiki/Sudoku). Vous devez donc compléter le programme pour ce jeu. Une partie de programme vous est donnée dans deux fichiers: D4Q3.py et jeuSudoku.py (que vous devez compléter). Ne modifier pas les prototypes des fonctions. Vous devez implémenter les fonctions pour ce jeu. Un exemple d’exécution du jeu est donnéé à la fin de ce document.

Le programme principal contrôle le jeu (il est déjà donné). Au début un menu de 3 choix est affiché à l’utilisateur. Ensuite, il demande à l’utilisateur d’entrée son choix. On suppose que l’utilisateur va entrer exactement le bon choix (un choix entre 1 et 3) donc la validité du choix n’est pas vérifiée. Le choix 1 : il réinitialise la grille de Sudoku par la matrice donné dans le programme principal . Par la suite, le jeu commence en suivant les mêmes étapes que le choix 2. Le choix 2 : le jeu commence. Il affiche la grille à l’écran et puis demander à l’utilisateur d’entrer la case à jouer (il doit entrer le numéro de la ligne, de la colonne et le nombre qu’il veut ajouter). Si la case à jouer est correcte (une case valide), alors il faut afficher le message Bravo !!. Sinon, le message Echec sera affiché. Si la case est déjà remplie ou si la grille de Sudoku est pleine, il affiche le message approprié à l’utilisateur. Le choix 3 : Le jeu s’arrête. Le message Au revoir ! est affiché.

Afin de bien contrôler le jeu, il faut implémenter les fonctions suivantes : AfficherGrille() : permet d’afficher une grille Sudoku sous format d’une matrice 9x9. VerifierLigne() : permet de vérifier si le nombre à ajouter existe déjà sur la ligne. VerifierCol() : permet de vérifier si le nombre à ajouter existe déjà sur la colonne. VerifierSousGrille() : permet de vérifier si le nombre à ajouter existe déjà sur la sous grille où l’ajout sera fait. VerifierCase() : vérifier si une case est valide c.-à-d. le nombre à ajouter n’existe pas ni sur la ligne, ni sur la colonne, ni sur la sous-grille. VerifierGagner() : vérifier si la grille est complète c.-à-d. il n’y a aucun case nul. Dans ce cas, la fonction retourne True. Jouer() : ajouter une case dans la grille de Sudoku seulement si la case est valide. Notez que: 1) Après chaque choix de menu, on réaffiche la grille après modification (s’il en y a) et le menu avec les options et redemande à l’utilisateur d’entrer de nouveau un entre choix jusqu’à que l’utilisateur choisi l’option 3 ou la grille est complétée. 2) La case à ajouter est demandé à l’utilisateur avec input(). On ne vérifie pas la validité de ces entrés (on suppose que l’utilisateur il va entrer toujours un nombre entre 1 et 9 et un numéro de ligne et numéro de colonne entre 0 et 8). 3) Les fonctions verifierLigne(), verifierCol(), verifierSousGrille() retournent True si le nombre n’existe pas sur la ligne ou la colonne ou la sous-grille.
Annexe – exemple jeu

Menu: 1- Commencer un nouveau jeu. 2- Continuer le jeu. 3- Quitter le jeu.

SVP entrez votre choix (1, 2 ou 3): 1
5 3 8 6 9 1 0 4 7 7 4 6 5 3 2 8 1 9 1 9 2 7 8 4 3 5 6 8 7 1 2 6 3 4 9 5 3 2 9 4 5 7 1 6 8 4 6 5 9 1 8 7 2 3 6 1 4 3 7 9 5 8 2 9 8 3 1 2 5 6 7 4 2 5 0 8 4 6 9 3 1
Entrez votre choix de case ligne: 0
Entrez votre choix de case col: 6
Entrez votre choix de case num: 2
Bravo!!
5 3 8 6 9 1 2 4 7 7 4 6 5 3 2 8 1 9 1 9 2 7 8 4 3 5 6 8 7 1 2 6 3 4 9 5 3 2 9 4 5 7 1 6 8 4 6 5 9 1 8 7 2 3 6 1 4 3 7 9 5 8 2 9 8 3 1 2 5 6 7 4 2 5 0 8 4 6 9 3 1
Menu: 1- Commencer un nouveau jeu. 2- Continuer le jeu. 3- Quitter le jeu. SVP entrez votre choix (1, 2 ou 3): 2
5 3 8 6 9 1 2 4 7 7 4 6 5 3 2 8 1 9 1 9 2 7 8 4 3 5 6 8 7 1 2 6 3 4 9 5 3 2 9 4 5 7 1 6 8 4 6 5 9 1 8 7 2 3 6 1 4 3 7 9 5 8 2 9 8 3 1 2 5 6 7 4 2 5 0 8 4 6 9 3 1 Entrez votre choix de case ligne: 1
Entrez votre choix de case col: 2
Entrez votre choix de case num: 7
Case déjà remplie !!
Voici le code en question:
from jeuSudoku import *

def afficherGrille(grille):
    '''
    (list) -> None
    Affiche le grille de jeu Sudoku
    Preconditions: grille est une reference a une matrice 9x9 qui contient déja des nombres de 1 à 9
    '''
    print("   ", end="")
    col = 0
    while col < len(grille):
      print(col, end="  ")
      col += 1
    print()
    row = 0
    while row < len(grille):
       print(row, end="")
       col = 0
       while col < len(grille[row]):
         print(" ", grille[row][col], end="")
         col += 1
       print()
       row += 1

def jouer(grille, row, col, num):
    '''
    (list, int, int, int) -> Bool
    Jouer une étape de jeu Sudoku
    Preconditions: grille est une réference sur une liste de 9x9 contient seulement des nombres
    grille est modifié (un element est ajouté dans la grille) si la case est valide est correcte.
    '''
    
    # A COMPLETER
    
# Créer le tableau de jeu (9 x 9)
grille = [[5, 3, 8, 6, 9, 1, 0, 4, 7],
          [7, 4, 6, 0, 3, 2, 8, 1, 9],
          [1, 9, 2, 0, 8, 4, 3, 5, 6],
          [8, 7, 1, 2, 6, 3, 4, 9, 5],
          [3, 2, 9, 4, 5, 7, 1, 6, 8],
          [4, 6, 5, 9, 1, 8, 7, 2, 3],
          [0, 0, 4, 3, 7, 9, 5, 8, 2],
          [9, 8, 3, 1, 0, 5, 6, 7, 4],
          [2, 5, 0, 8, 4, 6, 9, 3, 1]]  # la seule matrice utilisé dans le programme.
print("Menu: 1- Commencer un nouveau jeu.")
print("     ", "2- Continuer le jeu.")
print("     ", "3- Quitter le jeu.")
choix = int(input("SVP entrez votre choix: 1, 2 ou 3: "))
while choix < 3 and choix > 0:
      if choix == 1:
          # Créer le tableau de jeu (9 x 9)
          grille = [[5, 3, 8, 6, 9, 1, 0, 4, 7],
                    [7, 4, 6, 5, 3, 2, 8, 1, 9],
                    [1, 9, 2, 7, 8, 4, 3, 5, 6],
                    [8, 7, 1, 2, 6, 3, 4, 9, 5],
                    [3, 2, 9, 4, 5, 7, 1, 6, 8],
                    [4, 6, 5, 9, 1, 8, 7, 2, 3],
                    [6, 1, 4, 3, 7, 9, 5, 8, 2],
                    [9, 8, 3, 1, 2, 5, 6, 7, 4],
                    [2, 5, 0, 8, 4, 6, 9, 3, 1]]  # la seule matrice utilisé dans le programme.
      afficherGrille(grille)
      row = int(input("entrez votre choix de case ligne "))
      col = int(input("entrez votre choix de case col "))
      num = int(input("entrez votre choix de case num "))
      if grille[row][col] == 0:
          ajout = jouer(grille, row, col, num)
          if ajout == True:
              print("Bravo!!")
          else:
              print("Echec :(")
      else:
          print("Case deja rempli")
      afficherGrille(grille)
      if verifierGagner(grille) == True:
          print("Bravo!! Vous avez gagne")
          choix = -1
      else:
         print("Menu: 1- Commencer un nouveau jeu.")
         print("     ", "2- Continuer le jeu.")
         print("     ", "3- Quitter le jeu.")
         choix = int(input("SVP entrez votre choix: 1, 2 ou 3: "))
if choix==3:
    print("Au revoir")

def verifierLigne(grille, row, num):
    '''
        (list, int, int) -> Bool
        Vérifier si la case à ajouter n'existe pas sur la ligne.
        Preconditions: grille est une reference a une matrice 9x9 qui contient déja des nombres de 1 à 9
    '''
    for i in range(0,9):
        if(grille[row][i]==num):
            return False
        break
    return true

def verifierCol(grille, col, num):
    '''
            (list, int, int) -> Bool
            Vérifier si la case à ajouter n'existe pas sur la colonne.
            Preconditions: grille est une reference a une matrice 9x9 qui contient déja des nombres de 1 à 9
    '''
    for i in range(0,9):
        if(grille[i][col]==num):
            return False
        break
    return True

def verifierSousGrille(grille, row, col, num):
    '''
            (list, int, int) -> Bool
            Vérifier si la case à ajouter n'existe pas sur la sous-grille.
            Preconditions: grille est une reference a une matrice 9x9 qui contient déja des nombres de 1 à 9
    '''

    # A COMPLETER
            

def verifierGagner(grille):
    '''(list) ->  bool
    * Preconditions: grille est une reference a une matrice 9x9 qui contient de nombres de 1 à 9
    * Verifie si la grille est completement remplie.
    '''
    
   # A COMPLETER
  
def verifierValide(grille, row, col, num):
   ''' (list, int, int, int) ->  bool
   * verifie si le nombre proposé est bon sur la ligne et colonne et la sous-grille donné en parametre.
   * Preconditions: tab est une reference a une matrice 9 x 9 qui contient des chiffres entre 1 et 9
   '''
   
   # A COMPLETER
   








Configuration: Windows / Edge 18.17763

9 réponses

Messages postés
9118
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 décembre 2019
468
bonjour,
cela ne t'aidera pas si nous faisons l'exercice à ta place.
as-tu une question?
Bon je reformule ma question.voici le code en question j'ai pu réussir à tout rempli mais le problème c'est que quand je l'exécute il ne m'affiche jamais bravo; c'est soit échec ou la case est déjà rempli.il y a un problème quelque part je sais pas. Tout aide est la bienvenue
from jeuSudoku import *

def afficherGrille(grille):
    '''
    (list) -> None
    Affiche le grille de jeu Sudoku
    Preconditions: grille est une reference a une matrice 9x9 qui contient déja des nombres de 1 à 9
    '''
    print("   ", end="")
    col = 0
    while col < len(grille):
      print(col, end="  ")
      col += 1
    print()
    row = 0
    while row < len(grille):
       print(row, end="")
       col = 0
       while col < len(grille[row]):
         print(" ", grille[row][col], end="")
         col += 1
       print()
       row += 1

def jouer(grille, row, col, num):
    '''
    (list, int, int, int) -> Bool
    Jouer une étape de jeu Sudoku
    Preconditions: grille est une réference sur une liste de 9x9 contient seulement des nombres
    grille est modifié (un element est ajouté dans la grille) si la case est valide est correcte.
    '''
    
    if verifierValide(grille, row, col, num)== True:
        ajout = True
    else :
        ajout = False
    
# Créer le tableau de jeu (9 x 9)
grille = [[5, 3, 8, 6, 9, 1, 0, 4, 7],
          [7, 4, 6, 0, 3, 2, 8, 1, 9],
          [1, 9, 2, 0, 8, 4, 3, 5, 6],
          [8, 7, 1, 2, 6, 3, 4, 9, 5],
          [3, 2, 9, 4, 5, 7, 1, 6, 8],
          [4, 6, 5, 9, 1, 8, 7, 2, 3],
          [0, 0, 4, 3, 7, 9, 5, 8, 2],
          [9, 8, 3, 1, 0, 5, 6, 7, 4],
          [2, 5, 0, 8, 4, 6, 9, 3, 1]]  # la seule matrice utilisé dans le programme.
print("Menu: 1- Commencer un nouveau jeu.")
print("     ", "2- Continuer le jeu.")
print("     ", "3- Quitter le jeu.")
choix = int(input("SVP entrez votre choix: 1, 2 ou 3: "))
while choix < 3 and choix > 0:
      if choix == 1:
          # Créer le tableau de jeu (9 x 9)
          grille = [[5, 3, 8, 6, 9, 1, 0, 4, 7],
                    [7, 4, 6, 5, 3, 2, 8, 1, 9],
                    [1, 9, 2, 7, 8, 4, 3, 5, 6],
                    [8, 7, 1, 2, 6, 3, 4, 9, 5],
                    [3, 2, 9, 4, 5, 7, 1, 6, 8],
                    [4, 6, 5, 9, 1, 8, 7, 2, 3],
                    [6, 1, 4, 3, 7, 9, 5, 8, 2],
                    [9, 8, 3, 1, 2, 5, 6, 7, 4],
                    [2, 5, 0, 8, 4, 6, 9, 3, 1]]  # la seule matrice utilisé dans le programme.
      afficherGrille(grille)
      row = int(input("entrez votre choix de case ligne "))
      col = int(input("entrez votre choix de case col "))
      num = int(input("entrez votre choix de case num "))
      if grille[row][col] == 0:
          ajout = jouer(grille, row, col, num)
          if ajout == True:
              print("Bravo!!")
          else:
              print("Echec :(")
      else:
          print("Case deja rempli")
      afficherGrille(grille)
      if verifierGagner(grille) == True:
          print("Bravo!! Vous avez gagne")
          choix = -1
      else:
         print("Menu: 1- Commencer un nouveau jeu.")
         print("     ", "2- Continuer le jeu.")
         print("     ", "3- Quitter le jeu.")
         choix = int(input("SVP entrez votre choix: 1, 2 ou 3: "))
if choix==3:
    print("Au revoir")

def verifierLigne(grille, row, num):
    '''
        (list, int, int) -> Bool
        Vérifier si la case à ajouter n'existe pas sur la ligne.
        Preconditions: grille est une reference a une matrice 9x9 qui contient déja des nombres de 1 à 9
    '''
    for i in range(len(grille[0])):
        if grille[row][i] == num:
            return False
      
def verifierCol(grille, col, num):
    '''
            (list, int, int) -> Bool
            Vérifier si la case à ajouter n'existe pas sur la colonne.
            Preconditions: grille est une reference a une matrice 9x9 qui contient déja des nombres de 1 à 9
    '''
    for i in range(len(grille)):
        if grille[i][col] == num:
            return False
        
def verifierSousGrille(grille, row, col, num):
    '''
            (list, int, int) -> Bool
            Vérifier si la case à ajouter n'existe pas sur la sous-grille.
            Preconditions: grille est une reference a une matrice 9x9 qui contient déja des nombres de 1 à 9
    '''

    grille_x = row[1] // 3
    grille_y = col[0] // 3

    for i in range(grille_y*3, grille_y*3+3):
        for j in range(grille_x*3, grille_x*3+3):
            if grille[i][j] == num and (i,j) != grille :
                return False
            
def verifierValide(grille, row, col, num):
   ''' (list, int, int, int) ->  bool
   * verifie si le nombre proposé est bon sur la ligne et colonne et la sous-grille donné en parametre.
   * Preconditions: tab est une reference a une matrice 9 x 9 qui contient des chiffres entre 1 et 9
   '''
   if (verifierLigne(grille, row, num) and verifierCol(grille, col, num) and verifierSousGrille(grille, row, col, num))== False:
       return True
   
def verifierGagner(grille):
    '''(list) ->  bool
    * Preconditions: grille est une reference a une matrice 9x9 qui contient de nombres de 1 à 9
    * Verifie si la grille est completement remplie.
    '''
    for i in grille :
        if i == 0 :
            return True
        else :
            return False
      
   
   


yg_be
Messages postés
9118
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 décembre 2019
468 > jason
pourquoi fais-tu
import
en début?
tu as bien une petite idée d'où vient le problème, non? à quelle ligne devrait s'afficher "bravo"? dans quel cas "bravo" s'affiche-t'il?
il est souvent utile d'ajouter des
print()
pour comprendre le comportement du programme.
> jason
Bonsoir,

Ta fonction jouer ne retourne rien.
Elle devrait être

def jouer(grille, row, col, num):
    '''
    (list, int, int, int) -> Bool
    Jouer une étape de jeu Sudoku
    Preconditions: grille est une réference sur une liste de 9x9 contient seulement des nombres
    grille est modifié (un element est ajouté dans la grille) si la case est valide est correcte.
    '''
    
    if verifierValide(grille, row, col, num):
        # Changer la valeur de la grille
        return True
    return False


Il serait aussi préférable de mettre ton code

print("Menu: 1- Commencer un nouveau jeu.")
# jusqu'à
print("Au revoir")


Dans une fonction à appler en fin de script.
Le code m'avait déjà été donné il fallait que je complète les éléments manquants. il avait déjà import dans mon code.
yg_be
Messages postés
9118
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 décembre 2019
468 > jason
tu as bien une petite idée d'où vient le problème, non? à quelle ligne devrait s'afficher "bravo"? dans quel cas "bravo" s'affiche-t'il?
il est souvent utile d'ajouter des print() pour comprendre le comportement du programme.