一、核心功能
- 随机雷区生成
- 棋盘由方格构成
- 首次点击的格子必为空,无雷且自动展开安全区域
- 数字提示系统
- 点击空白方格后,显示数字表示周围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 = 30self.width = self.cols * self.cell_sizeself.height = self.rows * self.cell_size + 60self.grid = []self.game_over = Falseself.victory = Falseself.flags = self.mine_countself.init_grid()
下面布置雷区,使用random.sample确保地雷位置随机且不重复,地雷数量由难度设置决定。并实现安全首次点击:确保玩家第一次点击的位置及其周围8个格子都没有地雷,避免第一次就踩到地雷的情况。3x3安全区域:使用双重循环遍历(-1,0,1)创建3x3的安全区域,检查边界确保安全区域不超出游戏板。初始化完成标记:设置mines_generated标志表示地雷已生成,计算每个格子周围的地雷数量。
格子不同状态显示
未翻开:灰色背景
已翻开:浅灰色背景
踩雷:红色背景
标记:旗子或问号
def generate_mines(self, safe_pos):"""生成地雷(避开安全位置周围3x3区域)"""safe_row, safe_col = safe_posexclude = set()for dr in (-1,0,1):for dc in (-1,0,1):r = safe_row + drc = safe_col + dcif 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'] = Trueself.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_sizey = 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(