用python写一个数独游戏
时间: 2024-05-01 22:21:27 浏览: 94
好的,下面是一个简单的数独游戏的 Python 实现。代码中使用了回溯算法来解决数独谜题。
```python
board = [
[0, 6, 0, 0, 0, 0, 0, 9, 0],
[0, 0, 0, 7, 0, 0, 0, 0, 0],
[0, 0, 0, 4, 3, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 4, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0]
]
def print_board(board):
for i in range(len(board)):
if i % 3 == 0 and i != 0:
print("- - - - - - - - - - - ")
for j in range(len(board[0])):
if j % 3 == 0 and j != 0:
print("| ", end="")
if j == 8:
print(board[i][j])
else:
print(str(board[i][j]) + " ", end="")
def find_empty(board):
for i in range(len(board)):
for j in range(len(board[0])):
if board[i][j] == 0:
return (i, j)
return None
def is_valid(board, num, pos):
# Check row
for i in range(len(board[0])):
if board[pos[0]][i] == num and pos[1] != i:
return False
# Check column
for i in range(len(board)):
if board[i][pos[1]] == num and pos[0] != i:
return False
# Check box
box_x = pos[1] // 3
box_y = pos[0] // 3
for i in range(box_y*3, box_y*3 + 3):
for j in range(box_x * 3, box_x*3 + 3):
if board[i][j] == num and (i,j) != pos:
return False
return True
def solve(board):
find = find_empty(board)
if not find:
return True
else:
row, col = find
for i in range(1,10):
if is_valid(board, i, (row, col)):
board[row][col] = i
if solve(board):
return True
board[row][col] = 0
return False
print_board(board)
solve(board)
print("_________________________")
print_board(board)
```
在这个实现中,我们首先定义了一个包含数独谜题的二维列表。然后我们定义了用于打印数独的函数 `print_board()`,以及用于查找下一个空格的函数 `find_empty()`。接下来,我们定义了一个用于检查给定数字是否在当前位置有效的函数 `is_valid()`。最后,我们使用回溯算法来解决数独谜题的函数 `solve()`。
在 `solve()` 函数中,我们首先使用 `find_empty()` 函数查找下一个空格。如果没有空格,说明我们已经成功解决了数独谜题,返回 `True`。否则,我们枚举数字 1-9 并尝试将数填入当前空格中。如果填入的数字在当前位置有效,我们使用递归调用 `solve()` 函数来继续填下一个空格。如果递归调用返回 `True`,说明我们已经成功完成了数独谜题,直接返回 `True`。否则,我们将当前空格的值重置为 0 并继续尝试其他数字。
最后,我们使用 `print_board()` 函数打印出原始的数独谜题和解决方案。
阅读全文