文章目录

  • 1.前言
  • 2.效果展示
  • 3.图片素材的准备
  • 4.需要构建的函数
  • 5.变量的定义
  • 6.数据的初始化
  • 7.画面的呈现
  • 8.飞机移动的实现
  • 9.子弹的构建和移动
    • 9.1子弹的构建
    • 9.2子弹的移动
  • 10.敌机的创建和移动
  • 11.敌机消灭函数
  • 12.结束语
  • 13.完整代码
  • 14.内容更新

1.前言

本次需要用到easyx图形库,关于easyx的安装和一些基本函数,我在另外一篇推箱子小游戏中也有介绍,需要了解的小伙伴也可以点击进去看一看,下面会附上链接;

在写程序过程中需要的图片,可以去百度找,也可以自己制作,有想要了解如何制作的小伙伴也可以点击我下面的博客链接;

图片素材如何制作链接
easyx介绍链接

2.效果展示

3.图片素材的准备

如下图所示,我将我用到的图片的背景图和原码图都放在了源文件的文件夹,这样访问的时候直接填写图片文件名即可;
有个小建议,图片名字别乱取,因为找起来特别麻烦,啊哈哈;

4.需要构建的函数

下图中,展示了我们需要构建的函数以及定义的结构体,下面我将会解释各个函数的实现

5.变量的定义

我们使用变量时需要定义,我们的图片在使用之前也需要定义和加载,如下图所示:

6.数据的初始化

由上面可知我们定义了飞机结构体变量,变量中的的x,y即代表了飞机的坐标,我们的飞机在出生时,应该在界面的最低的中央处。子弹和敌机的初始化一目了然这里就不再赘述了;

下图展现了窗口的坐标,和飞机的起始坐标取值:

7.画面的呈现

通过判断我方飞机,子弹,敌机的结构体中的bool值来确定是否打印图案;
我们的子弹和敌机的设置为数组,通过数组元素形成的时间差,来营造连绵不断的动态效果;

8.飞机移动的实现

9.子弹的构建和移动

9.1子弹的构建

9.2子弹的移动

10.敌机的创建和移动

敌机的创建和移动就是子弹的复制版本,两者逻辑是一样的

11.敌机消灭函数

12.结束语

非常感谢大家的访问,期待你们的指导。
这次只实现了飞机大战基本的功能,后面会继续更新其它有趣的内容;

13.完整代码

#ifndef _PLANE_H_
#define _PLANE_H_#include <stdio.h>
#include <graphics.h>
#include <time.h>#define  SIZE 600 //背景大小
#define  PSIZE 80 //飞机大小
#define  BSIZE 40 //子弹大小
#define  MAX 10//子弹数目
#define  FMAX 10//敌机数目
typedef struct Member
{double x;double y;bool lable;
}mem;void Game();
void Load();//图片加载
void DataInit();//数据初始化
void PlaneCtr();//通过输入上下左右来改变飞机的坐标
void Show();//画面呈现
void BullterCre();//按了空格,调用函数,创建子弹
void BullterMove();//子弹移动
void FplaneCre();//敌机创建
void FplaneMove();//敌机移动
void Hit();//消灭敌机#endif
#include"plane.h"//定义图片变量
IMAGE background;//背景图
IMAGE plane_back;//飞机背景图
IMAGE plane_mask;//飞机掩码图
IMAGE fplane_back;//敌机背景图
IMAGE fplane_mask;//敌机掩码图
IMAGE bullte_back;//子弹背景图
IMAGE bullte_mask;//子弹掩码图//定义全局变量
mem plane;//飞机结构体
mem bullte[MAX];//子弹结构体数组
mem fplane[FMAX];//敌机结构体DWORD time_start, time_last; //时间变化量void Load()//图片加载
{loadimage(&background, "background.jpg", SIZE, SIZE);loadimage(&plane_back, "plane_back.jpg", PSIZE, PSIZE);loadimage(&plane_mask, "plane_mask.jpg", PSIZE, PSIZE);loadimage(&fplane_back, "fplane_back.jpg", PSIZE, PSIZE);loadimage(&fplane_mask, "fplane_mask.jpg", PSIZE, PSIZE);loadimage(&bullte_back, "bullte_back.jpg", BSIZE, BSIZE);loadimage(&bullte_mask, "bullte_mask.jpg", BSIZE, BSIZE);
}
void DataInit()//数据初始化
{//飞机的数据初始化plane.x = SIZE / 2 - PSIZE / 2; //飞机起始位置在背景图的中央plane.y = SIZE - PSIZE;plane.lable = true; //飞机出生是存活的//子弹初始化for (int i = 0; i < MAX; i++){bullte[i].lable = false;//子弹没按空间前是不存在的}time_start = time_last = GetTickCount();//开机到现在的毫秒数//敌机初始化for (int i = 0; i>FMAX; i++){fplane[i].lable = false;}}void PlaneCtr()//通过输入上下左右来改变飞机的坐标
{if (GetAsyncKeyState(VK_UP))//向上移动{if (plane.y>0)//不能越界plane.y-=0.8;}if (GetAsyncKeyState(VK_DOWN))//向下移动{if (plane.y<SIZE-PSIZE)//y最大值600,飞机图片大小为80plane.y+=0.8;}if (GetAsyncKeyState(VK_LEFT))//向左移动{if (plane.x>-PSIZE/2)//可以缩入墙壁一半机体plane.x-=0.8;}if (GetAsyncKeyState(VK_RIGHT))//向右移动{if (plane.x<SIZE-PSIZE/2)plane.x+=0.8;}if (GetAsyncKeyState(VK_SPACE) &&time_last - time_start>80)//发射子弹,每颗子弹间接为80毫秒{BullterCre();//空格发射子弹time_start = time_last;}time_last = GetTickCount();
}void Show()//画面呈现
{   BeginBatchDraw();//双缓冲绘图,防闪烁putimage(0, 0, &background);if (plane.lable)//飞机存活就打印飞机{putimage((int)plane.x, (int)plane.y, &plane_mask, SRCAND);putimage((int)plane.x, (int)plane.y, &plane_back, SRCPAINT);}for (int i = 0; i < MAX; i++)//循环判断子弹{if (bullte[i].lable)//子弹存在就打印子弹{putimage((int)bullte[i].x, (int)bullte[i].y, &bullte_mask, SRCAND);putimage((int)bullte[i].x, (int)bullte[i].y, &bullte_back, SRCPAINT);}}for (int i = 0; i < FMAX; i++){if (fplane[i].lable)//打印敌机{putimage((int)fplane[i].x, (int)fplane[i].y, &fplane_mask, SRCAND);putimage((int)fplane[i].x, (int)fplane[i].y, &fplane_back, SRCPAINT);}}EndBatchDraw();
}void BullterCre()//按了空格,调用函数,创建子弹
{for (int i = 0; i < MAX; i++){if (!bullte[i].lable)//子弹不存在就创建子弹{//从飞机的正前方发出去bullte[i].x = plane.x + PSIZE / 2 - BSIZE / 2;bullte[i].y = plane.y - BSIZE;bullte[i].lable = true;break;//一次空格产生一颗子弹}}
}
void BullterMove()//子弹移动
{for (int i = 0; i < MAX; i++){if (bullte[i].lable)//子弹存在,它的y坐标就减少{bullte[i].y--;//坐标减,产生移动if (bullte[i].y < 0)//子弹回收,否则下次全是发射出去的子弹{bullte[i].lable = false;}}}
}
void FplaneCre()//敌机创建
{for (int i = 0; i < FMAX; i++){if (!fplane[i].lable&&time_last-time_start>100)//没有敌机就进行构建,用时间函数控制产生速度{fplane[i].lable = true;fplane[i].x = rand() % SIZE - PSIZE;//不让敌出现在窗口外fplane[i].y = 0;time_start = time_last;break;//每次一个}time_last = GetTickCount();//获取新的时间}
}
void FplaneMove()//敌机移动
{for (int i = 0; i < FMAX; i++){if (fplane[i].lable){fplane[i].y+=0.3;//敌机往下走if (fplane[i].y>SIZE)//敌机回收fplane[i].lable = false;}}
}
void Hit()//消灭敌机
{for (int i = 0; i < FMAX; i++){if (!fplane[i].lable)//不存在则换下一个判断continue;for (int j = 0; j < MAX; j++){if (!bullte[j].lable)continue;//子弹不存在也换下一个判断if (bullte[j].x>fplane[i].x&&  //子弹和敌机有交集则都消失bullte[j].x<fplane[i].x + PSIZE&&bullte[j].y>fplane[i].y&&bullte[j].y <fplane[i].y + PSIZE) {bullte[j].lable = false;fplane[i].lable = false;}}}
}void Game()
{//加载图片数和初始化数据Load();DataInit();srand((unsigned)time(NULL));//种下随机数种子while (1){Show();//图像显示PlaneCtr();//操控BullterMove();//子弹移动FplaneCre();//敌机创建       Hit();//判断是否打中敌机FplaneMove();//敌机往下走}
}
#include"plane.h"int main()
{initgraph(600, 600);Game();getchar();return 0;}

14.内容更新

内容更新链接,点击进入

飞机大战——图文详解相关推荐

  1. Java移除出界敌机,java实现飞机大战案例详解

    前言 飞机大战是一个非常经典的案例,因为它包含了多种新手需要掌握的概念,是一个非常契合面向对象思想的入门练习案例 程序分析: 在此游戏中共有六个对象: 小敌机Airplane,大敌机BigAirpla ...

  2. 飞机大战游戏详解5.31

    整体实现思路 在Android studio中新建一个游戏界面,并构建一个主线程MySurfaceView构建框架,然后分别建背景.玩家飞机.地方飞机.玩家子弹.敌方子弹.爆炸.爆炸声音的类,并在My ...

  3. 波音737计算机控制系统,波音737NG驾驶舱主飞行显示器(PFD)图文详解-空速指示

    波音737NG驾驶舱主飞行显示器(PFD)图文详解-空速指示 2018-09-15 源自@航维机务技术 概述 驾驶舱主飞行显示器上可以显示空速.高度.姿态.航向.垂直速度.飞行模式.飞行指引.着陆指示 ...

  4. 广联达2018模板算量步骤_老师傅带你学造价,广联达GTJ2018图文详解,小白也能学会的软件...

    在GTJ2018问世之前,土建造价人员有三个软件是必会的,一个是GGJ主打钢筋算量,一个是GCL主打土建算量,还有一个是GBQ主要是套定额用来计价的软件. 那时候如果计算一个工程的工程量,首先要用GG ...

  5. 计算机刷新的作用,图文详解Win8重置和刷新功能:超强自我治愈

    直接自愈,Windows8出故障之后,伴随着重置和刷新两大新功能,世上无难事了啊.微软Windows8团队今日在官方博客详细向用户解释Win8的重置和刷新PC功能,将可一键复位系统到最佳状态.视频演示 ...

  6. 计算机网络管理的常用命令,网络管理常用命令图文详解.pdf

    网络工程师必备 – 网络管理常用命令图文详解 网络工程师必备 网络管理常用命令 图文详解 V1.0 V1.0 包含 ping.ipconfig.netstat.nbtstat.tracert. pat ...

  7. 全网最全的Windows下Anaconda2 / Anaconda3里Python语言实现定时发送微信消息给好友或群里(图文详解)...

    不多说,直接上干货! 缘由: (1)最近看到情侣零点送祝福,感觉还是很浪漫的事情,相信有很多人熬夜为了给爱的人送上零点祝福,但是有时等着等着就睡着了或者时间并不是卡的那么准就有点强迫症了,这是也许程序 ...

  8. SSL之CA证书颁发机构安装图文详解

    上一节我们说到,在验证公钥安全性时,是在CA机构颁发的包含用户的公钥及其身份信息的数字证书,数字证书由权威机构--CA签发.这个CA权威机构可以是自己的服务器也可以是国际公认的CA权威机构.下面我就来 ...

  9. spark最新源码下载并导入到开发环境下助推高质量代码(Scala IDEA for Eclipse和IntelliJ IDEA皆适用)(以spark2.2.0源码包为例)(图文详解)...

    不多说,直接上干货! 前言   其实啊,无论你是初学者还是具备了有一定spark编程经验,都需要对spark源码足够重视起来. 本人,肺腑之己见,想要成为大数据的大牛和顶尖专家,多结合源码和操练编程. ...

  10. x264代码剖析(一):图文详解x264在Windows平台上的搭建

    x264代码剖析(一):图文详解x264在Windows平台上的搭建 X264源码下载地址:http://ftp.videolan.org/pub/videolan/x264/ 平台:win7 PC. ...

最新文章

  1. 【教程】Cubieboard变苹果无线airplay音响
  2. 二叉查找树(binary search tree)详解
  3. 在adapter中startactivityforresult
  4. Oracle-修改用户密码为UNLIMITED
  5. 母亲的牛奶 Mother's Milk
  6. 自定义UITableViewCell需注意的问题
  7. linux awr 日志,Linux平台生成awr报告
  8. 技术人最不该忽视可视化数据分析!
  9. ant-design-vue 快速入手及常用标签
  10. 斯威夫特山地车_斯威夫特弦乐
  11. Happens before
  12. javascript的table 对象 属性 方法
  13. Java数据库操作要点
  14. lora信号测试小助手_LoRa技术——30个常见问题解答
  15. 分页显示java_java分页实现 怎样用java实现分页显示?
  16. FIR滤波器之Hilbert变换
  17. 【软件工程习题(含参考答案)】软件系统分析-五道题
  18. eclipse打开报错:Failed to load the JNI shared library
  19. schedule问题
  20. GPT:Improving Language Understanding by Generative Pre-Training(2018-6-12)

热门文章

  1. 微信抽奖系统源码 v3.0
  2. 快手短视频批量下载工具详细使用说明
  3. python模拟账号登录_用Python(Tornado)模拟登录小米帐号
  4. 西门子PLC学习记录
  5. c mysql学生管理系统_C++ 简单的学生信息管理系统
  6. 笨办法学python3 视频打包_正版 笨办法学Python 3 进阶篇+笨办法 学Python 3 视频教学 笨方法学Python核...
  7. AllWinner--R329
  8. 计算机软件系统验收标准,软件相关标准目录.xlsx
  9. 2 --> PCIE 协议栈的框架详解
  10. CSDN获得积分和C币的方法