Programmer le jeu Sudoku

Fermé
jason - 16 nov. 2019 à 08:02
 trifou - 19 nov. 2019 à 17:50
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
A voir également:

1 réponse

yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
16 nov. 2019 à 09:48
bonjour,
cela ne t'aidera pas si nous faisons l'exercice à ta place.
as-tu une question?
0
Oui, les parties que je suis sensé compléter, qu'est ce qu'il faut que je fasse svp? Je ne comprends pas
0
Héoooo il y a personne ici pour m'aider svp?
0
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
      
   
   


0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > jason
17 nov. 2019 à 12:08
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.
0
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.
0