一、核心功能
- 随机雷区生成
- 棋盘由方格构成
- 首次点击的格子必为空,无雷且自动展开安全区域
- 数字提示系统
- 点击空白方格后,显示数字表示周围8个相邻格子中的地雷数量
- 无雷自动翻开所有相邻安全区域
- 标记与探测
- 左键单击:翻开格子(若翻开地雷则游戏失败)
- 右键单击:标记红旗(疑似地雷)、问号(不确定)
- 双击已显示数字的格子:自动翻开周围未标记的格子(当标记数与提示数匹配时)
二、玩法规则
游戏目标
以最短时间翻开所有非雷格子,并正确标记所有地雷的位置。
操作逻辑
-
开局策略
- 优先点击棋盘中心或边界,快速展开大面积安全区域
- 利用首个展开区域的数字推断周围雷分布
示例: 若点击后显示数字3 → 相邻8格中有3颗雷
-
推理与排除
- 矛盾排查:当两格数字重叠区域存在不同雷数需求,结合两者推导雷的位置
- 连锁反应:展开无雷区域后生成的新数字需与前序推导逻辑一致
示例:
1 1 1 █ █ 2 ← 外围已标记1颗雷 → 剩余1雷在右下两格中
-
决胜关键
- 概率博弈:后期可能存在无法100%推断的雷区,需依赖逻辑排除后的最小风险选择
- 路径记忆:追踪已排除区域的标记状态,避免重复操作
三、胜利与失败判定
-
成功条件
- 所有非雷格子均被翻开
- 所有地雷位置正确标记(红旗数量与雷数严格一致)
-
失败条件
- 误触地雷(立即终止游戏)
- 错误标记超过实际雷数且无法纠正时系统判定逻辑漏洞
首先,游戏定义了扫雷游戏的难度切换功能,在初始化时设置难度:
DIFFICULTIES = {
'beginner': (9, 9, 10),
'intermediate': (16, 16, 40),
'expert': (30, 16, 99)
}
def __init__(self, difficulty='beginner'):
self.current_difficulty = difficulty # 添加当前难度属性
self.rows, self.cols, self.mine_count = DIFFICULTIES[difficulty]
self.cell_size = 30
self.width = self.cols * self.cell_size
self.height = self.rows * self.cell_size + 60
self.grid = []
self.game_over = False
self.victory = False
self.flags = self.mine_count
self.init_grid()
下面布置雷区,使用random.sample确保地雷位置随机且不重复,地雷数量由难度设置决定。并实现安全首次点击:确保玩家第一次点击的位置及其周围8个格子都没有地雷,避免第一次就踩到地雷的情况。3x3安全区域:使用双重循环遍历(-1,0,1)创建3x3的安全区域,检查边界确保安全区域不超出游戏板。初始化完成标记:设置mines_generated标志表示地雷已生成,计算每个格子周围的地雷数量。
格子不同状态显示
未翻开:灰色背景
已翻开:浅灰色背景
踩雷:红色背景
标记:旗子或问号
def generate_mines(self, safe_pos):
"""生成地雷(避开安全位置周围3x3区域)"""
safe_row, safe_col = safe_pos
exclude = set()
for dr in (-1,0,1):
for dc in (-1,0,1):
r = safe_row + dr
c = safe_col + dc
if 0 <= r < self.rows and 0 <= c < self.cols:
exclude.add((r,c))
candidates = [(r,c) for r in range(self.rows) for c in range(self.cols)
if (r,c) not in exclude]
mines = random.sample(candidates, self.mine_count)
for r, c in mines:
self.grid[r][c]['mine'] = True
self.calculate_neighbors()
self.mines_generated = True
下面一次绘制背景层、格子层、内容层(数字/地雷/标记)和状态栏层。
首先主界面背景:
def draw(self, screen):
screen.fill(COLORS['bg']) # 填充背景色
# 绘制雷区
for r in range(self.rows):
for c in range(self.cols):
self.draw_cell(screen, r, c)
# 绘制状态栏
self.draw_status(screen)
pygame.display.flip() # 更新显示
单元格绘制 draw_cell():
def draw_cell(self, screen, row, col):
cell = self.grid[row][col]
x = col * self.cell_size
y = row * self.cell_size + 60 # 顶部60像素留给状态栏
# 设置背景色
color = COLORS['revealed'] if cell['revealed'] else COLORS['hidden']
if self.game_over and cell['mine']:
color = (255,0,0) # 踩雷格子显示红色
# 绘制格子和边框
pygame.draw.rect(screen, color, (x, y, self.cell_size, self.cell_size))
pygame.draw.rect(screen, COLORS['grid'], (x, y, self.cell_size, self.cell_size), 1)
地雷绘制 draw_mine():
def draw_mine(self, screen, x, y):
# 绘制一个黑色圆形表示地雷
pygame.draw.circle(