- 正文
- 点这评论:( 0人参与)
-
一、项目前言
扫雷是Windows经典休闲小游戏,也是非常适合Python初学者练手的图形界面游戏项目。相比简单的控制台程序,本次我们使用 Pygame 开发可视化扫雷游戏,全程面向对象+模块化编程。
本次开发的扫雷游戏不仅仅是基础开格子、插旗、地雷判定,还新增了两大特色功能,完全媲美成品小游戏:
双游戏模式:正计时(记录通关用时)/ 倒计时(限时挑战)自由切换
全套音效系统:背景音乐、插旗音效、点击音效、踩雷爆炸音效
胜利撒花粒子特效:通关自动彩色粒子飘落喝彩
完整游戏逻辑:递归空白展开、地雷随机生成、胜负判定、游戏重试/退出
人性化UI:顶部计时栏、倒计时不足30秒红字预警、弹窗提示
适合Python初学者学习:图形化编程、游戏逻辑、递归算法、粒子动画、音频播放、GUI弹窗交互。
二、开发环境与素材准备
1. 依赖库安装
本项目基于 pygame-ce (适用python 3.14以上版本,3.12及以下版本安装pygame)新版游戏库,执行安装命令:
pip install pygame-ce
2. 项目文件结构
需要提前准备图片素材和音效素材,目录结构如下:
saolei/ ├─ saolei.py # 主程序代码 ├─ 扫雷素材/ # 游戏格子图片(0-11.png) └─ 扫雷素材/ ├─ start.mp3 # 背景音乐 ├─ click.wav # 插旗音效 ├─ rightClick.wav # 普通点击音效 └─ zero.wav # 踩雷爆炸音效
三、整体开发思路与核心原理
1. 游戏地图设计
我们使用二维列表存储游戏地图数据,通过数值区分格子状态:
200:地雷格子
100-108:未翻开的空白/数字格子
0-8:已翻开的数字格子(代表周围地雷数)
10200:插旗标记的地雷
-1:已触发的地雷
2. 核心算法:递归展开空白格子
扫雷最核心的功能就是点击空白格自动连片展开,这里使用递归算法实现:
当点击无雷空白格时,自动遍历周围8格,若依旧是空白格则继续递归展开,遇到数字格停止递归,完美还原原版扫雷效果。
3. 双计时模式原理
正计时模式:游戏开始从零秒累加,通关展示总用时,无时间压力,适合休闲游玩
倒计时模式:固定180秒限时,剩余30秒文字变红预警,时间耗尽直接判定游戏失败,适合挑战速通
4. 粒子撒花特效
自定义粒子类,通关瞬间生成大量彩色粒子,模拟重力下落、自由飘散、生命周期消失,实现动态喝彩效果。
四、核心功能代码详解
1. 游戏模式选择界面
使用Tkinter制作启动选择窗口,采用Grid布局,彻底解决按钮被遮挡、无法点击的问题,自适应窗口大小:
def select_game_mode(): root = tk.Tk() root.title("选择游戏模式") root.resizable(False, False) root.minsize(320, 150) mode = tk.IntVar(value=0) tk.Label(root, text="请选择游戏模式:", font=("simhei", 12)).grid(row=0, column=0, columnspan=2, pady=10) tk.Radiobutton(root, text="计时模式(记录通关用时)", variable=mode, value=0).grid(row=1, column=0, sticky="w", padx=20) tk.Radiobutton(root, text="倒计时模式(限时挑战180秒)", variable=mode, value=1).grid(row=2, column=0, sticky="w", padx=20) def confirm(): root.destroy() tk.Button(root, text="开始游戏", command=confirm, width=12).grid(row=3, column=0, columnspan=2, pady=15) root.update_idletasks() root.geometry("") root.mainloop() return mode.get()
2. 地雷地图生成逻辑
随机生成地雷,遍历地图计算每个格子周围地雷数量,赋值到二维数组,为后续渲染做铺垫:
def reset_game(): global map_data, game_over, game_win, particles, time_start, current_time game_over = False game_win = False particles.clear() current_time = 0 time_start = pygame.time.get_ticks() map_data = [[0 for _ in range(COL + 2)] for _ in range(ROW + 2)] # 随机布置地雷 count = 0 while count < NUM: r = random.randint(1, ROW) c = random.randint(1, COL) if map_data[r][c] != 200: map_data[r][c] = 200 count += 1 # 计算周围地雷数量 for i in range(1, ROW + 1): for j in range(1, COL + 1): if map_data[i][j] != 200: mine_num = 0 for m in range(i - 1, i + 2): for n in range(j - 1, j + 2): if map_data[m][n] == 200: mine_num += 1 map_data[i][j] = mine_num + 100
3. 递归空白格子展开
def open_zero(row, col): map_data[row][col] -= 100 for i in range(row - 1, row + 2): for j in range(col - 1, col + 2): if 1 <= i <= ROW and 1 <= j <= COL: if 99 <= map_data[i][j] <= 108: if map_data[i][j] == 100: open_zero(i, j) else: map_data[i][j] -= 100
4. 游戏胜利判定
遍历所有格子,无未翻开普通格子即为通关成功:
def check_win(): for i in range(1, ROW + 1): for j in range(1, COL + 1): val = map_data[i][j] if 99 <= val <= 108: return False return True
5. 粒子撒花特效类
实现粒子生成、重力下落、生命周期销毁,通关触发全屏撒花:
class Particle: def __init__(self, x, y): self.x = x self.y = y self.vx = random.randint(-4, 4) self.vy = random.randint(-6, -2) self.radius = random.randint(3, 7) self.color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) self.life = 60 def update(self): self.x += self.vx self.y += self.vy self.vy += 0.2 self.life -= 1 def draw(self, surf): pygame.draw.circle(surf, self.color, (int(self.x), int(self.y)), self.radius)

五、游戏功能亮点总结
1. 极致完善的游戏逻辑
完全复刻原版扫雷:随机地雷、数字提示、右键插旗防误触、空白连片展开、踩雷失败、全图清空胜利。
2. 双模式计时系统
兼顾休闲游玩和竞速挑战,倒计时红色预警、时间耗尽自动失败,细节拉满。
3. 沉浸式音效体验
区分背景音乐、点击、插旗、爆炸四种音效,解决pygame不兼容mp3的问题,长短音频分类处理,运行无报错。
4. 动态视觉特效
通关彩色粒子撒花喝彩,告别单调弹窗,游戏氛围感十足。
5. 适配性极强
修复窗口按钮遮挡、鼠标坐标偏移、音频报错、边界递归越界等所有bug,代码可直接运行。
六、项目总结与学习收获
本次Python扫雷项目,不只是简单的小游戏开发,更是对Python基础知识点的综合实战:
数据结构:二维列表存储游戏地图状态
算法思维:递归算法实现连片展开、随机数生成地图
图形编程:Pygame窗口渲染、贴图、动画绘制
交互开发:鼠标事件监听、Tkinter弹窗交互
多媒体处理:背景音乐、短音效播放适配
面向对象:粒子类封装动画逻辑,代码结构清晰
项目代码注释清晰、模块化程度高,非常适合Python初学者进阶练习,也可直接作为课程设计、期末作业、个人练手项目。
七、完整源码获取
文中所有修复后的完整可运行代码(含双计时模式、撒花、音效、无bug窗口),可直接复制运行,无需二次修改,适配所有Windows Python环境。
已有 0 位网友发表了一针见血的评论,你还等什么?【相关文章】
- 2026-6-10 22:35:46AI人物绘画提示词写作指南:告别网红脸,写出有辨识度的真人质感画面
- 2026-6-10 0:12:45用8张图了解算力网产业链
- 2026-6-4 8:57:55导出微信聊天记录的方法
- 2026-6-2 18:29:53python搭建网站访问异常监测脚本方案
- 2025-4-2 10:35:8[技能亲测]批量调整Word文档中的图片大小
- 2025-3-13 10:36:12[技能]电脑蓝屏0x00000024原因和解决办法
- 2023-1-31 10:15:12[技能]如何编辑被保护的word?
- 2022-3-24 9:59:47excel 如何用单元格的内容 引用同名工作表并调用计数?
支付宝打赏
微信打赏