admin 管理员组

文章数量: 1184232

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 掉,将这两个错误一改,程序跑的飞快 ^_^

本文标签: 系统 编程 模块