一、项目概述

贪吃蛇游戏 是一款使用 Pygame 构建的赛博朋克风格贪吃蛇。支持三种关卡模式(实体墙壁、穿越、挡墙关卡)、三种食物类型、炸弹系统、连击系统、等级系统、20 个成就、本地排行榜、程序化音频与响应式 UI,功能完整且体验丰富。

运行环境:Python 3.7+ / Pygame 2.0+
打包方式:PyInstaller 单文件 EXE(约 27 MB)
代码仓库:gitee.com/hueimelly/eatingsnake_py
• • •

二、功能特性

特性说明
三种关卡模式实体墙壁(经典)、穿越(边界环绕)、挡墙关卡(随机生成内部墙壁)
三种食物类型普通食物(红色苹果)、金色食物(金色五角星,30分)、加速食物(蓝色闪电,3秒加速)
炸弹系统红色闪烁炸弹,碰触后蛇身缩短、扣分、连击归零
连击系统连续吃食物累积连击数,碰炸弹归零
等级系统每吃 5 个食物升 1 级,速度递增
成就系统20 个成就,涵盖分数、长度、连击、挑战等类别
本地排行榜保存前 10 名最高分记录
程序化音频所有音效和背景音乐均由代码实时生成,无需外部音频文件
响应式 UI自适应窗口大小,支持窗口拖拽缩放
赛博朋克视觉深色背景、霓虹绿蛇、网格线、动态星星粒子效果
屏幕震动碰炸弹时屏幕震动反馈
三档难度简单 / 普通 / 困难,影响速度、食物和炸弹数量
• • •

三、快速开始

环境要求

安装与运行

# 1. 克隆项目
git clone https://gitee.com/hueimelly/eatingsnake_py.git
cd eatingsnake_py

# 2. 安装依赖
pip install pygame

# 3. 运行游戏
python main.pyBash

一键打包 EXE

# 直接运行打包脚本(会自动安装 pyinstaller)
python build.pyBash

打包后的 SnakeGame.exe 位于 dist/ 目录,可独立运行。

• • •

四、操作指南

按键功能
↑ ↓ ← →控制蛇的移动方向
P暂停 / 继续游戏
Esc暂停时回到主菜单
Enter确认选择
鼠标点击菜单按钮
• • •

五、游戏系统详解

5.1 三档难度

DIFFICULTY = {
    'easy':   {'base_speed': 6,  'speed_increment': 0.3, 'bomb_count': 2,  'food_count': 8},
    'normal': {'base_speed': 8,  'speed_increment': 0.5, 'bomb_count': 3,  'food_count': 10},
    'hard':   {'base_speed': 10, 'speed_increment': 0.7, 'bomb_count': 5,  'food_count': 12},
}Python

5.2 三种关卡模式

模式说明边界行为
normal(实体墙壁)经典贪吃蛇,边界撞墙死亡撞墙即死
wrap(穿越)蛇从一侧穿出,从对侧穿入坐标环绕
wall(挡墙关卡)网格内有随机生成的内部墙壁撞墙即死

5.3 挡墙关卡生成算法

挡墙关卡使用 BFS 连通性验证 + 死胡同移除 算法生成:随机放置墙壁段(8%~16% 覆盖率)→ BFS 验证地图可通行 → 移除死胡同改善可玩性。

5.4 成就系统(20 个成就)

01初次尝试
02得分高手
03巨蟒
04连击之王
05困难征服者
06完美之旅
07贪吃达人
08穿越爱好者
09挡墙挑战者
10不败神话

5.5 程序化音频系统

所有音效和背景音乐均由代码实时生成(正弦波合成 + ADSR 包络),无需任何外部音频文件:

def generate_eat_sound():
    """吃食物 - 清脆悦耳的叮咚双音"""
    n1 = _make_sine_with_harmonics(880, 0.08, amp=0.35)
    n2 = _make_sine_with_harmonics(1108, 0.10, amp=0.30)
    gap = [0] * int(SAMPLE_RATE * 0.02)
    samples = n1 + gap + n2
    return _apply_envelope(samples, attack=0.008, decay=0.06,
                           sustain=0.15, release=0.06)

def generate_bgm():
    """生成无缝循环背景音乐"""
    # 和弦进行:Am - F - C - G
    # 三层叠加:低频铺垫 + 低音线 + 高八度琶音
    chord_progression = [
        ([220.0, 261.6, 329.6], [110.0], 1.5),   # Am
        ([174.6, 220.0, 261.6], [87.3], 1.5),     # F
        ([261.6, 329.6, 392.0], [130.8], 1.5),    # C
        ([196.0, 246.9, 294.0], [98.0], 1.5),     # G
    ]
    # ... 琶音分解 + 交叉淡入淡出保证无缝循环 ...Python

5.6 蛇的渲染系统

蛇使用圆形段拼接 + 渐变颜色 + 锥形尾 + 三角头的设计,从蛇头到蛇尾颜色线性渐变(头亮绿 → 尾暗绿),视觉效果统一且流畅。

5.7 响应式缩放

游戏 UI 支持窗口缩放,所有元素坐标使用缩放函数计算。基准分辨率为 1500×800,自适应任意窗口大小。

• • •

六、项目结构

eating_snake/
├── core/                      # 核心游戏逻辑
│   ├── __init__.py
│   ├── config.py              # 配置常量:窗口、颜色、难度、缩放
│   ├── entities.py            # 实体模块:Snake、Food、Bomb、Particle
│   ├── game_state.py          # 游戏状态管理器:UI、事件、状态切换
│   └── level.py               # 关卡系统:LevelManager、WallMap、WallMapGenerator
│
├── systems/                   # 游戏系统
│   ├── __init__.py
│   ├── achievements.py        # 成就系统:20个成就 + 持久化
│   ├── audio.py               # 音频系统:程序化生成音效 + BGM
│   └── help_data.py           # 玩法说明与帮助文档
│
├── ui/                        # UI 与渲染
│   ├── __init__.py
│   └── renderer.py            # 渲染引擎 + 字体管理系统
│
├── tests/                     # 单元测试
│   ├── test_config.py
│   ├── test_level.py
│   └── test_snake.py
│
├── main.py                    # 游戏入口
├── build.py                   # PyInstaller 打包脚本
├── build.bat                  # Windows 一键打包批处理
└── README.mdText
• • •

七、核心代码解析

7.1 主循环

def main():
    pygame.init()
    screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT),
                                      pygame.RESIZABLE)
    game = GameState(screen)
    game.run()Python

7.2 游戏状态机

游戏有 7 种状态,通过 self.state 管理切换:menuplayingpausedgame_oversettingshelpachievements_viewhigh_scores

7.3 蛇的实体控制

class Snake:
    def __init__(self):
        self.blocks = [[start_x, start_y],
                       [start_x-1, start_y],
                       [start_x-2, start_y]]
        self.direction = [1, 0]  # 初始向右
        self.alive = True

    def move(self, level_type='normal'):
        self.direction = self.next_direction[:]
        new_head = [self.head[0] + self.direction[0],
                    self.head[1] + self.direction[1]]
        # wrap 模式:坐标环绕
        if level_type == 'wrap':
            new_head[0] %= GRID_WIDTH
            new_head[1] %= GRID_HEIGHT
        # 边界碰撞检测
        elif not (0 <= new_head[0] < GRID_WIDTH and
                  0 <= new_head[1] < GRID_HEIGHT):
            self.alive = False; return False
        # 自碰检测
        if new_head in self.blocks[:-1]:
            self.alive = False; return False
        self.blocks.insert(0, new_head)
        if not self.growing: self.blocks.pop()
        else: self.growing = False
        return TruePython

7.4 跨平台字体系统

自动检测系统可用中文字体,支持多层回退链(Windows/macOS/Linux),兼容 Pygame 2.6.1 已知 bug。

• • •

八、打包为 EXE

使用 PyInstaller 打包为单文件 EXE:

# 方式一:运行打包脚本
python build.py

# 方式二:双击 build.batBash
args = [
    '--onefile',         # 单文件打包
    '--windowed',        # 无控制台窗口
    '--name', 'SnakeGame',
    '--clean',
    '--noconfirm',
    '--hidden-import', 'pygame',
    '--hidden-import', 'pygame.font',
    '--hidden-import', 'pygame.mixer',
    *add_data_args,
    'main.py',
]Python

打包后 dist/SnakeGame.exe27 MB,可复制到任意 Windows 电脑独立运行。