贪吃蛇游戏 是一款使用 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
# 直接运行打包脚本(会自动安装 pyinstaller)
python build.pyBash
打包后的 SnakeGame.exe 位于 dist/ 目录,可独立运行。
| 按键 | 功能 |
|---|---|
↑ ↓ ← → | 控制蛇的移动方向 |
P | 暂停 / 继续游戏 |
Esc | 暂停时回到主菜单 |
Enter | 确认选择 |
| 鼠标 | 点击菜单按钮 |
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
| 模式 | 说明 | 边界行为 |
|---|---|---|
normal(实体墙壁) | 经典贪吃蛇,边界撞墙死亡 | 撞墙即死 |
wrap(穿越) | 蛇从一侧穿出,从对侧穿入 | 坐标环绕 |
wall(挡墙关卡) | 网格内有随机生成的内部墙壁 | 撞墙即死 |
挡墙关卡使用 BFS 连通性验证 + 死胡同移除 算法生成:随机放置墙壁段(8%~16% 覆盖率)→ BFS 验证地图可通行 → 移除死胡同改善可玩性。
所有音效和背景音乐均由代码实时生成(正弦波合成 + 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
蛇使用圆形段拼接 + 渐变颜色 + 锥形尾 + 三角头的设计,从蛇头到蛇尾颜色线性渐变(头亮绿 → 尾暗绿),视觉效果统一且流畅。
游戏 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
def main():
pygame.init()
screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT),
pygame.RESIZABLE)
game = GameState(screen)
game.run()Python
游戏有 7 种状态,通过 self.state 管理切换:menu → playing → paused → game_over → settings → help → achievements_view → high_scores。
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
自动检测系统可用中文字体,支持多层回退链(Windows/macOS/Linux),兼容 Pygame 2.6.1 已知 bug。
使用 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.exe 约 27 MB,可复制到任意 Windows 电脑独立运行。