2020级C语言大作业 - 以撒的结合
以撒的结合 C语言
分享20级同学大一上学期用C语言(及少量C++)实现的以撒的结合。由于同学们刚学了三个月的编程,实现还不够完善,工程代码、图片音乐素材可以从百度网盘下载:
链接:https://pan.baidu.com/s/1Oo7jOCRTdo7xlP6Kho7Wrw
提取码:9r9b
1 设计思路
本游戏参考了网络上的同名游戏,并通过EasyX插件用C语言编写实现。为了统一玩家的操作,游戏只使用键盘进行操作,且可同时接收多种键盘操作。游戏还对场景及怪物进行了随机放置,并设置文件保存玩家的最高分数及关卡等数据,以提升游戏重复可玩性。
2 功能描述
游戏主体基本功能就是接收玩家的键盘输入,对怪物场景等进行更新,并在游戏结束后保存玩家的数据。其简要介绍如下:
2.1 初始化
初始化函数为startup()函数,其基本功能有以下几点:
1.初始化画布。
2.调用各实例对象的initialize()函数,以读取图片素材。
3.设置随机数种子,以保证每次开始游戏的随机设置不同。
2.2 主菜单
展示主菜单函数为menu()函数,menu()函数功能为绘制主菜单界面,接收玩家操作以开始或退出游戏,同时从文件中读取记录的最高分数及关卡等数据,并将其展示在界面上。
2.3 绘制游戏界面
绘制游戏界面函数为draw()函数,通过draw()函数调用各实例内部设定好的show()函数,将人物,场景等按一定层次绘制出来,并在游戏结束时跳转到游戏结束界面。
2.4 数据更新
数据更新函数为updateWithoutInput ()函数,在此函数中调用各实例内部的movement()等函数对各物体的坐标变化进行更新,调用change()函数来完成主人公的坐标变化和场景切换。
2.5 接收玩家键盘输入
接收玩家操作函数为updateWithInput ()函数,此函数内部只调用了player类中的action()函数和pause()函数。action()函数通过GetAsyncKeyState()函数,同时接收WASD和方向键的输入,实现了人物斜向移动和移动时射击的操作,pause()函数用来检测是否暂停。
2.6 数据重置
数据重置函数为dateReset()函数,函数主要功能是在游戏结束时重置数据,以方便玩家在游戏结束后再次进行游戏。
2.7 游戏结束界面
游戏结束后的处理函数为deadUpdate()函数,函数功能为展示游戏结束界面及分数数据,并将创下的最高分记录写入游戏的保存文件中。
3 分步骤实现方法
3.1 实现切换场景时怪物及物体的随机布置(重点)
游戏采用无尽关卡的设定,如果采用人为手动布置场景,不仅增加了大量的工作量,同时也会使游戏有较高的重复感。为了使游玩游戏时的重复感降低,在monster类中的我设计了putMonster()函数,此函数在检测到切换场景时,自动根据设置的随机数种子对怪物数量,怪物位置,物体位置等进行随机设置,同时还通过monster类下的impact()函数避免位置放置重叠。
3.2 游戏中各物体之间的物理碰撞检测(难点)
在最初的游戏版本中,我在每个类中都添加了对其他物体的碰撞检测,但这样写函数的可重复利用性低,且两个物体间的碰撞会有重复的检测,导致程序时间复杂度增加。在随后游戏开发中,我发现游戏中有多个功能需要碰撞的检测,
于是我在monster类中编写了impact(int x, int y, int width, int height, int number, user target)函数,此函数对monster内部的多个对象数组中的每个元素调用事先手动编写好的rectOverlap(int topA, int bottomA, int leftA, int rightA, int topB, int bottomB, int leftB, int rightB)函数(此函数接收传入的两个矩形的两个顶点坐标判断矩形是否有交集)来检测是否与传入的物体发生物理碰撞,并返回不同的值,同时由于对象被实例化时具有特定的下标i,函数内通过传入下标和枚举user的判断可有效防止自身与自身的碰撞检测。在游戏的后续更新中添加新物体时,只需在此函数内添加该物体的rectOverlap函数调用,即可完成该物体与其他多个物体的碰撞检测,降低了游戏更新的难度。此外该函数还在伤害检测,碰撞反馈,怪物布置等处得到多次重复利用。
3.3 类中静态成员被所有实例共享导致图片绘制错误的问题(难点)
为了实现人物移动时运动图片序列平滑绘制,我在绘制函数中添加了静态成员index和showpc,以实现程序运行一定次数才绘制序列中下一张图片的效果。而这也导致原来互不相干的各实例对象的图片绘制出现了相互干扰的情况。我通过查阅得知,类中静态成员会被所有实例共享。为了解决这一问题,我将index和showpc改成了类的数据成员,同时这也方便了后续数据重置函数dateReset()的实现。
3.4 游戏结束后返回主菜单或实例对象死亡时数据残余的问题(难点)
在游戏结束后,玩家将直接返回主菜单。然而游戏的突然结束并不会直接重置数据,多个数据还处于更新状态,在再次开始游戏时,会出现场景显示错误等Bug。解决方法为在游戏的每个类中添加自身生命周期结束后的重置数据函数,例如Bullet类的bulletClear()函数,Item类的itemReset()函数等,这些函数不仅可以在游戏结束后在dateReset()函数内作为清除数据的工具使用,还可以在实例对象死亡后重置数据。
3.5 游戏所需的类(重点)
游戏中各物体的创造是通过类的创建来完成的。且类中函数大部分都具有相似性。以游戏中的怪物类为例,每个不同的怪物类都具有各自的函数来完成一定的职能,例如Roundworm类有以下几种函数:
1. initialize()函数,完成素材的读取。
2. show()函数,实现素材的绘制。
3. movement()函数,实现坐标的变化。
4. damageJudgment()函数,实现伤害判断的检测。
5. monsterClear()函数,在游戏结束和实例死亡后初始化数据。
其他的怪物类也依照此框架来完成,后续怪物的增加只要按照此框架来创建就可以在此游戏中有较好的兼容性。
4 体会与总结
这次大作业的完成让我收获良多。我不仅积累了团队小组合作的经验,也明白各小组成员合理分工的重要性,合理的分工可以让任务的完成事半功倍。对个人来说,我认识到学习程序设计时实践操作的重要性,一次认真完成的实践操作可以让我在如何增强代码的可读性,如何找出程序中错误等方面的能力得到提升。
2020级C语言大作业 - 以撒的结合相关推荐
- 2020级C语言大作业 - 王国保卫战
王国保卫战 C语言大作业 分享20级同学大一上学期用C语言(及少量C++)实现的王国保卫战.由于同学们刚学了三个月的编程,实现还不够完善,工程代码.图片音乐素材可以从百度网盘下载: 链接:https: ...
- 2020级C语言大作业 - 丛林大作战
丛林大作战_C语言大作业 分享20级同学大一上学期用C语言(及少量C++)实现的丛林大作战游戏.由于同学们刚学了三个月的编程,实现还不够完善,工程代码.图片音乐素材可以从百度网盘下载: 链接:http ...
- 2020级C语言大作业 - 三国杀
三国杀 C语言大作业 分享20级同学大一上学期用C语言(及少量C++)实现的简化版三国杀游戏.由于同学们刚学了三个月的编程,实现还不够完善,工程代码.图片音乐素材可以从百度网盘下载: 链接:https ...
- 2020级C语言大作业 - 鸭王争霸赛
鸭王争霸赛 分享20级同学大一上学期用C语言(及少量C++)实现的鸭王争霸赛.由于同学们刚学了三个月的编程,实现还不够完善,工程代码.图片音乐素材可以从百度网盘下载: 链接:https://pan.b ...
- 2020级C语言大作业 - 小球进框
小球进框 C语言作业 分享20级同学大一上学期用C语言(及少量C++)实现的小球进框游戏.由于同学们刚学了三个月的编程,实现还不够完善,工程代码.图片音乐素材可以从百度网盘下载: 链接:https:/ ...
- 2020级C语言大作业 - 喵斯快跑
分享20级同学大一上学期用C语言(及少量C++)实现的喵斯快跑(音游).由于同学们刚学了三个月的编程,实现还不够完善,工程代码.图片音乐素材可以从百度网盘下载: 链接:https://pan.baid ...
- 2020级C语言大作业 - 火柴人打羽毛球
分享20级同学大一上学期用C语言(及少量C++)实现的火柴人打羽毛球.由于同学们刚学了三个月的编程,实现还不够完善,工程代码.图片音乐素材可以从百度网盘下载: 链接:https://pan.baidu ...
- 2010C语言添加背景图片_2019级C语言大作业 - 火柴人试炼之地
C语言大作业 - 火柴人试炼之地https://www.zhihu.com/video/1200491618794606592 分享19级同学大一上学期用C语言实现的火柴人试炼之地.分步骤代码.图片音 ...
- 2019级C语言大作业 - 火柴人试炼之地
火柴人试炼之地 C语言大作业 分享19级同学大一上学期用C语言实现的火柴人试炼之地.分步骤代码.图片音乐素材.可执行程序可以从百度网盘下载: 链接:https://pan.baidu.com/s/1X ...
最新文章
- hdoj1175 连连看(dfs+剪枝)
- Fedora20下安装VLC
- Scala方法定义及调用
- WebForms UnobtrusiveValidationMode 需要“jquery”ScriptResourceMapping
- MYBATIS 批量update 报错的问题
- Latex、XeLatex无法加粗
- 基于STM32F103RCT6的AD9833驱动开发(代码可以免费发邮箱)
- Memory barrier(内存屏障)
- 编程语言应该如何选择?
- 华东师范大学2017年数学分析考研试题
- 手机如何注册163邮箱?注册邮箱的方法步骤
- win10如何设置计算机网络访问,win10系统设置允许或拒绝从网络中访问本地电脑的操作方法...
- 7-20 打印九九口诀表(分数 15)
- 20个vue开源项目免费模板源码
- 冷链生鲜配送路径规划【附源代码】
- UCS(统一计算系统)[1]
- utils:常见的几种日期格式和转换方法
- gitblit Git服务器
- 无领导小组讨论面试真题解析(六)——月球求生记
- phpstudy端口冲突怎么解决