https://www.bilibili.com/video/BV1Wv4y1V7QM/?vd_source=0e9edb7c93e95f3ed43602444f3a83e7
SnakeGame.zip
|-main.cpp
|-game.cpp
|-snake.cpp
|-game.h
|-snake.h
|-curses.h
|-pdcurses.lib
|-music
运行程序前请比对文件结构。若出现文件缺失,请联系作者。
- 无尽模式:
- 分数由食物分数(mPoints)和奖励分数(aPoints)两部分组成。
- 游戏难度 (difficulty) 和当前游戏分数成正相关。
- 每当贪吃蛇头部触碰到身体任意部位时,贪吃蛇生命值 - 1。
- 死亡判定为贪吃蛇生命值降为 0。
- 舞台模式和练习模式:
- 分数仅由食物分数(mPoints)组成。
- 游戏难度 (difficulty) 由所选难度决定。
- 死亡判定为贪吃蛇头部触碰到身体任意部位、贪吃蛇头部触碰到障碍以及关卡内设定的死亡条件。
玩家可以在初始界面的“Skin”选项中自由搭配贪吃蛇的颜色,右侧还会有更换新颜色后贪吃蛇的预览图,方便玩家发挥自己的艺术造诣。
在游戏载入时和舞台关卡通关后我们都准备了小动画欢迎玩家的到来!
菜单栏背景音乐 | 游戏背景音乐 | 游戏音效 |
---|---|---|
“贪吃蛇大作战”背景音乐 | <Bensound.com> | “东方绀珠传”及部分源于网络的音效 |
为丰富游戏体验,我们精选了19首音乐+音效穿插在了游戏当中,玩家也可以在初始界面和游戏的暂停界面根据个人喜好去选择开关游戏音效和开关背景音乐。 |
在无尽模式(endless)中,我们为贪吃蛇设置了生命值。每次贪吃蛇吃到自己的身体时,会触发以下效果:
- 生命值 - 1
- 当前分数 - 当前蛇身长度 / 2
- 小蛇重新初始化,长度变为2,在原点闪烁片刻后再度爬动
注意: 当生命值减为 0 时,游戏失败!
概念:地图上连续的、首尾不相连的轨道。由标识入口方向的轨道头部和轨道躯干两部分组成。
记分规则:贪吃蛇从轨道头部进入,沿着轨道爬行直到走完轨道,则获得相应的奖励分数。不同的轨道类型会有不同的奖励分数及奖励效果。
轨道类型:
L | Six | Triangle | Snake | Heart |
---|---|---|---|---|
获得 2 点奖励分数 | 获得 3 点奖励分数 | 获得 3 点奖励分数 | 获得 5 点奖励分数 | 获得 10 点奖励分数,生命值 + 1 |
注意:
-
如果贪吃蛇中途偏离轨道,则此次轨道爬行尝试失败,轨道将重新刷新。玩家需要控制贪吃蛇重新从轨道头部尝试轨道爬行。
-
对于轨道 SIX,我们为了美观导致轨道尾部的位置不明。这里进行说明,**正确的行进方向是从轨道头部出发逆时针绕行。(如上图所示)
-
为使玩家更轻松地完成能量轨道,我们设置了如下特性:走上能量轨道后,调皮的贪吃蛇会进入专注模式,故而行动变得缓慢。 如果玩家还不能完成能量轨道,请不要责怪已经尽力的贪吃蛇。
-
为致力于玩家友好型游戏的打造,当贪吃蛇走上收益更大的心形轨道时,贪吃蛇会比在其他轨道上更加小心翼翼!
Freezing | Shrinking | Lazy | Award |
---|---|---|---|
减慢贪吃蛇的速度,使 difficulty - 1 | 减少贪吃蛇的长度,使 snakeLength - 1 | 进入自走时间 | 进入奖赏时间 |
- Item 只会在 Endless 模式中生成。
- 在贪吃蛇获取道具之前,不会生成新的道具。
- Item的生成频率与游戏分数(mPoints, 其中不包括奖励分数 aPoints ) 成正相关。具体代码如下:
if (eatItem) {
int rate = log(mPoints);
int number = rand() % 10;
if ((number+1) <= rate) {
eatItem = false;
createRandomItem();
this->renderItem();
}
}
- 玩家可以在初始界面“Items”选项中查看道具有关介绍
贪吃蛇允许玩家懒惰一会儿。自走时间中玩家无需操纵贪吃蛇,贪吃蛇会以较高的速度自动追捕食物。自走时间中获取食物会增加相应的分数,且该部分分数计入游戏难度的计算(会让游戏难度升高)。
鉴于自走贪吃蛇的突然加/减速可能会让部分玩家猝不及防,我们设置了多处信息表明贪吃蛇正在自走时间中尽情驰骋:
- 金色的史诗皮肤
- |Auto Mode| 的Tesla蛇认证标志
- 激情动感的音乐
(演示方便起见,贪吃蛇的爬行速度可能与实际不同,请以真实游戏体验为准)
注意:
- 自走模式
$\neq$ 无敌模式! 自走模式并不能拯救无路可走的贪吃蛇,更不能拯救调皮的玩家!
贪吃蛇闯入了奇怪的传送门,并进入了长达 50 s 的奖赏时间。奖赏时间中,玩家将进入新的页面,化身为固定长度 2 的小蛇。
与此同时,游戏界面中将刷新出一个能量轨道。只有当玩家成功走完当前的能量轨道之后,方可刷新下一个能量轨道。
注意:
- 在奖赏时间中获取的分数为奖赏分数 (aPoints),不会使得游戏难度增加!
- 奖赏时间的剩余秒数展示在游戏界面的上方。
- 当玩家获得的奖赏分数
$\ge$ 6时,会刷新一次心形轨道(HeartTrack)。走完该轨道会获得生命值加 1 和高额分数奖励。 - 心形轨道(HeartTrack)在每个奖赏时间中最多刷新一次!
(演示方便起见,贪吃蛇的爬行速度可能与实际不同,请以真实游戏体验为准)
鉴于我们对游戏背景音乐的甄选和进食音效的实现,我们为贪吃蛇自走时间展示开辟了专栏。在此模式中,贪吃蛇将在电脑屏幕上以极高的速度飞驰。欣赏电脑优雅的操作,测试人员认为这有极好的解压效果。
希望玩家能够享受这段视听盛宴!祝每一位交大人在努力学习上进的同时,不要忘记排解压力哦~
舞台关卡模式逻辑取自于街机游戏东方系列,因此难度较大,理想通关时间为10小时。关卡模式包括6关,每关拥有不同的地图与逻辑,地图中只含有标记为"X"的障碍,碰到时计为失败,当玩家在该关卡下达到目标分数即可通关。玩家需要在不死亡的情况下一次通过6关即可胜利,当玩家在该模式下选择重来时,会从第一关重新开始。该模式包括EASY、NORMAL、HARD、LUNATIC四个等级,随等级增加,游戏中难度增加速度变快、基础难度上升、目标分数上升。玩家通关时,会播放游戏ending动画,在NORMAL等级以上通关时,会开启练习模式中的EXTRA关卡作为奖励。
注意: 该模式屏幕越大体验越好!
标题:初识贪吃蛇 地图为方形障碍。在四个等级下分别达到10、15、20、25分过关。
标题:为什么不试试穿墙? 地图为折线障碍,不同区块之间只有通过穿墙到达。在四个等级下分别达到12、17、22、27分过关。
标题:“衔尾蛇” 地图为“∞”形状障碍,当蛇首与蛇尾超过5x5的范围时判断为失败。在四个等级下分别达到12、17、22、27分过关。
标题:拥挤的街区 地图被直线分割,与第二关相似,在四个等级下分别达到15、20、25、30分过关。
标题:《颠倒世界》 地图与第一关完全相同,但方向键相反,在四个等级下分别达到20、25、30、35分过关。
标题:周年庆 地图为SJTU字母,在四个等级下分别达到18、96、120、126分过关。
标题:“超速了” 地图由多个“/\”组成,仅有一个等级,在固定的6级难度下获得30分过关。
练习模式旨在对关卡模式中的单个等级下的某一关进行练习以提升熟练度。该模式下可精准选择到某等级下的某一关。由于该模式的主题为“练习”,因此其中的关卡只有在玩家在关卡模式中初次遇见后才能开启使用。另外,通关奖励:EXTRA关也在此处进入。
鉴于 stage 模式及部分其它模式难度过大,本游戏提供作弊功能,分别是:
- 解锁 Practice 中所有关卡
- 按动一次方向键走一步
作弊形式参考魂斗罗,具体操作方法请向开发者索要。
由于程序设计中的音乐部分使用到了 Windows系统库 Windows.h
,故本游戏仅可在Windows系统的电脑上运行,下面简要说明如何进行环境配置。如若使用Mac,请用Windows虚拟机运行本程序。
- Code::Blocks
- 为方便后续配置,本处建议使用编译器Code::Blocks运行游戏,可在https://www.codeblocks.org/downloads/进行下载。以下均以Code::Blocks 20.03为例进行有关说明。
- 配置使用pdcurses库
- 下载文件夹中的pdcurses.lib,curses.h
- 通过File->New->Projects->Console Application新建Code::Blocks项目
- 将curse.h添加到项目中
- 在菜单栏Project->Build options->Search directories->Linker处添加文件pdcurses.lib所存放的目录
- 相同窗口中的LinkerSettings处通过先前所添加的目录添加pdcurses
- 配置使用mmsystems库
- 通过菜单栏Settings->Compiler->Linker settings,在Other linker options中添加“-lwinmm"
- 配置游戏配套音乐
- 保证项目文件夹中的“music”文件夹和Code::Blocks项目文件在同一目录下
- 完成配置
- 将项目文件夹中的.cpp和.h文件全部添加入Code::Blocks项目中即可运行游戏
测试设备是2021 MacbookPro 8核 16GB内存,测试工具为htop。
因为Windows上没有htop,但是本游戏只能在Windows系统下进行,固而由使用虚拟机的Macbook进行测试。但htop难以对虚拟机上的单个程序进行分析,所以我们使用控制变量法进行对照。方便起见,舞台模式的测试中我们仅对stage1进行测试。该舞台中存在较多地形单元,因而会涉及更多条件判定。相对而言,其内存和cpu占用应当会比其他stage更多。
我们主要关注的两个参数为:
-%CPU:该进程占用的CPU使用率
-%MEM:该进程占用的物理内存和总内存的百分比
进程 | %CPU | %MEM |
---|---|---|
No Action | 0.5 | 45.4 |
Start Menu | 1.1 | 45.7 |
Endless Mode | 1.3 | 45.7 |
Award Time | 1.3 | 45.8 |
Auto Mode | 2.0 | 45.8 |
Stage1 | 1.3 | 46.0 |
结合图表可知,游戏运行过程中CPU的使用率平均增加了0.9%,内存占用平均增加了0.4%,可以说并不算消耗太多运算和存储空间。
Q1 - 皮肤系统可选颜色过少 A1 - 现在提供的皮肤颜色是基于十二色相环进行设计的,已基本覆盖常见颜色。若需要提供更加细致的颜色选择可能需要引入其他库进行设计,具体策略有待考量。
Q2 - 动画过于僵硬 A2 - 由于pdcurses是基于文本终端的,较难实现灵动的动画效果,可以考虑引入其他图形编程库进行动画的呈现。
Q3 - 不同关卡同一难度使用同一音乐是不是过于单调了? A3 - 最初想法是对音乐进行remix,但限于能力和时间计划最后搁置。
Q1 - 对于道具的刷新频率的把控欠妥, 道具刷新是否整体偏快? A1 - 经过测试,确实有这样的问题。我们会去查阅下游戏设计的相关资料,进一步改进道具生成的对数算法。
Q2 - 是否可以考虑一次性刷新多个食物? A2 - 我们考虑过这一点。对于生成两到三个食物,目前想法是增加mFood_1和mFood_2,然后在Food生成函数中增加判重条件即可。但是如果要同时产生更多的Food,比如造一个“食物狂欢时间”,那这种方法就太妥当了。具体策略有待进一步思考。
Q3 - 为什么不在无尽模式中加入路障呢?比如按住A键冲刺可以破除路障,否则的话贪吃蛇触碰路障会死亡? A3 - 我们的游戏设计师认为,如果字面上实现这种机制而不做任何扩充,这一功能在以pdcurses为基础实现的贪吃蛇上显得有些鸡肋。毕竟保守的玩家可以一直按着A键不放。我们认为,这种机制如果要达到理想的效果,应当是要实现音乐游戏的触碰时间判定。经过尝试,这种机制未能很好地实现。鉴于时间有限,我们主动放弃了这一功能。
Q1 - 实现这两个部分的函数占用空间太大了,为什么不新开一个板块? A1 - 最初的实现确实使用了新的cpp文件来储存这一板块,但是由于这两部分使用的函数八成都来源于game板块和snake板块中,新开板块会使得完成代码难度大大提升,同时会出现莫名其妙的bug,最终放弃了这一想法。
Q2 - 这两个部分的难度如此之大,为什么不考虑引入道具? A2 - 这一部分最初的想法就是做成i wanna 这样的形式,因此难度大是必须的,同时,一些道具不能很好地兼容这两个模式,因此最终放弃了加入道具的想法
Q3 - 这两个模式的设计略显单薄,有没有考虑过优化游戏体验? A3 - 这两个模式的逻辑是仿照东方project系列游戏制作的,游戏中理应包括boss、对话剧情等丰富的内容。然而对于贪吃蛇来说,我们不知道该以什么方式引入boss,同时设计自洽的游戏剧情也需要很好的文笔,我不具备这样的能力,于是放弃了这个打算。
- 请不要长按按键不放。由于程序读取玩家的输入是需要时间的,这可能会让贪吃蛇刹不住车/运动途中Esc反应变慢/菜单栏光标持续移动等情况。
- 本游戏由于在音乐系统引入时使用了
Window.h
,这导致本游戏目前仅可在Windows系统上游玩。若有需要后续会使用Mac/Linux兼容的库重新开发游戏。