[编程]Python自制完整版扫雷游戏|双计时模式+音效+撒花特效(附完整源码)

2026年6月14日8:34:20 |发布: 文玑阁 |浏览:

一、项目前言

扫雷是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()

选择游戏模式.png

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)

游戏页面.png

五、游戏功能亮点总结

1. 极致完善的游戏逻辑

完全复刻原版扫雷:随机地雷、数字提示、右键插旗防误触、空白连片展开、踩雷失败、全图清空胜利。

2. 双模式计时系统

兼顾休闲游玩和竞速挑战,倒计时红色预警、时间耗尽自动失败,细节拉满。

3. 沉浸式音效体验

区分背景音乐、点击、插旗、爆炸四种音效,解决pygame不兼容mp3的问题,长短音频分类处理,运行无报错。

4. 动态视觉特效

通关彩色粒子撒花喝彩,告别单调弹窗,游戏氛围感十足。

5. 适配性极强

修复窗口按钮遮挡、鼠标坐标偏移、音频报错、边界递归越界等所有bug,代码可直接运行。

六、项目总结与学习收获

本次Python扫雷项目,不只是简单的小游戏开发,更是对Python基础知识点的综合实战:

数据结构:二维列表存储游戏地图状态

算法思维:递归算法实现连片展开、随机数生成地图

图形编程:Pygame窗口渲染、贴图、动画绘制

交互开发:鼠标事件监听、Tkinter弹窗交互

多媒体处理:背景音乐、短音效播放适配

面向对象:粒子类封装动画逻辑,代码结构清晰

项目代码注释清晰、模块化程度高,非常适合Python初学者进阶练习,也可直接作为课程设计、期末作业、个人练手项目。

七、完整源码获取

文中所有修复后的完整可运行代码(含双计时模式、撒花、音效、无bug窗口),可直接复制运行,无需二次修改,适配所有Windows Python环境。

扫雷素材

源码文件

支付宝打赏 微信打赏

« 上一篇

  • 评论:(0 )

已有 0 位网友发表了一针见血的评论,你还等什么?
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。