0% ont trouvé ce document utile (0 vote)
115 vues10 pages

Générateur et Solveur Sudoku Python

Programme python Sudoku tous niveaux

Transféré par

Céline Lutti
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats RTF, PDF, TXT ou lisez en ligne sur Scribd

Thèmes abordés

  • bibliothèques python,
  • nombre de solutions,
  • sudoku classique,
  • difficulté du puzzle,
  • jeu de sudoku,
  • solveur de sudoku,
  • coloration des chiffres,
  • interface utilisateur,
  • grille de sudoku,
  • grille complète
0% ont trouvé ce document utile (0 vote)
115 vues10 pages

Générateur et Solveur Sudoku Python

Programme python Sudoku tous niveaux

Transféré par

Céline Lutti
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats RTF, PDF, TXT ou lisez en ligne sur Scribd

Thèmes abordés

  • bibliothèques python,
  • nombre de solutions,
  • sudoku classique,
  • difficulté du puzzle,
  • jeu de sudoku,
  • solveur de sudoku,
  • coloration des chiffres,
  • interface utilisateur,
  • grille de sudoku,
  • grille complète

## Générateur Solveur Sudoku ##

## Générer une grille complète

import random

def is_valid(board, row, col, num):


for i in range(9):
if board[row][i] == num or board[i][col] == num:
return False

startRow, startCol = 3 * (row // 3), 3 * (col // 3)


for i in range(startRow, startRow + 3):
for j in range(startCol, startCol + 3):
if board[i][j] == num:
return False

return True

def fill_board(board):
for i in range(9):
for j in range(9):
if board[i][j] == 0:
nums = list(range(1, 10))
random.shuffle(nums)
for num in nums:
if is_valid(board, i, j, num):
board[i][j] = num
if fill_board(board):
return True
board[i][j] = 0
return False
return True

def generate_complete_board():
board = [[0] * 9 for _ in range(9)]
fill_board(board)
return board

## Retirer des chiffres pour créer un puzzle

def copy_board(board):
return [row[:] for row in board]
def is_solvable(board):
def solve(board):
for i in range(9):
for j in range(9):
if board[i][j] == 0:
for num in range(1, 10):
if is_valid(board, i, j, num):
board[i][j] = num
if solve(board):
return True
board[i][j] = 0
return False
return True

return solve(copy_board(board))

def generate_puzzle(board, clues=30):


while sum(row.count(0) for row in board) < 81 - clues:
row, col = random.randint(0, 8), random.randint(0, 8)
while board[row][col] == 0:
row, col = random.randint(0, 8), random.randint(0, 8)
removed_num = board[row][col]
board[row][col] = 0
if not is_solvable(board):
board[row][col] = removed_num
return board

def generate_sudoku(clues=30):
board = generate_complete_board()
puzzle = generate_puzzle(board, clues)
return puzzle

## Solveur du sudoku

def print_board(board):
for row in board:
print(" ".join(str(num) if num != 0 else '.' for num in row))

def solve_sudoku(board):
def solve(board):
for i in range(9):
for j in range(9):
if board[i][j] == 0:
for num in range(1, 10):
if is_valid(board, i, j, num):
board[i][j] = num
if solve(board):
return True
board[i][j] = 0
return False
return True

solve(board)
return board

## Exemple utilisation

if __name__ == "__main__":
puzzle = generate_sudoku(clues=30)
print("Generated Sudoku Puzzle:")
print_board(puzzle)

print("\nSolved Sudoku:")
solve_sudoku(puzzle)
print_board(puzzle)

## Générateur de sudoku ##

import random

def is_valid(board, row, col, num):


for i in range(9):
if board[row][i] == num or board[i][col] == num:
return False

startRow, startCol = 3 * (row // 3), 3 * (col // 3)


for i in range(startRow, startRow + 3):
for j in range(startCol, startCol + 3):
if board[i][j] == num:
return False

return True

def fill_board(board):
for i in range(9):
for j in range(9):
if board[i][j] == 0:
nums = list(range(1, 10))
random.shuffle(nums)
for num in nums:
if is_valid(board, i, j, num):
board[i][j] = num
if fill_board(board):
return True
board[i][j] = 0
return False
return True

def generate_complete_board():
board = [[0] * 9 for _ in range(9)]
fill_board(board)
return board

def copy_board(board):
return [row[:] for row in board]

def is_solvable(board):
def solve(board):
for i in range(9):
for j in range(9):
if board[i][j] == 0:
for num in range(1, 10):
if is_valid(board, i, j, num):
board[i][j] = num
if solve(board):
return True
board[i][j] = 0
return False
return True

return solve(copy_board(board))

def generate_puzzle(board, clues=30):


while sum(row.count(0) for row in board) < 81 - clues:
row, col = random.randint(0, 8), random.randint(0, 8)
while board[row][col] == 0:
row, col = random.randint(0, 8), random.randint(0, 8)
removed_num = board[row][col]
board[row][col] = 0
if not is_solvable(board):
board[row][col] = removed_num
return board
def generate_sudoku(clues=30):
board = generate_complete_board()
puzzle = generate_puzzle(board, clues)
return puzzle

## Soleur de sudoku ##

def print_board(board):
for row in board:
print(" ".join(str(num) if num != 0 else '.' for num in row))

def solve_sudoku(board):
def solve(board):
for i in range(9):
for j in range(9):
if board[i][j] == 0:
for num in range(1, 10):
if is_valid(board, i, j, num):
board[i][j] = num
if solve(board):
return True
board[i][j] = 0
return False
return True

solve(board)
return board

## Interface utilisateur pour jouer ##

def get_user_input():
while True:
user_input = input("Enter your move (row col num) or 'q' to quit: ").strip()
if user_input.lower() == 'q':
return None, None, None
try:
row, col, num = map(int, user_input.split())
if 1 <= row <= 9 and 1 <= col <= 9 and 1 <= num <= 9:
return row - 1, col - 1, num
else:
print("Invalid input. Row, column, and number must be between 1 and
9.")
except ValueError:
print("Invalid input format. Please enter row, column, and number
separated by spaces.")
def play_sudoku():
puzzle = generate_sudoku(clues=30)
solution = copy_board(puzzle)
solve_sudoku(solution)

while True:
print_board(puzzle)
row, col, num = get_user_input()
if row is None:
print("Thanks for playing!")
break
if puzzle[row][col] != 0:
print("This cell is already filled. Please choose another cell.")
elif not is_valid(puzzle, row, col, num):
print("Invalid move. This number cannot be placed here.")
else:
puzzle[row][col] = num
if puzzle == solution:
print("Congratulations! You have solved the Sudoku puzzle!")
break

if __name__ == "__main__":
play_sudoku()

pip install colorama tabulate

import random
from colorama import Fore, Style, init
from tabulate import tabulate

init(autoreset=True)

def is_valid(board, row, col, num):


for i in range(9):
if board[row][i] == num or board[i][col] == num:
return False

startRow, startCol = 3 * (row // 3), 3 * (col // 3)


for i in range(startRow, startRow + 3):
for j in range(startCol, startCol + 3):
if board[i][j] == num:
return False
return True

def fill_board(board):
for i in range(9):
for j in range(9):
if board[i][j] == 0:
nums = list(range(1, 10))
random.shuffle(nums)
for num in nums:
if is_valid(board, i, j, num):
board[i][j] = num
if fill_board(board):
return True
board[i][j] = 0
return False
return True

def generate_complete_board():
board = [[0] * 9 for _ in range(9)]
fill_board(board)
return board

def copy_board(board):
return [row[:] for row in board]

def is_solvable(board):
def solve(board):
for i in range(9):
for j in range(9):
if board[i][j] == 0:
for num in range(1, 10):
if is_valid(board, i, j, num):
board[i][j] = num
if solve(board):
return True
board[i][j] = 0
return False
return True

return solve(copy_board(board))

def generate_puzzle(board, clues=30):


while sum(row.count(0) for row in board) < 81 - clues:
row, col = random.randint(0, 8), random.randint(0, 8)
while board[row][col] == 0:
row, col = random.randint(0, 8), random.randint(0, 8)
removed_num = board[row][col]
board[row][col] = 0
if not is_solvable(board):
board[row][col] = removed_num
return board

def generate_sudoku(clues=30):
board = generate_complete_board()
puzzle = generate_puzzle(board, clues)
return puzzle

def print_board(board, original_board):


table = []
for i in range(9):
row = []
for j in range(9):
if original_board[i][j] == 0 and board[i][j] != 0:
row.append(Fore.GREEN + str(board[i][j]) + Style.RESET_ALL)
elif board[i][j] == 0:
row.append('.')
else:
row.append(Fore.RED + str(board[i][j]) + Style.RESET_ALL)
table.append(row)

print(tabulate(table, tablefmt="grid"))

def solve_sudoku(board):
def solve(board):
for i in range(9):
for j in range(9):
if board[i][j] == 0:
for num in range(1, 10):
if is_valid(board, i, j, num):
board[i][j] = num
if solve(board):
return True
board[i][j] = 0
return False
return True

solve(board)
return board
def get_user_input():
while True:
user_input = input("Enter your move (row col num) or 'q' to quit: ").strip()
if user_input.lower() == 'q':
return None, None, None
try:
row, col, num = map(int, user_input.split())
if 1 <= row <= 9 and 1 <= col <= 9 and 1 <= num <= 9:
return row - 1, col - 1, num
else:
print("Invalid input. Row, column, and number must be between 1 and
9.")
except ValueError:
print("Invalid input format. Please enter row, column, and number
separated by spaces.")

def play_sudoku():
puzzle = generate_sudoku(clues=30)
original_puzzle = copy_board(puzzle)
solution = copy_board(puzzle)
solve_sudoku(solution)

while True:
print_board(puzzle, original_puzzle)
row, col, num = get_user_input()
if row is None:
print("Thanks for playing!")
break
if original_puzzle[row][col] != 0:
print("This cell is already filled. Please choose another cell.")
elif not is_valid(puzzle, row, col, num):
print("Invalid move. This number cannot be placed here.")
else:
puzzle[row][col] = num
if puzzle == solution:
print("Congratulations! You have solved the Sudoku puzzle!")
break

if __name__ == "__main__":
play_sudoku()

# Bibliothèques:
# colorama pour la coloration des chiffres.
# tabulate pour afficher la grille sous forme de tableau.
# Fonctions:
# print_board: Affiche la grille avec les chiffres d'origine en rouge,
# les chiffres remplis par l'utilisateur en vert et les cases vides en blanc.
# play_sudoku:
# Gère l'interaction utilisateur, affiche la grille, et permet à l'utilisateur d'entrer
des mouvements
# avec les chiffres colorés pour mieux visualiser l'état du puzzle.
# Affichage:
# La grille est affichée sous forme de tableau avec une bordure pour une
meilleure lisibilité.
# Les chiffres d'origine sont en rouge (Fore.RED), et les chiffres entrés par
l'utilisateur sont en vert (Fore.GREEN).
# Ce programme devrait être exécuté dans un terminal qui supporte les séquences
ANSI pour les couleurs,
# comme celui intégré dans PyCharm.
# Vous pouvez lancer le programme et interagir avec la grille directement dans le
terminal de PyCharm.

Vous aimerez peut-être aussi