基于python写一个数独游戏
时间: 2023-07-04 09:06:50 浏览: 119
好的,以下是一个简单的数独游戏实现:
```python
import random
# 生成一个新的数独盘面
def new_board():
# 首先生成一个空白的9x9数独盘面
board = [[0 for x in range(9)] for y in range(9)]
# 然后填充每一行
for i in range(9):
# 每一行从1-9中选择一个随机数填充
nums = random.sample(range(1, 10), 9)
for j in range(9):
board[i][j] = nums[j]
# 然后挖去一些格子,留作玩家填充
squares_to_remove = random.randint(40, 50)
for i in range(squares_to_remove):
x = random.randint(0, 8)
y = random.randint(0, 8)
board[x][y] = 0
return board
# 检查一个数是否可以填入数独盘面中的某个位置
def is_valid_move(board, x, y, num):
# 检查行和列
for i in range(9):
if board[x][i] == num:
return False
if board[i][y] == num:
return False
# 检查九宫格
square_x = (x // 3) * 3
square_y = (y // 3) * 3
for i in range(square_x, square_x + 3):
for j in range(square_y, square_y + 3):
if board[i][j] == num:
return False
# 如果通过了上述所有检查,那么这个数是合法的
return True
# 用递归的方式解决数独盘面
def solve_board(board):
# 首先找到下一个空白格子
for x in range(9):
for y in range(9):
if board[x][y] == 0:
# 然后尝试对这个格子填充1-9中的每一个数
for num in range(1, 10):
# 如果这个数是合法的,那么填充这个格子并递归解决剩下的盘面
if is_valid_move(board, x, y, num):
board[x][y] = num
if solve_board(board):
return True
# 如果递归解决剩下的盘面失败了,那么将这个格子还原为空白
board[x][y] = 0
# 如果1-9中的所有数都无法填入这个格子,那么返回False
return False
# 如果所有格子都已经填满了,那么返回True
return True
# 打印数独盘面
def print_board(board):
for i in range(9):
for j in range(9):
print(board[i][j], end=" ")
if j == 2 or j == 5:
print("|", end=" ")
print()
if i == 2 or i == 5:
print("------+-------+------")
# 主程序
board = new_board()
print("数独盘面:")
print_board(board)
if solve_board(board):
print("解决方案:")
print_board(board)
else:
print("无解!")
```
这个程序会生成一个随机的数独盘面,然后挖去一些格子留作玩家填充。玩家填完之后,程序会自动解决数独盘面并输出解决方案。
阅读全文