需求:
- 玩家可以选择游戏难度,即雷区大小和地雷数量。
- 玩家可以通过点击格子来打开格子,如果格子上有地雷,则游戏结束;如果格子没有地雷,则显示周围八个格子的地雷数。
- 玩家可以通过右键标记地雷,如果标记正确,则该格子会显示为红色。
- 玩家可以通过双击打开周围八个格子,如果周围八个格子都没有地雷,则会自动打开所有安全格子。
代码示例:
Python
import random
class Minesweeper():
def __init__(self, width, height, mines):
"""初始化游戏
Args:
width: 雷区宽度
height: 雷区高度
mines: 地雷数量
Returns:
None
"""
self.width = width
self.height = height
self.mines = mines
# 初始化雷区
self.board = [[0 for _ in range(width)] for _ in range(height)]
# 布雷
self.plant_mines()
# 初始化游戏状态
self.game_over = False
self.win = False
def plant_mines(self):
"""布雷
Args:
None
Returns:
None
"""
# 随机生成地雷位置
mine_positions = random.sample([(i, j) for i in range(self.height) for j in range(self.width)], self.mines)
# 将地雷位置标记为 1
for i, j in mine_positions:
self.board[i][j] = 1
def open_cell(self, i, j):
"""打开格子
Args:
i: 格子的行号
j: 格子的列号
Returns:
None
"""
# 如果游戏结束,则不执行任何操作
if self.game_over or self.win:
return
# 如果格子已经被打开,则不执行任何操作
if self.board[i][j] != 0:
return
# 如果格子是地雷,则游戏结束
if self.board[i][j] == 1:
self.game_over = True
print("游戏结束!")
return
# 递归打开周围八个格子
self.open_around_cells(i, j)
# 判断是否胜利
if self.check_win():
self.win = True
print("恭喜你,你赢了!")
def open_around_cells(self, i, j):
"""递归打开周围八个格子
Args:
i: 格子的行号
j: 格子的列号
Returns:
None
"""
# 遍历周围八个格子
for di in range(-1, 2):
for dj in range(-1, 2):
# 判断格子是否越界
if 0 <= i + di < self.height and 0 <= j + dj < self.width:
# 如果格子没有被打开,则递归打开
if self.board[i + di][j + dj] == 0:
self.board[i + di][j + dj] = -1
self.open_around_cells(i + di, j + dj)
def check_win(self):
"""判断是否胜利
Args:
None
Returns:
True if win, False otherwise
"""
# 遍历所有格子
for i in range(self.height):
for j in range(self.width):
# 如果格子是地雷,且没有被标记,则游戏未结束
if self.board[i][j] == 1 and not self.is_cell_flagged(i, j):
return False
# 所有格子都已打开或标记,则游戏胜利
return True
def is_cell_flagged(self, i, j):
"""判断格子是否被标记
Args:
i: 格子的行号
j: 格子的列号
Returns:
True if flagged, False otherwise
"""
# TODO: 实现格子标记功能
return False
def print_board(self):
"""打印雷区
Args:
None
Returns:
None
"""
for i