# 基于VC++和OpenCV实现的全民飞机大战游戏
# 摘要
- **功能**:利用C++语言完成了一个小游戏项目-全民飞机大战,该游戏首先能够给用户提供注册,登录功能;提供了菜单栏及两种游戏模式,一种是无尽模式,另一种是一般模式;一般模式中用户通过控制玩家飞机攻击敌方飞机获得分数以及奖励,打死boss飞机后可进入下一关,难度一次增加;玩家也可捡取道具,获得生命值,变换飞机形态。无尽模式中玩家通过躲避炸弹,捡取星星获得奖励,随时间推移,炸弹移动速度加快。玩家飞机阵亡后会显示自己分数,及排行榜
- **核心算法**:游戏主控制算法、图片绘制算法、飞机移动算法、导弹追踪算法
- **优点**:有较为清楚的软件运行流程,用户可以登录注册,保存数据,还有两种模式可供用户选择,敌方导弹还有追踪功能
- **不足**:没有图形化的登录界面,画面感不强,游戏过程中道具种类较少,没有加入鼠标操作
# 一、项目概述
## 1.1 项目简介
全民飞机大战,是一款经典的游戏。本软件,首先用户若有账号可以直接登录,若没有可以直接注册,然后登录。登陆成功进入菜单界面,选择模式,进入游戏。游戏中用户通过消灭敌方飞机获得分数,敌方飞机毁灭会爆出奖励,吃到奖励也可以加分,同时还有道具,飞机一共有三种形态,根据捡到道具个数,飞机依次变换形态。在击毁一定数量敌机后,会出现boos飞机,击毁boss飞机后会进入下一关卡,关卡难度依次递增。在通关或我方飞机阵亡时,会出现排行榜,记录当前获得分数,和排名。此软件还有无尽模式,飞机通过捡取奖励星星获得分数,若被障碍物炸弹击中会耗损生命值,根据时间推移,障碍物会移动越来越快,增加游戏难度。直到我方飞机阵亡,而后也会出现排行榜。此外游戏还设有音乐,按键等一些操作。
## 1.2 功能要求
| 编号 | 功能模块 | 输入描述 | 操作步骤 | 输出描述 |
| ---- | ---- | ----------- | ----------- | ------------------- |
| 1 | 开始系统 | 程序已经运行 | | 系统开始 |
| 2 | 登录 | 程序已经进行 | 按 1键 | 开始登陆 |
| 3 | 注册 | 程序已经进行 | 按 2 键 | 开始注册 |
| 4 | 菜单界面 | 程序已经运行 | 通过按键 | 选择模式 |
| 5 | 无尽模式 | 程序已经运行 | 按Enter 键进入 | 开始游戏 |
| 6 | 一般模式 | 程序已经运行 | 按Enter 键进入 | 开始游戏 |
| 7 | 退出游戏 | 程序已经运行 | 按Enter 键进入 | 退出游戏 |
| 8 | 飞机上移 | 程序已经运行 | 按W键 | 飞机向上移动 |
| 9 | 飞机下移 | 程序已经运行 | 按S键 | 飞机向下移动 |
| 10 | 飞机左移 | 程序已经运行 | 按A键 | 飞机向左移动 |
| 11 | 飞机右移 | 程序已经运行 | 按D键 | 飞机向右移动 |
| 12 | 攻击 | 程序已经进行 | 按J键 | 我方飞机发出子弹,不同飞机子弹类型不同 |
| 13 | 消灭 | 程序已经进行 | 玩家子弹与敌方飞机碰撞 | 敌方飞机销毁,爆出奖励 |
| 14 | 消灭 | 程序已经运行 | 敌方子弹与玩家飞机碰撞 | 玩家飞机掉血,直到被击毁,游戏结束 |
| 15 | 碰撞1 | 程序已经运行 | 敌方飞机与玩家飞机碰撞 | 敌方飞机与玩家飞机都失血 |
| 16 | 计分 | 程序已经运行 | | 击毁不同飞机,得到分数不同 |
| 17 | 碰撞2 | 程序已经运行 | 玩家飞机与奖励星星碰撞 | 得到分数奖励 |
| 18 | 碰撞3 | 程序已经运行 | 玩家飞机与炸弹碰撞 | 玩家飞机失血 |
| 19 | 排行榜 | 程序已经运行,游戏结束 | | 显示当前分数,与排名 |
| 20 | 重玩游戏 | 程序已经运行,游戏结束 | 按Enter键 | 进入菜单选项 |
| 21 | 退出游戏 | 程序已经运行,游戏结束 | 按ESC键 | 退出游戏 |
# 二、总体设计
## 2.1 类关系图
![](http://www.writebug.com/myres/static/uploads/2021/10/19/318f310fd8efe33ff62e4d2170a81a71.writebug)
## 2.2 结构关系图
![](http://www.writebug.com/myres/static/uploads/2021/10/19/86ba0155ad10afbceb20eb1f8c28ec16.writebug)
**简要说明**:plane为飞机基类,mplane, Enemyplane, EnemyFightplane, EnemyBossplane分别为派生的子类,这样封装可以任意增加子类,删除子类,子类可以从基类继承方法,还可以对某些方法进行多态继承,子类统一使用同一接口,而自己在类中实现自己特有的方法。
## 2.3 设计类图(所有类图)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/c142d2060e217cc988012f92834ab23d.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/6c7f10a5872cedfe4c7668b5a0519945.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/2bfa4b833f7fb41bb0de428955e94243.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/0b88b4b27623c651615e3a77fc4cb5ba.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/3711448ed1533abdd3cd60159c7ead06.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/7488adea597c4176b35e427fba3b8797.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/5525065e82ff318d9c6fd879bcb708dc.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/c739d28e212dda075b48e365ae71c04b.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/38c40164e61bd2c547871b2cb47f97df.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/cfee0b2a13e89ee0896d01ce82536562.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/0439780cdcc85c20716b73c301bb874b.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/42349f43062743f76c07118c573cf81a.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/53e0cdf172d1abcc70f0a8cca1846288.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/96614c6f49429652c0358663f0137dbb.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/de338584c1251d77aafe4110ea647989.writebug)
# 三、核心算法
## 3.1 游戏总控算法
该算法完成控制整个游戏进程的功能,判断游戏进行状态,对角色道具进行更新,该算法主要是通过CManager类中的Run函数进行控制,对枚举变量m\_state进行判断达到控制开始,运行,结束界面。当m\_state=0时,进入开始界面;m\_state=1时,进入运行界面;m\_state=2时,进入结束界面。流程图如下:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/4a232d9ebebad4e12190121fe31a8f2a.writebug)
算法对应实现函数:CManager类下的Run函数。
## 3.2 导弹追踪
该算法是Cbullet类下的Move,Angle函数,该两个函数用于敌方导弹追踪我方飞机,该算法先利用子弹,飞机的坐标,利用反三角函数算出角度,再利用三角函数sin,cos算出x,y方向的分速度,再进行子弹移动。流程图如下:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/5a41a95a46d4c1b0234349b4019b831d.writebug)
算法对应实现函数:CBullet类下的Move,Angle函数。
# 四、程序实现
## 4.1 开发平台与编译运行要求
| 硬件配置 | 版本 |
| ---------