C语言 - 坦克动荡https://www.zhihu.com/video/1249782665081425920
分享18级同学大一上学期用C语言实现的坦克动荡。分步骤代码、图片音乐素材、可执行程序可从百度网盘下载:
提取码:0shb
一、设计思路
坦克动荡这个游戏与传统的坦克大战游戏不同,坦克动荡是通过子弹的碰墙之后多次反弹实现击中敌方坦克,并取得胜利的一款游戏。游戏的性质决定了地图对这个游戏的进行非常重要,所以制作这个游戏的第一步就是设计出一个或多个地图,这样才能增加游戏的趣味性。在设计出不同的地图后下一步便是实现坦克的行走与转向,以及碰到障碍物时的判定。随后要实现的便是子弹的发射以及碰墙之后的反弹。反弹实现之后,要攻克的就是子弹击中坦克时的死亡判定这个问题,当这些功能都完善之后,整个游戏就基本完成了,最后要做的就是整个游戏的优化,比如说音效,爆炸图片的添加等等细节上的完善。这些都完成后,坦克动荡这款游戏就彻底完成了。
二、功能描述
2.1 游戏整体功能描述
进入游戏时,玩家可以选择新游戏或游戏存档来进入玩家之间的对战,游戏有四个地图,玩家可以根据自身的喜好来选择游戏地图。游戏通过坦克的移动,反射子弹,以及子弹的反弹来实现摧毁敌方坦克并取得胜利的最终目的。
2.2 加载及显示地图
通过定义一个大的二维数组(比所有地图都要大)来储存地图信息,然后通过easy_x绘图功能,绘制出相应的地图(绘制出地图后可以选择自己将相应的地图截图,每次循环引用设计好的地图的图片加快游戏的运行)
2.3 两个坦克及子弹的相应功能实现
1.实现坦克的转向,前进后退以及坦克碰墙的判定。
2.并实现子弹的发射及发射子弹反弹。
3.坦克被子弹击中后的死亡判定及被击中后返回初始位置,每个坦克3条命,三条命打完后显示获胜方,并返回主菜单
2.4 初始及暂停菜单
初始菜单中可以选择游戏帮助,查看具体的游戏规则。玩家可在菜单中选择自己想进行的地图,或者读取游戏存档,也可以选择退出游戏结束游戏运行。
在游戏过程中也可以打开暂停菜单,进行相关的一些选择。
2.5 添加素材,完善细节
在相应界面添加背景图片和游戏中的一些音效以完善游戏细节,提高游戏体验。
三、各个部分的重点及难点
3.1 地图的加载与显示
地图是整个游戏进行的一个非常重要的部分,所以要对这个部分十分重视,最好先在纸上将地图画下来然后再用对应的二维数组表示出来(障碍物为1,空白为0),然后进行判断,如果是障碍物则打印一个方块,但是如果每次运行都要进行一次这个操作的话会严重拖慢程序运行,这时可以选择将地图的图片截图下来方便下次使用,或者可以选择缩小整个二维数组(将原来的5个单位化一个)。
因为有多个地图,所以二维数组应该设计的比所有地图都要大。而这样操作后控制地图的初始位置就成了另一个问题,可以定义一个变量为初始位置,然后每个地图的初始显示位置都根据地图本身大小而设置不同,再以这个初始位置为起点,在画布中显示地图,坦克和子弹。
3.2 坦克的移动旋转及撞墙判定
首先坦克的初始位置要合理,不能直接卡在墙体里面。在坦克的移动中使用可支持多键同时输入的方式使其可在移动过程中旋转,同时也支持多个玩家同时输入。撞墙判断编写两个函数,在输入坦克移动指令时以坦克的上下左右四道边界为对象分别判断该坦克是否在当前位置以当前角度进行前进或者后退。
坦克在空白处的移动应该是没有问题,这里的主要难点是碰到障碍物之后的判定该如何实现,大体就是对上下左右四个方向都进行判定,看看如果执行了前进或后退操作后是否会碰到墙壁,如果会碰到障碍物则不能移动,如果没有障碍物则可以前进,这个方法要求你了解坦克的实际尺寸(长度宽度),以坦克的四条边为对象判断是否将会撞到墙,当然这种判定方法还是不够精细的,这个判定实际判定的是这个图片的四条边,但是坦克旋转后,四条边位置也会随之发生相应角度的变化。
坦克的旋转上如果要进行360度的旋转,可以选择easy_x中的旋转函数,但是为了游戏的简单,我们将坦克的移动方向控制为8个,然后定义一个PI,用三角函数计算横坐标和纵坐标上的速度就可以解决向对应方向移动的问题。
3.3 子弹的发射及反弹
子弹的定义最好要用到结构体,因为在游戏中子弹要多次反弹,而且每次反弹之后速度的方向会发生改变,这时如果不用结构体,子弹的相关信息就会特别复杂。声明一个储存子弹相关信息的结构体,再定义一个该类型的二维数组表示双方的若干颗子弹。子弹的发射要注意这颗子弹的初始位置及初始两个方向上的速度。子弹的反弹注意限制子弹两个方向上的速度大小(小于2)以防止在判断是否击墙时直接“跃过”墙体。同时添加子弹在反弹若干次之后自动消失的功能。
3.4 子弹击中坦克,血量相关功能
子弹是否击中坦克采用计算每一颗子弹与坦克中心点的距离是否小于某个值的方法进行判定。坦克中弹后可以选择通过重新定义让所有子弹消失,这样就不会出现刚复活就被打死的情况。同时在游戏界面中显示双方的血量。生命值的显示我们选择使用文字显示,这样在生命变化时容易发生文字的重叠,可以放入一张背景图片,将上次显示的文字覆盖掉,就不会出现文字的重叠了。在一方血量为0(死亡时)结束这场游戏并返回主菜单界面。
3.5 存读档功能和用户菜单
这一部分不做过多的讲解,这一部分主要难点就是将感应鼠标点击的区域控制好,需要注意各个可点击文字选项边框在画布中的位置坐标以及各种鼠标指令之间的逻辑关系。
三、体会与总结
在开发坦克动荡游戏的过程中,首先我们体验到了怎样运用所学的C语言知识来一步步实现简单小游戏的开发,怎样用简单的知识一步步实现一个个复杂功能的乐趣。在实际开发过程中遇到一些棘手的问题我们也通过上网查找资料,与老师同学交流等方式基本解决。我们也认识到了团队合作的重要性,在一个比较大的工作中,合理分工,并能互相交流调配是十分重要的,能极大的提高工作效率和工作质量,当然团队中的每个人都应以积极的态度参与开发的工作。
总之,在这次的项目设计中,虽然过程中有些小瑕疵,但整体来说我们组的工作和成果还是基本达到预期要求的。这次项目设计作业让我们受益匪浅。