2021级C语言大作业 – 涂鸦跳跃

分享21级同学大一上学期用C语言(及少量C++)实现的涂鸦跳跃游戏。由于同学们刚学了三个月的编程,实现还不够完善,工程代码、图片音乐素材可以从百度网盘下载:

链接:https://pan.baidu.com/s/1godnyOgplnSEPkVaFt64JQ

提取码:fuj3

C语言大作业 – 涂鸦跳跃

一、设计思路

观察原版游戏,得出游戏的实现主要依靠角色与地面之间各自适时的移动的结论,产生跳跃的效果。在此基础上,逐渐增加游戏功能。由此得出游戏大体设计思路如下:

1. 游戏角色基本跳跃的实现

1.1 角色最简单跳跃

实现游戏角色在原地的跳跃以及地面随机等距的生成,此时角色无法控制,地面也无法站立。

1.2 角色在各个地面上的跳跃

实现地面始终不移动,通过方向键控制角色在各个地面上跳动。

1.3 角色与地面的交替移动

角色跳跃到画面某一高度且其速度不为0时,将角色的速度转移到地面上,让地面做匀减速运动,产生跳跃的感觉。此时地面无法循环生成。

1.4 无尽跳跃

当地面的坐标大于画面高度时,使该地面在画面最上方重新生成,实现无尽跳跃。

2. 游戏基本功能的实现

2.1 播放音乐

增加音乐播放函数,当角色踩到地面上时播放一次。

2.2 增加地面种类,死亡判断

增加易碎地板,移动地板。易碎地板,移动地板使用随机数生成,并保持各种类地板间相对比例不变。移动地板在画面左右匀速来回移动。易碎地板破裂时,播放音乐,将该地板图像改为破碎后图像,并在原有所有地板移速基础上加速下落。此时地板下落使用的使原来的坐标,重新生成时会与其他地板重合;当角色坐标大于画面高度时判断其为死亡,并播放死亡音乐。

2.3 记分,死亡后的完善

当地面产生移动且速度不为负时,将地面的位移转化为分数,并输出;死亡后重开一个画面,使得角色从最高出下落,体现其从高处下落的感觉,并播放死亡音乐。

2.4 破碎地面的正确生成

当踩到易碎地面时,将破碎地面的状态(位置,坐标)传递给新的变量,新地面速度在原有速度上累加,且加速度大于原有加速度;改变该地面的状态为已破碎,使得批量绘制地面时不绘制该地面,该地面额外调用函数绘制;且跳跃时如踩到该位置,不会跳跃。当该地面原有坐标大于画面高度时,正常重新随机生成。

3. 游戏的完善

3.1 界面的增加

3.1.1 增加初始界面

运行游戏后启动。画面左边为一角色,在一地板上正常跳跃,该角色不可控制。画面上方为游戏标题。画面中间为两行文字,可通过输入对应数字开始游戏,或退出游戏。画面下方为两行字,提示玩家按“Esc”键暂停,按“←”和“→”或“A”,“D”控制角色移动。

3.1.2 增加暂停界面

按“Esc”键启动,游戏暂停。画面上方为显示暂停的文字。画面中间为两行文字,可通过输入对应数字继续游戏,或退出游戏。画面下方为两行字,提示玩家按“Esc”键暂停,按“←”和“→”或“A”,“D”控制角色移动。

3.1.3 增加死亡界面

角色判断死亡后启动。画面上方为“game over”。画面中间为两行文字,可通过输入对应数字重新开始游戏,或退出游戏。画面下方为两行字,输出最高分与当前得分。通过读档功能读取最高分,如当前分数高于最高分,则更新最高分。

3.2 增加弹簧

当角色碰到弹簧时,绘制弹起后的弹簧的图像,并播放音乐,增加角色反弹的速度。

3.3 游戏难度的调整

改变各种地面出现的概率,当分数低时以正常地面为主,当分数高后,易碎地板与移动地板的概率上升。且移动地板移动速度随分数变化,分数越高,移动速度越快。

二、体会与总结

本次课程设计持续时间长,代码量大,对于刚入学一个学期的学生来说有着不小的挑战,在通过与同组同学的大量沟通与共同努力之后,我们较好的完成了期末大作业的任务。

我们面对的第一个难点在于选题,一个选题的合适与否直接决定了未来一个月的努力方向与可能碰到的困难。我与同伴先后挑选了多个题材,最后以动画过于复杂,物理引擎搭建难度大,过于血腥等理由排除了大部分的选题,最后一致决定了制作“涂鸦跳跃”这款游戏。这款游戏复杂度,制作难度适中,适合我们现在的水平,又具有一定的挑战。

我们碰到的第二个难点在于决定游戏分步实现的步骤。开始时由于没有合理的规划,导致我们组开始时花了很长时间,写了很多代码,最终却发现始终没有实质性的突破。后来通过对游戏逐步的分解,简化,逐渐确立了游戏的开发路线,最终实现了从几十行代码逐渐到数百行的积累与突破。

我们碰到的第三个难点在于游戏中较难开发点的处理。当我们组将基础功能实现以后,由于对后续难点,拓展的处理不当,加之生活其他事的影响,我们组的开发在中途停滞了很长时间。当发现这个问题后,我们组决定分开开发,各自写自己擅长部分的代码,并对自己所写代码负责,再将各自代码合并。这个决定大大加快了开发速度,也提高了组员的积极性。

我们还碰到的一个难点在于分组开发时的合作问题。每个人都有自己的代码书写习惯,变量命名习惯,在分组开发时可能会有冲突。在合作初期,也发生过组员写了数个小时代码,结果发现写的代码实现的功能是一样的这样的问题。为解决这些问题,我们组增加了注释的书写量,优化了变量的命名,将自己的代码格式尽可能的规范;在前中期开发时,一个人写代码时通知另外一个人,以尽量避免无用功的出现。

除开我作为一个组员所面对的挑战,作为一个编程的学生,在开发游戏时,会面对很多自己所不熟悉的问题,如文件的读与写,音乐的播放,面对对象编程的思想等。在这一个月的课程设计过程中,我在网上查阅了很多资料,这些课外学习到的知识,大大提高了自己的能力。同时为了不给同组的同学带来不必要的麻烦,我也在不断规范自己的代码书写,这样做也使得我可以在未来的学习中避免很多不必要的麻烦,更提高了自己的自信心。

在这次课程设计中我学到了很多知识,最终的游戏作品也顺利的按期完成了,相信我们组的每一个人都受益匪浅。

© 版权声明
THE END