c语⾔200⾏代码⼤作业含菜单,2018级C语⾔⼤作业-坦克动荡分享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语⾔知识来⼀步步实现简单⼩游戏的开发,怎样⽤简单的知识⼀步步实现⼀个个复杂功能的乐趣。在实际开发过程中遇到⼀些棘⼿的问题我们也通过上⽹查资料,与⽼师同学交流等⽅式基本解决。我们也认识到了团队合作的重要性,在⼀个⽐较⼤的⼯作中,合理分⼯,并能互相交流调配是⼗分重要的,能极⼤的提⾼⼯作效率和⼯作质量,当然团队中的每个⼈都应以积极的态度参与开发的⼯作。
总之,在这次的项⽬设计中,虽然过程中有些⼩瑕疵,但整体来说我们组的⼯作和成果还是基本达到预期要求的。这次项⽬设计作业让我们受益匪浅。