用python写扫雷小游戏
时间: 2023-10-16 08:07:02 浏览: 97
好的,下面是用 Python 实现的扫雷小游戏。游戏规则如下:
1. 有一个 N × N 的方格,其中有 M 个雷。
2. 玩家需要点击方格来揭示其中的内容。
3. 如果点击到了雷,游戏结束。
4. 如果点击到了数字,则表示该方格周围有多少个雷。
5. 如果点击到了空白方格,则表示该方格周围没有雷,需要继续揭示周围的方格。
6. 游戏结束条件:所有非雷方格都被揭示,或者点击到了雷。
下面是代码实现:
```python
import random
class Minesweeper:
def __init__(self, n=10, m=10):
self.n = n # 方格的行数
self.m = m # 方格的列数
self.board = [[0] * m for _ in range(n)] # 初始化方格
self.mask = [['X'] * m for _ in range(n)] # 初始化掩码
self.bombs = set() # 保存雷的位置
self.gameover = False # 是否结束游戏
def place_bombs(self, row, col):
# 随机放置 M 个雷,但不包括第一次点击的位置
candidates = [(i, j) for i in range(self.n) for j in range(self.m) if (i, j) != (row, col)]
self.bombs = set(random.sample(candidates, self.m))
# 在方格中标记出雷
for i, j in self.bombs:
self.board[i][j] = -1
# 计算每个方格周围的雷的数量
for i in range(self.n):
for j in range(self.m):
if self.board[i][j] == -1:
continue
count = 0
for di in [-1, 0, 1]:
for dj in [-1, 0, 1]:
ni = i + di
nj = j + dj
if 0 <= ni < self.n and 0 <= nj < self.m and self.board[ni][nj] == -1:
count += 1
self.board[i][j] = count
def click(self, row, col):
if (row, col) in self.bombs:
# 点到了雷,游戏结束
self.mask[row][col] = '*'
self.gameover = True
elif self.board[row][col] == 0:
# 点到了空白方格,需要继续揭示周围的方格
self.mask[row][col] = ' '
for di in [-1, 0, 1]:
for dj in [-1, 0, 1]:
ni = row + di
nj = col + dj
if 0 <= ni < self.n and 0 <= nj < self.m and self.mask[ni][nj] == 'X':
self.click(ni, nj)
else:
# 点到了数字方格,直接揭示
self.mask[row][col] = str(self.board[row][col])
def show(self):
# 打印当前的状态
print(' ', end=' ')
for j in range(self.m):
print(j, end=' ')
print()
for i in range(self.n):
print(i, end=' ')
for j in range(self.m):
print(self.mask[i][j], end=' ')
print()
def play(self):
row, col = 0, 0
while True:
self.show()
if self.gameover:
print('Game over!')
break
if all(self.mask[i][j] != 'X' for i in range(self.n) for j in range(self.m)):
print('You win!')
break
row, col = map(int, input('Please input your move (row, col): ').split())
if not (0 <= row < self.n and 0 <= col < self.m and self.mask[row][col] == 'X'):
print('Invalid move!')
continue
if not self.bombs:
self.place_bombs(row, col)
self.click(row, col)
```
使用示例:
```python
game = Minesweeper()
game.play()
```
这个实现比较简单,没有做太多的优化,也没有实现 GUI 界面,但是足以演示扫雷游戏的基本逻辑。
阅读全文