Générateur et Solveur Sudoku Python
Thèmes abordés
Générateur et Solveur Sudoku Python
Thèmes abordés
import random
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_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
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))
## 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
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()
import random
from colorama import Fore, Style, init
from tabulate import tabulate
init(autoreset=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_sudoku(clues=30):
board = generate_complete_board()
puzzle = generate_puzzle(board, clues)
return puzzle
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.