【题目要求】
设计一个简单的飞机大战游戏,满足以下需求:
1.战场的环境:高度=35, 宽度=55,我方飞机为一架,初始位置在战场环境中的最下方中间位置。
2.按照游戏任务显示指定样式的飞机。
3.敌方飞机出现的位置是随机的,敌方飞机的总数是可以预定的。敌机可以向下移动。
4.能够利用asdw按键分别控制飞机的上下左右移动。
5.按下空格键使我方飞机发射子弹,敌机每隔一段时间自动发射子弹。
6.击中敌机,敌机消失,并且我方分数+1,我方飞机被击中,分数-1,敌机从整个战场飞过而未被击落,分数-1。分数为0时结束游戏。
【提示】
1. 游戏通常会要求在控制台上显示画面(包括敌机,和我方飞机),显示跟之前的最大区别是要求有指定位置,而且更新的频率比较快,所以要求学习和总结:用在游戏程序中的输入和输出有什么特殊的处理方案?
键盘的输入,不在用cin,cin需要处理输入结束的判断,必须在操作中不断输入回车,不符合游戏的操作习惯;
采用C语言中的kbhit()和getch()来 键盘有键按下和按键识别;
上述两个函数需要引入头文件:#include <conio.h> // _kbhit(), _getch()
2. 屏幕的输出: 之前我们学习和使用的输出就是cout,如果要在指定位置上输出字符,会出现两
个问题,之前输出的内容一直还在,屏幕上始终有光标会闪烁,因此需要在输出的时候,要配
合其他的输出操作。
使用gotoxy函数,将光标移动到(x,y)位置。这样,就不需要一直清屏,但是光标的闪烁的问题,可以利用隐藏光标函数HideCursor()。完成上述两个函数需要#include<windows.h>,用到了一些windows提供的API函数。
【设计思路】
为了完成简单的飞机大战游戏的功能,需要经过以下步骤:
(一)实现一个具有基础功能的游戏框架
- 创建战场,设定代表飞机、子弹对象的底层数字。
- 实现与用户输入无关的更新,包括子弹移动、击中飞机的判断等。
- 实现与用户输入有关的更新,当按下特定键时执行特定操作。
- 实现屏幕显示的更新。读取底层数字时在控制台输出对应的字符。
(二)完善代码逻辑,实现游戏功能
- 敌机和敌方子弹移动的速度不应过快。使用两组数字来控制。
- 为解决闪屏问题,使用提供的函数绘图,并且隐藏光标。
- 控制同屏敌机的数量,如果不够要做补充。
- 完善飞机相互碰撞、子弹碰撞飞机后的逻辑处理。
- 加入计分板,当满足一定条件时应该结束游戏。
- 在控制台实现简单的UI界面。
【代码思路与文件结构】
飞机大战游戏由控制台快速刷新实现。在每一次刷新时都需要执行许多操作,将这些操作分割为不同的函数,可以提高代码的可维护性。
- 游戏运行时刷新的函数:初始化、与用户输入无关更新、与用户输入有关的更新、在控制台显示。
- 对敌我飞机进行操作的函数:创建、清除、检查我方飞机;创建我方子弹;创建、移动、摧毁、重置、检查敌方飞机;创建敌方子弹。
- 实现UI界面显示的函数:重置光标位置、隐藏光标;显示游戏开始、暂停、结束UI界面的函数。
源代码文件结构:
define.h:全局变量和函数的声明
func.cpp:游戏每次刷新需要直接调用的函数
utils.cpp:对敌我飞机进行操作的函数
ui.cpp:用于构建界面的函数
源代码目录的ui文件夹下存储的txt文件用于快速构建UI界面。
【运行效果】
开始界面:有两种选择,进入游戏和退出
游戏界面,初始同屏有两架敌机,子弹射速较慢
敌机到达战场低端而未被击落,扣分
敌机与我方飞机碰撞,或敌机子弹击中我方飞机,扣分;分数在10~20,敌机数为4架,敌机移速、发射子弹速度、敌方子弹移速相应加快。
分数高于30时,我方子弹变成三发,敌机数为6架,敌机移速、发射子弹速度、敌方子弹移速相应加快。
按下esc键,可使游戏暂停。再次按下esc可返回游戏,按下enter退出。
分数较高时,游戏难度也相应变高。如果分数再次降低,游戏难度也会随之变低。
分数达到0分,游戏结束。可以回到主界面重新开始游戏。
可以使用Visual Studio直接打开工程文件进行调试。