C语言程序设计实践的课程设计我们写了个游戏,差点拿满分,先将代码与项目报告与大家分享^_^
先上截图:
游戏名称:DotA圣战
类型:回合制RPG战棋类游戏
分工:
SwordHoly:游戏主程序,英雄类,重绘功能的实现。
Emerson:游戏战斗动画的实现。
tarcyzhu:寻路功能的实现。
ZCH:友情技术支持。(大三学长。。)
实验环境:
1. 开发环境:Windows 7+Visual Studio 2008
2. 辅助软件: Photoshop CS3、Word 2010、QuickSnap、IconMaster、拳皇2000
整体构架:
1. 整体架构采取状态与显示分离,游戏运行过程中其实只是改变状态,然后调用OnPaint()重绘函数,进行画图,把状态通过表现出来
2. 这样设计的优点:
1. 降低各模块之间的耦合度,易于编码与维护,本来的话对于每次改变状态都要写一个对应的画图模块,那样会显得非常繁琐和混乱,不易统一管理和维护。
2. 易于调试,因为状态改变与显示过程的分离,使得调试也变的简单,每次调试的时候只要判断是在状态改变过程出错还是画图过程出错,更容易定位出错点。
开发模式:
先做出程序主体,然后一个一个模块加上去。当一个模块调试成功后再去做下一个模块,这样做的好处是容易查错,因为如果出错的话肯定是当前在做的那个模块有错,因为前一个模块已经调试成功了。而且这样边做边能看到成果,能鼓励自己把完整的游戏做下来。
功能模块:
1. 英雄模块:包含升级模块,死亡模块,经验系统,战斗模块(双倍暴击,闪避等)
2. 画图模块:显示英雄(普通状态,可以被攻击状态,和英雄属性显示),显示地形(普通状态,可以到达状态和特殊地形属性显示)。
3. 移动模块:
1. DFS过程判断该点是否可达,可达后地形显示变绿。
2. BFS 过程找出一条路径,然后把整条路的行走过程显示出来。
4. 特殊地形属性加成模块:英雄站在有些特殊地形上攻击力或防御力会增加,站在月亮井上每回合还会加血。
5. 血条模块:在英雄头像下面会有一个血条表示英雄当前血量
6. 回合转化:一方操作结束后,将其英雄禁用,另一方英雄启用。
7. 胜利条件模块:敌全灭或者占领对方基地3回合
8. 战斗动画模块:对于战斗过程中的暴击,闪避,普通攻击,英雄死亡都有不同的动画,在动画中还能用动态文本显示出扣了多少血。
遇到的困难及解决方法:
1. 时间紧任务重:
当开始准备写的时候已经只有两个星期了,而且有两个人退出了。
解决方法:
1.在压力面前往往能激发人的潜力,那两个星期把能翘的课都翘了,在机房一待就是一个下午和一个晚上,为这个游戏争取了足够多的时间,所以在压力面前不要退缩,要迎难而上。
2.砍掉一些功能,开始设计的时候野心很大,想把技能模块,物品模块,金钱模块和AI模块都做进去,不过时间实在来不及了,有时候放弃也是一种策略。
2. 没MFC基础:
虽然C语言的基础比较好,但是对于MFC还是一无所知的,要想做出界面来难度是可想而知的。
解决方法:
1. 要用到什么去学什么,如果再系统的去学MFC,一来时间不够,二来感觉还是在实践中学效率比较高,事实证明其实里面用到的MFC知识很少的,只要会贴图,画图,输出文本和一点消息映射的知识就完全可以把这个游戏做出来。
2. 向学长寻求帮助,对于MFC我还是很陌生的,对Visual Studio 2008也不是很熟悉,有些东西不清楚询问学长的话一般都能得到满意的答复,再这里对ZCH学长表示感谢。
3. 功能太复杂,无从下手
解决方法:将画图过程和状态变化过程分离,也就是前面写到的整体构架,这样一来整个程序的结构就清晰了,写起来也是水到渠成。
4. 资源很难找:
合适的图片很难找,合适的地图更难找,找来找去都感觉不合适,最后把正规DotA游戏里的图截下来,再用IconMaster截出几个64*64的单元格,将这几个单元格组合后当作地图。这个过程其实是很繁琐的,搞了整整一下午才搞定。英雄头像、开场画面和结束画面也是精挑细选的,还有把这些资源导入到工程中,也是个体力活,总之资源的收集过程也是充满艰辛的。
5. 发现绘图的一个BUG
将游戏的运行界面多拖动几次,程序就会死掉,最后多次调试发现是重绘过程中内存溢出,经过网上一番查找发现了,pDC没有Release掉,dcMemory没有delete掉,将这两个错误一改,程序跑的飞快^_^