飞机大战c语言、简单小游戏
概述
项目:飞机大战 主要功能有以下几点:飞机发射子弹,击中敌机敌机血量减少,敌机与飞机碰撞飞机血量减少,击中敌机分数增加,到达一定分数进入下一个关卡,直到通关或游戏结束。
注意:此项目用VS2019编译运行,比Dev c++更适合用来写大项目,方便实时报错更改错误。所以有些函数、定义方式、文件读取方式有所不一样,包括图形库的使用,需要安装Easyx(Dev c++使用的是EGE 图形库)
关卡设置
本次飞机大战游戏中共设置了三个关卡,第一关的难度设置较低,仅有敌机对其进行攻击;第二关背景切换,在原有的基础上子弹数量增加;第三关在第二关的基础上子弹数量增加,新出现了大血量boss,当大boss被消灭后通关成功。
敌机设置
敌机随机出现,当敌机与战机相撞或被战机的子弹击中时,小敌机消失。小boss需要子弹击中两次才会消失,当小敌机与战机相撞失去1滴血,小boss与战机相撞失去2滴血,若战机在敌机的正下方时,战机也会掉血量。大boss上方都有血量显示,当血条消失时意味着生命消失,大boss。小boss会在屏幕上随机出现和走动出了屏幕后会在屏幕的任意地方再随机出现,直至血量为0消失。大boss则在屏幕中固定不动,并发射子弹,直至血量为0消失。
战机设置
战机初始有10条生命,所获得的积分以及其生命值都在窗口的左上角显示。在第一关时,按空格键战机会出现一个向上发射的子弹,到第二关的时候,按空格键战机会发射两个向上的子弹,到第三关发射三颗子弹,当战机被敌方的炮弹击中或与敌方相撞时,血量减少。
游戏设置
进入游戏时,会有背景音乐,窗口左上角显示战机所得积分及其生命值。根据积分情况进入不同的关卡,切换不同的背景。当战机生命值为0时,游戏失败,屏幕显示游戏结束。
相关技术
双缓冲技术
在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样即可解决图片闪烁问题。 本程序在绘制滚动背景以及飞机,敌机等中用到了BeginBatchDraw()函数,用于批量绘图。FlushBatchDraw()用于执行未完成的绘制任务,EndBatchDraw()函数用于结束批量绘制,并执行未完成的绘制任务。
流程图
通过流程图我们能更好地理清写代码的思路 
主要功能模块

代码实现
头文件

定义变量
 
主函数

游戏初始化
首先把BGM和图片加载出来 注意播放音乐和加载图片都有固定的格式
 然后设计游戏界面 把整个游戏界面当作是以左上角为(0,0)的坐标原点,x对应width,y对应height 自定义飞机、敌机和子弹出现的位置 注意调整子弹与战机位置,要尽量对齐 
 flag为false表示已不存活(子弹消失,敌机消失),初始化都为false 开始界面可以用Easyx图形库的文字函数显示各种字体颜色和大小,为了省事我这里直接用自己ps过的图片~


创建敌机和boss

创建大boss和战机的子弹

创建大boss子弹和战机子弹移动速度

设置移动速度
  
遇到的主要问题以及改进
1、无法无限产生敌机和子弹及解决方案 在运行时发现子弹很快就用尽,敌机后面也不出现了,查找资料以后发现可以使用GetTickCount函数来返回操作系统启动到当前所经过的毫秒数,原型是DWORD,再通过产生随机数来调用CreateEnemy和Createbullet来产生敌机和子弹,这样数量就不会受到限制了。
2、 图片闪烁问题及解决方案 在运行过程中发现无论是战机敌机等还是背景都产生剧烈的闪烁问题,非常晃眼,不知道该如何解决。后来上网查找资料,知道利用双缓冲技术可解决图片闪烁问题。然后仔细研究用法,最后成功将该问题解决。
3、无法读取音乐和图片文件及解决方案 在Dev C++和VS2019尝试了不同的表示方法,无法加载的主要原因还是文件路径不对,之前一直用/来读取文件路径,尝试了很久发现并不可行,通过向别人提问被指出应该用双反斜杠\ ,查找资料后发现写成单独的\的是windows的标准形式,而写成\才是程序语言中用到的形式。 4、不足与改进 1.原本想实现三个关卡对应三个BGM,但出现问题没有找到解决的办法 2.加载了飞机爆炸的效果,出现闪烁,没有实现爆炸效果 3.游戏无法存档,读档 4.没有用数据结构的知识 5.关卡设置简单,没有加血道具/放大招 6.最后的敌机无法设置左右来回移动发射子弹
接下来将通过数据结构知识改编代码
下面附上源代码的百度网盘链接: https://pan.baidu.com/doc/share/Rrf8gIAwx8YZaEwcq7Ig-25057923021041 提取码:23u1
图片和音乐素材到我的资源里下载~
|