大一比赛作品
- 一、github改动时间线说明
- 二、游戏概述
- 三、代码逻辑简要说明
- 四、游戏玩法与环境设置
- 五、源代码目录简要说明
- 六、现在的视角:一些感想
- 2018.05,历时整一个月完成,但当时不知道有VCS,所以并没有上传到github
- 2019.03,回过头来整理,主要包括两方面
- 将原先代码进行切分。原本的代码约4.5k行(包括了简略的控制台UI部分),却挤在四个文件中,对其进行了简单切分,形成现在的src目录
- 上传到github,包括简要说明以及doc形式的说明书
- 2019.04,移除了音频文件
- 2021.03,对说明重新整理
游戏名: DOTD ( Defence Of The Dormitory)(寝室保卫战) 作者: 彭天祥 赵文松 类型: 类FTS MOBA 操作方式: 鼠标为主 键盘为辅 代码量: 约4.5k(包括控制台UI)
创作来源: 基于我们两个人都热爱FTS游戏,而且对LOL,DOTA,DOTA2,WAR3,澄海3C的不同方面都各有认识,在这样的认识基础上,模拟创作了这样一个类FTS游戏,也算是对WAR3的致敬吧 实际上在最初是打算模拟整个WAR3的运行方式,但是开发过程中发现难度过大,最后采取类似MOBA的游戏模式,而实际最开始游戏定名为“魔兽进化史”,但是在偶然的一次过程中,突然发现大家对辅导员查房都闻之变色,在谈笑之余想到不如采用这一背景,更加贴近实际大学生活,于是也就有了DOTD
背景故事: “咚咚咚!”众人惊愕!!:“没人,别敲了”“胡说,你们开着灯呢!!”,众人放下手里的斗地主,开始商讨:“怎么办,辅导员来查房了!!”“不行,我们要引开辅导员的注意力,不能让她看到我们一片狼藉的样子!!” 于是,一场旷(hao)日(wu)持(xuan)久(nian)的对抗开始了……
游戏说明: 游戏采用轮防式游戏进程,每一轮都会有辅导员出现,而你的任务就是击退辅导员的查房,你可以通过商店卖的装备/药水/强化书来提升自己,并通过一次次的胜利获得经验和赏金,进而解锁多个人物,看看你能撑到第几轮吧!
游戏实现:
- 采用虚继承模拟有限状态机,控制游戏进程及人机交互
- 采用并发模型处理单位的行为
- 采用信号量(Event)实现线程间的即时通信、响应、结束
- 采用互斥量(Mutex)防止访问冲突,确定时序规范
- 采用A*算法进行单位寻路
- GP与AI采用不同的运行机制,GP为保证及时性,内部完全并行,AI采用另一类有限状态机进行状态转移与行为判断
- 架构可扩展,实现引擎与数据的分离,代码中可任意添加装备/消耗品/强化书/人物/敌人
- 加入暴击/生命偷取/法力偷取/百分比伤害/Buff、DeBuff、技能CD刷新/技能范围指示器/升级 机制,增强游戏可玩性
- 并行实现多线操作,仇恨机制,进而引入风筝打法
- 除播放音效使用了mciSendstring函数外,未采用第三方库
游戏角色:
-
人物:
- 大一萌新(人物音效来自:剑圣 格罗姆·地狱咆哮) 定位:刺客、暴击、平A
- 大二学姐(人物音效来自:月之女祭司 泰兰德·风语者) 定位:射手、平A
- 大三腊肉(人物音效来自:大魔法师 安东尼达斯) 定位:法师、技能
- 大四骨灰(人物音效来自: 侍僧) 定位:战士、近程
-
辅导员:
- ①号辅导员(人物音效来自:守望者 玛维·影之歌)
- ②号辅导员(人物音效来自:女法师)
- ③号辅导员(人物音效来自:树妖)
-
游戏展望:
- 采用并行事件分发,以引入编队系统
- 加入坐标引擎,以引入战场切换
- 实现对象序列化,以引入局域网下的多方对战
- 实现四叉树下的二位单位碰撞检测
- 结构上将每个人物/辅导员均以类的结构实现,以实现更大程度上的多态,提高代码维护性及游戏体验
- 全面设计游戏平衡性
游戏的整体框架是有限状态机+多线程并行,游戏中使用了两类有限状态机 分别是AI有限状态机和游戏进程(鼠标)有限状态机
AI状态转移图:
游戏进程状态转移图:
然后,每个玩家英雄会拥有大约6-7个子线程,每个AI英雄会拥有3-4个子线程
寻路方面依然是使用的A*寻路。在代码中对应Astar类,开启列表是用最小堆,也就是代码中的MinHeap类;关闭列表因为无需进行排序,采取了可变数组,对应的Aector类
采用虚继承模拟有限状态机,因为很多地方不得不使用虚继承 所以代码量会有些虚高……而且很多装备描述 不得不采用switch case,也使代码看起来有点多
识别方面采用RTTI
采用_beginthreadex来开启线程。线程通信方面,采用信号量(Event)来确保事件响应的同步,采用互斥量(Mutex)来确保写入不发生冲突,但是由于高度并发,部分事件响应可能有些怪异
除了播放音效不得不采用MFC的mciSendstring函数,其他方面均采用API,原则上不调用第三方库
总体理念是:输入事件(键盘/鼠标)->鼠标有限状态机->分发到线程->做出响应->玩家英雄与AI英雄交互->做出应答
点击exe文件开始执行后屏幕会很乱 这时候是全屏 摁F11退出全屏 右键控制台标题栏 进行以下三项设置后 方可正常游戏(这部分无法通过代码设置….)
设置完毕以后重新运行exe即可开始游戏,游戏开始界面是这样
DOTD四个字母可以移动 (虽然还是很简陋….),移动到右边点击OK
那么游戏就开始了!!!
进来是寝室,也是商店,商店中蓝色的是强化书 可以永久提升英雄属性 紫色是消耗品 可以买给英雄 可随时使用;绿色是卖的装备,鼠标停在上面左边会显示物品的背景故事,嘿嘿~ 每次进商店,都会重新刷新物品,那么问题来了,英雄在哪呢?
目前共计设置了四个英雄,分别是大一萌新,大二学姐,大三腊肉和大四骨灰。摁住左ctrl+1/2/3/4即可购买对应英雄(对了,要打开大写锁,因为不支持拼音输入法),但是,实际操作的过程中,是按你买的顺序来看的,比如你先买了大二学姐,虽然她在商店中是2号,但是对你来说是第一个,所以你要选定她,就要按数字键1;假如你又买了大一萌新,那么他就是你的二号英雄,你就要按数字键2来选中他。目前不支持编队操作(后续会加入)。看一下效果~
左上角是游戏轮数的说明,当新一轮开始时会有音效。当所有辅导员被击退的时候,就会开始下一轮的倒计时,设为15秒
在英雄面板上是这样:蓝色是技能,紫色是消耗品(图片上的英雄还没有买)绿色是装备(同上,还没买),然后移到上面会显示背景故事。因为时间仓促,有些描述可能不合理,技能现在要么很弱,要么很强,蛤蛤~
可以通过鼠标点那些小点来选英雄,比如这个暗黄色的点,你点一下,就可以选择它;也可以通过键盘1234等等来选择,0号是寝室,但是一般这个都是点击选择,毕竟那个红色的一大块比较好点~~
怎么决定给哪个英雄买装备什么的呢?是这样:这个是按照你选定商店(寝室)之前最后选定的英雄来决定的。比如我现在选2号英雄大一萌新,我接着点商店,那么我买的东西都会给大一萌新。但是如果你连点两次商店那就不行了,那样你最后一次的购买者就变成了商店,购买就会无效。值得一提的是,强化书是瞬间生效的,购买给哪个英雄,就立即给他加属性,这一点和澄海3C是一致的。
英雄之间可以进行装备/消耗品的转移:右键装备/消耗品,然后再选定你要给的英雄,可以用键盘1234也可以用鼠标(可能这个不太方便)。如果选择商店的话,就认为是出售,卖的价格是标价的60%
说了这么多,打起来是什么效果呢?我们看一下
红色的就是辅导员啦~
攻击的时候会在你的周围生成字符(很挫……)以及攻击音效
目前我们推荐你选择2号英雄大二学姐,她的音效是泰兰德·风语者的,很劲爆。推荐她主要因为她是远程,可以打到大约7*7的周围格子,能风筝辅导员
顺带一提,这个游戏可以多线操作,而且有仇恨机制,所以要小心。游戏目前相当不平衡,基本很难玩,所以初始金钱设的比较高……可以多买几件装备撑一下。到第五轮 第十轮会有惊喜哦~
另外英雄是可以买活的,但是价格会越来越贵,大约是500、1000、1500这样递增的,所以要小心~
经验足够可以升级,右键技能就可以升级这个技能
最后,我要诚挚的道歉,因为很多装备/消耗品/强化书的数值还没有设定好,这个游戏的很多体验还很差,装备目前是都有效果的,可是消耗品和强化书并不是…可能你花钱买了却没有什么效果……还有待完善,但是游戏引擎和游戏内核已经做出来了,所以剩下的都只是数值问题,请求期待我们的表现吧
装备的效果可以买来试一下,装备/消耗品的故事都很有意思哦~满满的锋哥哈哈哈
如果有任何疑问的话,可以联系我QQ:1070280566
- src/FSM,界面、商店、英雄、AI各自的有限状态机(FSM - Finite State Machine)代码
- src/callback,用于多线程启动执行的callback函数,如鼠标点击移动、回合控制、音效控制、buff效果刷新、技能CD刷新等
- src/element,游戏元素的UI与部分逻辑,包括耗品、装备、技能
- src/hero,游戏人物的实现逻辑,如重生、寻路、被选、攻击、仇恨等等
- src/include,头文件目录,包括了所有类的头文件
- src/module,游戏本身的控制模块文件,如菜单、加载、变量初始化、I/O事件分发等等
- src/navigate,寻路算法及需要的堆实现
- src/settings,游戏配置信息文件(主要是常量、宏定义),如不同部分字体大小、字体颜色、人物名字等等
- src/variable,全局变量的定义文件
从现在的视角看,不足还是很多的:
- 几乎没有代码规范(好的一点是有一些注释说明)
- console的设置可以通过预先执行一个bat来实现
- 在当时并没有系统地学过同步/互斥,这部分做的效果一般,才导致有时候会死锁
- 文件划分也很不合理(当然,这也主要是因为很多代码不重写也根本没法很好地划分)
- 线程开的太多
- 后来也没有再去动过这个项目,所以所谓的展望其实就变成只是说说而已了...
但不管怎么样,整理过程中才发现当时竟然写了这么多...好吧,也还算说的过去。
最后,能坚持看到这的都是狠人,万分感激!