贪吃蛇增强版 - 答辩报告

贪吃蛇增强版 - 答辩报告

Tue Oct 14 2025
1744 words · 7 minutes

贪吃蛇增强版 - 答辩报告

🎯 项目概述

项目背景

贪吃蛇是一款经典的电子游戏,自1976年诞生以来广受欢迎。本项目在传统贪吃蛇游戏的基础上,增加了多种创新元素,形成了 “加速扩张&当心炸弹” 的独特游戏体验。

开发环境

项目说明
开发语言C语言
编译器GCC 9.4.0
开发工具DEV-C++
操作系统Windows 11 家庭版
图形库Windows Console API
版本控制Git

🎮 游戏规则详解

基本规则

游戏目标

玩家控制一条不断移动的蛇,在封闭的游戏区域内:

  • 通过吃掉随机出现的食物获得分数
  • 每吃一个食物,蛇身增长一节,得分增加10分
  • 避免撞到墙壁、自己的身体或移动的炸弹
  • 尽可能获得更高的分数

控制方式

按键功能
W向上移动
S向下移动
A向左移动
D向右移动
Q退出游戏

重要提示:蛇不能直接反向移动!例如,当蛇向右移动时,不能直接按A键向左移动。

游戏元素说明

视觉元素

  • 蛇头:■(绿色实心方块)
  • 蛇身:□(绿色空心方块)
  • 食物:●(红色实心圆)
  • 炸弹:B(黄色字母)
  • 边界:+ - |(青色线条)

游戏机制

  1. 移动机制:蛇按当前方向自动移动,玩家通过按键改变方向
  2. 成长机制:每吃一个食物,蛇身增加一节,得分增加10分
  3. 速度机制:游戏速度随时间逐渐加快,增加挑战性
  4. 炸弹机制:随机生成的炸弹在场内移动,增加游戏难度

死亡判定

当发生以下情况时,游戏结束:

  • 🚫 撞墙死亡:蛇头撞到场地边界
  • 🔄 自噬死亡:蛇头撞到自己的身体
  • 💥 炸弹爆炸:蛇头撞到移动的炸弹

✨ 自定义新规则:“加速扩张&当心炸弹”

规则概述

在传统贪吃蛇基础上,引入动态速度递增移动炸弹威胁两大机制,形成高强度对抗体验。

加速扩张机制

  • 游戏启动后,每经过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 // 分母

核心逻辑嵌入点

  1. 速度提升:在updateWithoutInput()中每50周期执行
  2. 炸弹生成:同函数内随机触发
  3. 炸弹移动:每5帧调用moveBomb(),碰壁则随机换向
  4. 炸弹清除:在moveSnake()吃到食物分支内概率清除

🖥️ 游戏界面展示

游戏主界面

主界面

游戏结束界面

游戏结束! 最终得分:10
死亡原因:炸弹爆炸
按任意键退出...

👥 分工合作说明

成员姓名负责模块具体贡献
石澄錡• 核心游戏逻辑
• 蛇的移动控制
• 碰撞检测系统
• 基础界面绘制
• 实现蛇的数据结构设计和移动算法
• 开发完整碰撞检测系统
• 编写游戏主循环逻辑
• 完成基础绘图函数
• 代码量:约400行
• 占总工作量:65%
贾锡昶• 加速系统
• 炸弹系统
• 特效和动画
• 用户界面优化
• 测试和调试
• 设计并实现随时间加速的完整机制
• 开发移动炸弹系统
• 实现闪烁效果和颜色切换
• 优化界面显示和用户体验
• 进行全面测试和bug修复
• 代码量:约200行
• 占总工作量:35%

🔧 技术实现细节

核心算法

蛇身移动算法

采用”数字标记法”实现蛇的移动,避免传统数组移动的高复杂度:

// 移动前:3 2 1 (蛇头为3,蛇身为2,蛇尾为1)
// 移动后:4 3 2 (整体数值增加,原位置减1)

时间复杂度O(n×m)O(n×m),其中nnmm是画布尺寸。

碰撞检测优化

使用早期返回策略,提高检测效率:

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. 代码质量:遵循良好的编码规范,注释详细,结构清晰
  3. 用户体验:界面美观,操作流畅,反馈及时
  4. 可扩展性:模块化设计,便于添加新功能

遇到的问题与解决方案

问题1:屏幕闪烁严重

解决方案:采用光标重定位技术替代清屏,显著减少闪烁。

问题2:炸弹可能困住蛇

解决方案:限制炸弹生成位置,确保至少有一条通路。


📝 附录

编译说明

Terminal window
# 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!

贪吃蛇增强版 - 答辩报告

Tue Oct 14 2025
1744 words · 7 minutes