目录结构


注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下:

1、小甲鱼Python项目 – 飞机大战
2、本文使用的掩码图生成工具 自动生成遮罩图的程序,点击前往
3、EasyX官方链接,点击前往
4、中国色谱 颜色代码对照表(RGB多用于easyX中),点击前往


C++实现飞机大战

  • 本人博客严正声明
  • 文章快速说明索引
  • EasyX免费绘图库
  • 素材的掩码图制作
  • 博客内部动图制作
  • 飞机大战项目开发
    • 初步效果展示
    • 优化代码逻辑
    • 打印模块增加



本人博客严正声明

一、专栏收费声明:

是这样的,熟悉在下的小伙伴们都知道 我写博客主要目的就是分享和学习总结。至于CSDN的排名 排名什么的,我并不是很在意!

  • 一来 很不喜欢标题党
  • 二来 更反感灌些水文
  • 三来 痛恨无下限抄袭

本人博客都是认认真真写的,结果在CSDN并没有什么的太大的名气 关注度什么的也不高!前些天 一位好心的粉丝私聊了在下,反而一名某平台的哥们儿 快把我的《PostgreSQL的学习心得和知识总结》都给照搬过去了,甚至一个字都不改(连同在下 都是只字不提 好歹稍微提一下呀)!!!

实在是太过分,后来经过(友好)协商,现已经全部删除了!

本人是做PostgreSQL内核开发的,深感当下学风不正 大家都很浮躁,一向踏踏实实深耕的并不是很多!因为写代码这件事情上,欺骗不了任何人!本本分分老老实实地写好代码做好学问十分不易,容不得掺沙子和造假!这里把我喜欢的一句话送给各位以共勉:

非淡泊无以明志,
非宁静无以致远!


二、项目开源声明:

现在设置收费的专栏有这么两个:

说实话,我其实不太喜欢搞这些门槛!一来不方便,二来有违我的初衷,设置专栏的目的只有一个:防小人而不防君子

至于一些小项目,我都放在了本人的gitee仓库里面,有需要自行去取 有什么疑问的,可以在博客的评论区进行留言


文章快速说明索引

学习目标:

背景:前一段时间,偶然间听到一个将要从事于 C/C++后台开发 的小伙伴的抱怨。了解之后,ta看上的是小甲鱼的这个Python项目(飞机大战),可是ta自己对Python一知半解。后来在下看了这个项目之后,觉得也很有意思 网上倒是有C语言版的实现,思忖再三 想着自己使用C++来实现这个项目。也正好捡起来已经好长时间都没有使用的C++了,下面是这个项目的背景介绍和注意事项 希望可以帮到有需要的其他小伙伴们!


学习内容:(详见目录)

1、基于EasyX实现小甲鱼Python飞机大战项目(C++版)


学习时间:

2021年08月8日 12:53:33


学习产出:

1、飞机大战项目
2、CSDN 技术博客 1篇


EasyX免费绘图库

EasyX官方链接,点击前往

EasyX 是什么

EasyX Graphics Library 是针对 Visual C++ 的免费绘图库,支持 VC6.0 ~ VC2019,简单易用,学习成本极低,应用领域广泛。目前已有许多大学将 EasyX 应用在教学当中。

超简单的 EasyX

“下载 -> 安装 -> 使用”,全过程不超过一分钟。具体安装步骤请参考 EasyX 安装教程,点击前往

学习 & 使用

在线参考手册地址,点击前往

生成 & 发布

EasyX 采用静态编译,不依赖任何 dll,同传统程序的发布方式没有区别,程序不会因为引入 EasyX 而增添任何发布负担。静态链接的 EasyX,会使编译后的 exe 体积增加 70KB 左右。对于绝大多数应用而言,增加的体积是可以忽略的。若将 Visual C++ 的运行时库改为静态链接模式,编译后的 exe 可以单文件运行。


素材的掩码图制作

关于掩码图的制作,网上有很多办法:

  • ps (但是在下不会使用,这里就不详谈)
  • png2bmp&mask.exe 工具,本文的掩码图都是用的这个工具制作,链接上面有

博客内部动图制作

所使用的工具是ScreenToGif,安装使用教程请见本人之前的博客:

CSDN博客专用动态图小程序的推荐—ScreentoGIF教程,点击前往


飞机大战项目开发

初步效果展示


这一版的代码,我放在了 v1.0,点击前往

song@LAPTOP-1UOL3Q59 MINGW64 /e/postgresql 12/my-html-study/C++ (master)
$ git tag
v1.0

song@LAPTOP-1UOL3Q59 MINGW64 /e/postgresql 12/my-html-study/C++ (master)
$ git branch
* master

song@LAPTOP-1UOL3Q59 MINGW64 /e/postgresql 12/my-html-study/C++ (master)
$

这一版的代码的效果展示上有一个小问题:

1、敌机种类有三种 smallType、middleType、bigType

但是从上图可见,只有中敌机 和 大敌机两种,小敌机一直都没有出现。后来再次分析全部代码之后,已发现问题所在:

  1. 敌机的初始状态:
// C++\ConsoleApplication1\main.cpp

// 初始化 4 个敌机(大中小 三种),并设置初始状态
	int enemyNum = 4;
	vector<Enemys>enemys(enemyNum);
  1. 后续击中,判断敌机被击毁(这里判断血量为0,设置存活状态为假):
// C++\ConsoleApplication1\game.cpp

void SuccessfullyHit(vector<Enemys>& enemy, vector<Bullets>& bullet)
{
            ...
			// 子弹已经进入敌机的内部
			if (it1->getX() >= it->getX() && it1->getX() <= it->getX() + it->getWidth()
				&& it1->getY() >= it->getY() && it1->getY() <= it->getY() + it->getHeight())
			{
				it1->setStatus(false);

				it->modifyBloodVolume();
				if (it->getBloodVolume() == 0)
				{
					it->setStatus(false);
				}
			}
			...
}
  1. 产生敌机的时候(敌机的类型是不变的):
/*
* 敌机的产生
*/
void enemyCreate(vector<Enemys>& enemy)
{
	// srand((unsigned)time(nullptr));
	for (vector<Enemys>::iterator it = enemy.begin(); it != enemy.end(); ++it)
	{
		if (!(it->getStatus()))
		{
			it->setStatus(true);

			it->setX(rand() % (WIDOWWIDTH - it->getWidth()));
			it->setY(0);

			if (it->getType() == EnemyType::smallType)
			{
				it->recoverBloodVolume(1);
			}
			else if (it->getType() == EnemyType::middleType)
			{
				it->recoverBloodVolume(2);
			}
			else
			{
				it->recoverBloodVolume(4);
			}

			break;
		}
	}
}

所以 这里的原因是:敌机一旦产生之后,其类型就没有变了。一旦随机数失效(不够随机),就会出现上述的情形

优化代码逻辑

上面的敌机类型是一成不变的,这个是不合理的,经过细微的修正如下:

song@LAPTOP-1UOL3Q59 MINGW64 /e/postgresql 12/my-html-study/C++/ConsoleApplication1 (master)
$ git tag -a v1.1 -m "my version 1.1"

song@LAPTOP-1UOL3Q59 MINGW64 /e/postgresql 12/my-html-study/C++/ConsoleApplication1 (master)
$ git push origin --tags
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 171 bytes | 171.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.0]
To https://gitee/lucky912_admin/my-html-study.git
 * [new tag]         v1.1 -> v1.1

song@LAPTOP-1UOL3Q59 MINGW64 /e/postgresql 12/my-html-study/C++/ConsoleApplication1 (master)
$ git tag
v1.0
v1.1

song@LAPTOP-1UOL3Q59 MINGW64 /e/postgresql 12/my-html-study/C++/ConsoleApplication1 (master)
$

注:本项目并非是完全版的,后续还可以做很多事情 鉴于本人身体状况,暂时就写到这里了 有兴趣的小伙伴们可以自行clone,有疑问可以在本文评论区留言 🙇‍


打印模块增加

2021年08月22日 11:28:56

最新代码,已经增加了分数打印 和 玩法打印模块,演示如下:

更多推荐

C++的学习心得和知识总结(十六)|基于EasyX实现小甲鱼Python飞机大战项目(C++版)