贪吃蛇增强版 - 答辩报告
🎯 项目概述
项目背景
贪吃蛇是一款经典的电子游戏,自1976年诞生以来广受欢迎。本项目在传统贪吃蛇游戏的基础上,增加了多种创新元素,形成了 “加速扩张&当心炸弹” 的独特游戏体验。
开发环境
| 项目 | 说明 |
|---|---|
| 开发语言 | C语言 |
| 编译器 | GCC 9.4.0 |
| 开发工具 | DEV-C++ |
| 操作系统 | Windows 11 家庭版 |
| 图形库 | Windows Console API |
| 版本控制 | Git |
🎮 游戏规则详解
基本规则
游戏目标
玩家控制一条不断移动的蛇,在封闭的游戏区域内:
- 通过吃掉随机出现的食物获得分数
- 每吃一个食物,蛇身增长一节,得分增加10分
- 避免撞到墙壁、自己的身体或移动的炸弹
- 尽可能获得更高的分数
控制方式
| 按键 | 功能 |
|---|---|
| W | 向上移动 |
| S | 向下移动 |
| A | 向左移动 |
| D | 向右移动 |
| Q | 退出游戏 |
重要提示:蛇不能直接反向移动!例如,当蛇向右移动时,不能直接按A键向左移动。
游戏元素说明
视觉元素
- 蛇头:■(绿色实心方块)
- 蛇身:□(绿色空心方块)
- 食物:●(红色实心圆)
- 炸弹:B(黄色字母)
- 边界:+ - |(青色线条)
游戏机制
- 移动机制:蛇按当前方向自动移动,玩家通过按键改变方向
- 成长机制:每吃一个食物,蛇身增加一节,得分增加10分
- 速度机制:游戏速度随时间逐渐加快,增加挑战性
- 炸弹机制:随机生成的炸弹在场内移动,增加游戏难度
死亡判定
当发生以下情况时,游戏结束:
- 🚫 撞墙死亡:蛇头撞到场地边界
- 🔄 自噬死亡:蛇头撞到自己的身体
- 💥 炸弹爆炸:蛇头撞到移动的炸弹
✨ 自定义新规则:“加速扩张&当心炸弹”
规则概述
在传统贪吃蛇基础上,引入动态速度递增与移动炸弹威胁两大机制,形成高强度对抗体验。
加速扩张机制
- 游戏启动后,每经过50个游戏周期(约10秒),全局速度提升一次
- 每次速度提升减少5ms帧间隔,下限为50ms
- 随着速度加快,蛇身扩张节奏被迫提速,操作容错率持续下降
移动炸弹机制
- 炸弹以字母B标识,亮黄色显示,每5帧随机改变方向并移动一格
- 生成规则:当场无炸弹时,每帧有1/30概率在空地生成一枚炸弹
- 碰撞判定:蛇头一旦撞到炸弹,立即触发”炸弹爆炸”死亡
- 清除方式:当蛇吃到普通食物时,有1/3概率清除当前炸弹(奖励式减压)
关键常量与变量
// 速度控制int gameSpeed; // 当前帧间隔(ms)int speedIncreaseTimer; // 已运行周期计数#define SPEED_INCREASE_INTERVAL 50#define MIN_GAME_SPEED 50
// 炸弹控制int bombX, bombY; // 炸弹坐标int bombActive; // 是否在场int bombDirection; // 当前方向int bombMoveTimer; // 移动计数器#define BOMB_MOVE_INTERVAL 5#define BOMB_SPAWN_CHANCE 30 // 分母核心逻辑嵌入点
- 速度提升:在
updateWithoutInput()中每50周期执行 - 炸弹生成:同函数内随机触发
- 炸弹移动:每5帧调用
moveBomb(),碰壁则随机换向 - 炸弹清除:在
moveSnake()吃到食物分支内概率清除
🖥️ 游戏界面展示
游戏主界面

游戏结束界面
游戏结束! 最终得分:10死亡原因:炸弹爆炸按任意键退出...👥 分工合作说明
| 成员姓名 | 负责模块 | 具体贡献 |
|---|---|---|
| 石澄錡 | • 核心游戏逻辑 • 蛇的移动控制 • 碰撞检测系统 • 基础界面绘制 | • 实现蛇的数据结构设计和移动算法 • 开发完整碰撞检测系统 • 编写游戏主循环逻辑 • 完成基础绘图函数 • 代码量:约400行 • 占总工作量:65% |
| 贾锡昶 | • 加速系统 • 炸弹系统 • 特效和动画 • 用户界面优化 • 测试和调试 | • 设计并实现随时间加速的完整机制 • 开发移动炸弹系统 • 实现闪烁效果和颜色切换 • 优化界面显示和用户体验 • 进行全面测试和bug修复 • 代码量:约200行 • 占总工作量:35% |
🔧 技术实现细节
核心算法
蛇身移动算法
采用”数字标记法”实现蛇的移动,避免传统数组移动的高复杂度:
// 移动前:3 2 1 (蛇头为3,蛇身为2,蛇尾为1)// 移动后:4 3 2 (整体数值增加,原位置减1)时间复杂度:,其中和是画布尺寸。
碰撞检测优化
使用早期返回策略,提高检测效率:
int checkCollision(int x, int y){ // 按概率从高到低检查 if (canvas[x][y] == BOMB) return 1; // 炸弹碰撞 // 边界检查 if (x <= 0 || x >= High-1) return 1; // 自身碰撞检查 if (canvas[x][y] > 1 && canvas[x][y] < snakeLength) return 1; return 0;}性能优化
减少屏幕闪烁
void drawCanvas(){ // 方法1:光标重定位,避免清屏 COORD pos = {0, 0}; SetConsoleCursorPosition(handle, pos); // 方法2: 只重绘变化区域 // 实现脏矩形更新机制}内存管理
- 使用静态数组避免动态分配
- 预分配所有需要的内存
- 避免频繁的内存申请和释放
🧪 测试与调试
测试用例设计
功能测试
| 测试项 | 输入 | 预期输出 | 结果 |
|---|---|---|---|
| 蛇移动 | 按W/A/S/D键 | 蛇改变方向 | 通过 |
| 吃食物 | 蛇头接触食物 | 得分+10,蛇身+1 | 通过 |
| 撞墙 | 蛇头接触边界 | 游戏结束 | 通过 |
| 炸弹移动 | 随机生成炸弹 | 炸弹每5帧移动 | 通过 |
边界测试
- 蛇长度为1时的碰撞检测
- 同时吃到食物和炸弹的处理
- 最高分数测试(INT_MAX)
📊 项目总结与展望
项目成果
- ✅ 功能完整:实现了所有计划功能,包括创新性的炸弹系统和加速机制
- ✅ 代码质量:遵循良好的编码规范,注释详细,结构清晰
- ✅ 用户体验:界面美观,操作流畅,反馈及时
- ✅ 可扩展性:模块化设计,便于添加新功能
遇到的问题与解决方案
问题1:屏幕闪烁严重
解决方案:采用光标重定位技术替代清屏,显著减少闪烁。
问题2:炸弹可能困住蛇
解决方案:限制炸弹生成位置,确保至少有一条通路。
📝 附录
编译说明
# Windows 平台编译gcc snake_game.c -o snake_game.exe -lwinmm# Linux 平台编译(需要ncurses库)gcc snake_game.c -o snake_game -lncurses运行环境要求
- Windows 7/8/10/11 或 Linux 系统
- 至少1GB内存
- 支持ASCII字符的终端
报告结束
第四组 石澄錡 贾锡昶 - 2025年10月
Thanks for reading!
