Le Sudoku est un casse-tête numérique populaire qui consiste en une grille 9×9 avec des chiffres de 1 à 9. Le puzzle comprend une combinaison de chiffres et quelques espaces vides que vous devez remplir.


Lorsque vous remplissez les espaces vides, chaque ligne, chaque colonne et chaque sous-grille 3×3 doit contenir tous les chiffres de 1 à 9.

Un simple script Python peut vous aider à résoudre une grille de Sudoku. Il peut analyser tous les espaces vides sur la planche de Sudoku et trouver un nombre possible pour remplir chaque espace vide.

Comment créer et afficher le tableau de Sudoku

Dans un script Python, vous devrez utiliser une liste de tableaux pour stocker les valeurs du puzzle Sudoku non résolu.

Le code utilisé dans ce projet est disponible dans ce repo GitHub sous la licence MIT.

  1. Dans un nouveau script Python appelé sudoku.py, stockez toutes les valeurs de la grille 9×9. Chaque ligne et chaque colonne représentent les neuf nombres qui traversent et descendent le puzzle Sudoku. Ajoutez des 0 pour représenter les espaces à résoudre :
     board = [
      [5, 3, 0, 0, 7, 0, 0, 0, 0],
      [6, 0, 0, 1, 9, 5, 0, 0, 0],
      [0, 9, 8, 0, 0, 0, 0, 6, 0],
      [8, 0, 0, 0, 6, 0, 0, 0, 3],
      [4, 0, 0, 8, 0, 3, 0, 0, 1],
      [7, 0, 0, 0, 2, 0, 0, 0, 6],
      [0, 6, 0, 0, 0, 0, 2, 8, 0],
      [0, 0, 0, 4, 1, 9, 0, 0, 5],
      [0, 0, 0, 0, 8, 0, 0, 7, 9]
    ]
  2. Dans une nouvelle fonction appelée print_board, utilisez une boucle for pour traiter chaque ligne de la grille :
     def print_board(board):
      for row in range(9):
  3. Pour séparer chaque ligne en tiers, vérifiez si la ligne est divisible par trois et ajoutez une ligne :
         if row % 3 == 0 and row != 0:
          print("- - - - - - - - - - - - - - ")
  4. À l’intérieur de chaque ligne, parcourez en boucle chaque colonne. Vous pouvez également diviser les colonnes en tiers en vérifiant si la colonne est divisible par trois :
         for col in range(9):
          if col % 3 == 0 and col != 0:
            print(" | ", end="")
  5. Imprimez la valeur numérique stockée dans la grille. Si la colonne est la dernière colonne de cette ligne, ajoutez une ligne de séparation, de sorte que la ligne suivante apparaisse sur une nouvelle ligne :
           if col == 8:
            print(board[row][col])
          else:
            print(str(board[row][col]) + " ", end="")
  6. Appelez la fonction pour imprimer le tableau :
     print_board(board) 
  7. Dans une ligne de commande, naviguez jusqu’au dossier où vous avez stocké votre script python, par exemple :
     cd Desktop 
  8. Utilisez la commande python pour exécuter votre script Sudoku. Affichez le puzzle à l’écran :
     python sudoku.py 
    cmd avec un tableau sudoku vide

Comment identifier les espaces vides à résoudre

Vous pouvez parcourir les listes pour trouver les espaces constitués de 0. Ceux-ci déterminent les espaces à résoudre.

  1. Dans une nouvelle fonction appelée find_empty(), parcourez en boucle chaque ligne et chaque colonne du tableau :
     def find_empty(board):
      for row in range(9):
        for col in range(9):
  2. Si la valeur de la cellule actuelle est 0, renvoyer la position actuelle de la cellule vide :
           if board[row][col] == 0:
            return (row, col)
  3. Si le script atteint la fin de la fonction, cela signifie qu’il n’a pu trouver aucune cellule avec la valeur 0. Dans ce cas, ne renvoyez rien :
       return None 
  4. Dans une nouvelle fonction appelée solve(), utilisez la fonction find pour trouver le premier espace vide sur le tableau :
     def solve(board):
      find = find_empty(board)
  5. La fonction find_empty() renvoie la position de la cellule sous forme de tuple, par exemple (0, 2). Enregistrez ces valeurs séparément dans le fichier ligne et col variables. Sinon, il renvoie true pour signifier qu’il n’y a plus d’espaces vides à résoudre :
       if not find:
        return True
      else:
        row, col = find

Comment résoudre l’énigme pour chaque ligne, chaque colonne et chaque grille 3×3

Maintenant que vous pouvez identifier le premier espace vide à résoudre, vous devez essayer de trouver un nombre approprié pour remplir cet espace et résoudre l’énigme.

En utilisant la récursivité, appelez la fonction solve() à l’intérieur d’elle-même pour essayer toutes les combinaisons possibles de valeurs pour tous les autres espaces.

  1. À l’intérieur de la fonction solve(), après avoir trouvé le premier espace vide, passez en boucle sur chaque nombre de 1 à 9. Ces nombres représentent les nombres possibles qui pourraient remplir l’espace non résolu :
       for num in range(1, 10): 
  2. Saisissez le tableau, le nombre possible et la position de la cellule vide dans une nouvelle fonction. La nouvelle fonction renverra vrai si ce nombre est un nombre valide qui peut résoudre l’espace vide. S’il est valide, il sera assigné à la case du tableau :
         if is_valid(board, num, (row, col)):
          board[row][col] = num
  3. Créez la fonction is_valid(), avec les paramètres correspondants :
     def is_valid(board, num, pos): 
  4. Utilisez la fonction pour vérifier si le fait de placer le nombre à cette position enfreint les règles du jeu Sudoku. Tout d’abord, vérifiez si ce nombre existe déjà dans la ligne ou la colonne de la cellule :
       for col in range(9):
        if board[pos[0]][col] == num and pos[1] != col:
          return False

      for row in range(9):
        if board[row][pos[1]] == num and pos[0] != row:
          return False
  5. Obtenez la grille 3×3 à laquelle la cellule appartient. Pour ce faire, divisez la position de la cellule par trois :
       box_row = pos[0] // 3
      box_col = pos[1] // 3
  6. Pour chaque ligne et chaque colonne de cette grille 3×3, vérifiez si le numéro existe déjà. Si c’est le cas, il renvoie false :
       for row in range(box_row*3, box_row*3 + 3):
        for col in range(box_col*3, box_col*3 + 3):
          if board[row][col] == num and (row, col) != pos:
            return False
  7. Si le script atteint la fin de la fonction, cela signifie qu’aucune des règles du Sudoku n’a échoué. Retourner vrai :
       return True 
  8. La fonction is_valid() vérifie uniquement si le placement des nombres est valide, mais cela ne signifie pas qu’il s’agit de la bonne réponse à la solution globale. Dans la fonction solve(), appelez à nouveau la fonction solve() avec le tableau mis à jour. La fonction solve() peut arriver à un stade où elle ne peut plus utiliser de nombres pour remplir les espaces. Dans ce cas, la fonction entière renvoie un faux, remet cette cellule particulière à 0 et revient en arrière. La fonction solve() ne renvoie la valeur true que lorsque le script peut remplir tous les espaces :
       for num in range(1, 10):
        if is_valid(board, num, (row, col)):
          board[row][col] = num
                
          if solve(board):
            return True
                
          board[row][col] = 0

      return False
  9. Pour commencer à résoudre le puzzle, appelez la fonction solve() avec le tableau original, à la fin du script, après avoir déclaré la fonction solve() :
     solve(board) 
  10. Imprimer le résultat final :
     print("Solved:")
    print_board(board)
  11. Sur la ligne de commande, utilisez la commande python pour réexécuter le script. Affichez le puzzle résolu à l’écran :
     python sudoku.py 
    cmd avec le tableau sudoku résolu

Créer des jeux avec Python

Le Sudoku n’est qu’un des nombreux jeux que vous pouvez créer et résoudre à l’aide de Python. Vous pouvez utiliser Python pour créer de nombreux autres jeux, tels qu’un jeu de mots mêlés, un jeu d’aventure textuel ou un jeu de couleurs, pour n’en citer que quelques-uns.