笨方法实现基于EasyX的飞机大战

笨方法实现基于EasyX的飞机大战

此代码只能用于学习用途
因为此代码还存在大量不足,只能给你一定的参考。话不多说,我直接附上代码吧。
我这里的宏定义太多了,不建议大家使用,所以大家直接在结构体里面定义图片的高宽度就好了,游戏素材下载链接在最下方

// Planegame.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
// 飞机大战.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include<graphics.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
#include<stdio.h>
#include <math.h>
#include<windows.h>
#pragma comment(lib,"Winmm.lib")//是一条编译器指令,告诉编译器链接winmm.lib库,支持对windows 多媒体的编程.
#include <mmsystem.h>//windows中与多媒体有关的大多数接口
#define W 600 //背景宽度
#define H 800 //背景高度
#define PW 84//我方飞机高度
#define PH 91//我方飞机宽度
#define EW 100//敌方飞机宽度
#define EH 73//敌方飞机高度
#define BW 153//boos飞机宽度
#define BH 108//boss飞机高度
#define boss_b_H 70//boss子弹高度
#define boss_b_W 26//boss子弹宽度
#define bullet_H 36//我方飞机子弹高度
#define bullet_W 40//我方飞机子弹宽度
#define ebullet_H 20//敌方飞机子弹高度
#define ebullet_W 8//敌方飞机子弹宽度
#define myboom_H 128//我方飞机爆炸高度 
#define myboom_W 128//我方飞机爆炸宽度
#define eboom_H 64//敌机爆炸高度
#define eboom_W 64//敌机爆炸宽度
#define bossboom_W 128//boss爆炸高度
#define bossboom_H 128//boss爆炸宽度
#define weapon_W 50//武器图标宽度
#define weapon_H 50//武器图标高度
#define life_W 50//生命图标宽度
#define life_H 50//生命图标高度
IMAGE bj, bj1, plane1, plane2, eplane1, eplane11, eplane2, eplane22, boss1, boss2, mbullet1, mbullet11, mbullet2, mbullet22, ebullet1, ebullet2, boss_bullet1, boss_bullet2;//背景图变量,飞机等变量
IMAGE myboom1, myboom2, eboom1,bossboom1, bossboom2;//飞机爆炸变量
IMAGE weapon1,life1;//武器图标
void init();//初始化游戏
void load();//加载图片
void BackMove();//背景图移动
void putimage();//显示图片
void keydow(); //按键移动
void ifoutside(); //判断我方飞机是否飞出地图边缘 myplane
void create_eplane();  //初始化敌方飞机
void add_eplane();  //增加敌方飞机
void eplane_move(); //飞机移动
void create_mybullet();//初始子弹头              myplane
void add_mybullet();//发射自己的子弹             myplane
void add_enemybullet();//敌机发射子弹
void enemybullet_move();//敌方子弹移动
int bossbomm();//boss死亡游戏胜利
void mybullet_move();//我方子弹移动              myplane
void hitEnemyPlane();//击中敌机                  myplane
int ifMyPlane();//遍历敌方子弹是否击中我方飞机
void endGame();//游戏失败结束之后的界面
void endGameWin();//游戏胜利结束之后的界面
void startGame();//游戏开始界面
void Weapon_upgrade();//武器升级
void addLife();//增加生命
void Weapon_move();//武器图标移动
void boss_come();//boss出现
int boss_move();//boss移动
void bossIfMyPlane();//boss子弹是否击中我方飞机
void ifoutside_boss();//限制boos移动范围
void add_boss_bullet();//boss发射子弹
void bossbullet_move();//boss子弹的移动
void life_move();//血包移动
void ifoutsideLife();//限制血包的移动范围
void ifHitBoss();//判断我方是否击中boss         myplane 
void setPos(int x, int y);
int count_eplanes = 3; //同时敌方飞机存在的最大数量
clock_t start_time = 0;//初始化开始游戏时间
COORD g_bk;			//背景的贴图位置
int speed = 57;//随着时间的增加游戏难度加大
int score = 0;//分数
int ifwin = 0;//如果为1则游戏胜利 0则游戏未胜利,或正在游戏中
typedef struct Mybullet
{
   
	int px;//子弹x坐标
	int py;//子弹y坐标
	int speed;//子弹速度
	int if_bullet;//标记子弹 1未打中敌机 0打中敌机
	int kind;//子弹种类 0普通子弹 1进阶子弹
	Mybullet* next;
}mybullet;
mybullet* one_mybullet;
struct Myplane
{
   
	int px;//飞机x轴坐标
	int py;//飞机y轴坐标
	int speed;//飞机速度
	int hp;
}myplane;
typedef struct Enemybullet
{
   
	int px;//敌机子弹x坐标
	int py;//敌机子弹y坐标
	int speed;//敌机子弹速度
	int if_bullet;//1未打中或未出界 0打中或出界
	Enemybullet* next;
}enemybullet;
struct Boss
{
   
	int px;//boss x坐标
	int py;//boss y坐标
	int ph;//boss血量
	enemybullet* ebullet;//boss子弹
};
Boss* bossplane = NULL;
typedef struct Eplanes //敌方飞机
{
   
	int px;//飞机x轴坐标
	int py;//飞机y轴坐标
	int speed;//飞机速度
	int if_eplane;  //1表示敌方飞机存活 0表示毁灭或者出界
	int kind;//飞机的种类 1表示蓝色飞机 2表示绿色飞机
	enemybullet* ebullet;//飞机子弹
	Eplanes* next;
}eplanes;
eplanes* one_eplane;
struct Weapon
{
   
	int px;//武器图标x轴坐标
	int py;//武器图标y轴坐标
	Weapon* next;
};
Weapon* weapon_ins;
struct Life
{
   
	int px;//生命图标x轴坐标
	int py;//生命图标y轴坐标
	Life* next;
};
Life* life_ins;
int main()
{
   
	startGame();
	srand((unsigned int)time(NULL));
	init();
	load();
	while (ifwin==0)
	{
   
		BeginBatchDraw();
		putimage();  //显示图片
		Weapon_upgrade();//武器升级
		addLife();//增加我方飞机血量
		EndBatchDraw();
		if (!_kbhit()) //如果没有按键按下时
		{
   
			eplane_move();//敌机移动
			boss_come();//boss降临
			add_enemybullet();//敌方飞机发射子弹
			add_boss_bullet();//boss发射子弹
			enemybullet_move();//敌方飞机子弹移动
			bossbullet_move();//boss子弹的移动
			mybullet_move();//我方子弹移动
			Sleep(60);
		}
		else
			keydow();
		hitEnemyPlane();//我方子弹是否与敌方发生碰撞
		ifHitBoss();//我方子弹是否与boss相撞
		ifoutside();//限制我方飞机不能飞出屏幕
		BackMove();
		if (ifMyPlane() <= 0)
		{
   
			mciSendString(L"close gemusic", NULL, 0, NULL); // 先把前面一次的音乐关闭
			mciSendString(L"open fjsc/bossboom.mp3 alias gemusic", NULL, 0, NULL); // 打开音乐
			mciSendString(L"play gemusic", NULL, 0, NULL); // 仅播放一次
			//我方飞机爆炸图片
			putimage(myplane.px-10, myplane.py, &myboom2, SRCAND);
			putimage(myplane.px-10, myplane.py, &myboom1, SRCPAINT);
			Sleep(1000);
			break;
			
		}
		if (bossbomm() <= 0)
		{
   
			mciSendString(L"close gemusic", NULL, 0, NULL); // 先把前面一次的音乐关闭
			mciSendString(L"open fjsc/bossboom.mp3 alias gemusic", NULL, 0, NULL); // 打开音乐
			mciSendString(L"play gemusic", NULL, 0, NULL); // 仅播放一次
			if(bossplane!=NULL)
			if (bossplane->ph <= 0)
			{
   //boss爆炸图片
				putimage(bossplane->px+10, bossplane->py, &bossboom2, SRCAND);
				putimage(bossplane->px+10, bossplane->py, &bossboom1,SRCPAINT);
				Sleep(1000);
			}
			ifwin = 1;
		}
	}
	closegraph();
	if(ifwin==0)
		endGame();
	if (ifwin == 1)
		endGameWin();
	getchar();
	return 0;
}
void init()
{
   
	initgraph(W, H);
	g_bk.X = 0;
	g_bk.Y = 0;
	myplane.px = W / 2 - 30;
	myplane.py = H - PH;
	myplane.speed = 18;
	myplane.hp = 12;
	create_eplane();
	create_mybullet(
  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 在 easyx 飞机大战中,发射激光的实现需要以下几个步骤: 1. 定义激光的结构体,包括激光的坐标、速度、颜色、是否有效等属性。 2. 玩家飞机发射激光的实现,可以在玩家按下特定按键时,在玩家飞机的位置创建一个激光,并将其加入到激光数组中。 3. 激光的移动实现,每帧更新激光的坐标位置,将超出窗口范围或者已经击中敌机的激光标记为无效。 4. 检测激光是否与敌机相撞,如果相撞,则将激光标记为无效,并将敌机的生命值减少。 下面是一个简单的示例代码,展示了如何实现激光的发射和移动: ```cpp struct Laser { int x, y; // 激光的坐标 int speed; // 激光的速度 COLORREF color; // 激光的颜色 bool valid; // 激光是否有效 }; const int MAX_LASER_NUM = 20; Laser lasers[MAX_LASER_NUM]; // 激光数组 void shootLaser() { for (int i = 0; i < MAX_LASER_NUM; i++) { if (!lasers[i].valid) { lasers[i].x = player.x; lasers[i].y = player.y - 20; // 发射位置在飞机上方 lasers[i].speed = 10; lasers[i].color = RED; lasers[i].valid = true; break; } } } void updateLasers() { for (int i = 0; i < MAX_LASER_NUM; i++) { if (lasers[i].valid) { lasers[i].y -= lasers[i].speed; if (lasers[i].y < 0) { lasers[i].valid = false; } else { for (int j = 0; j < MAX_ENEMY_NUM; j++) { if (enemies[j].valid && IsCollided(enemies[j], lasers[i])) { enemies[j].valid = false; lasers[i].valid = false; break; } } } } } } ``` 注意,这只是一个简单的示例代码,实际实现中还需要考虑更多细节,如激光与敌机的碰撞检测、激光的发射速度、激光的数量限制等等。 ### 回答2: 在EasyX飞机大战游戏中,发射激光可以通过简单的编程实现。具体操作如下: 1. 在游戏中选择一个飞机作为主角飞机,在主循环中捕获键盘事件。 2. 使用GetAsyncKeyState函数来检测玩家是否按下了空格键,如果按下,则表示发射激光。 3. 在按下空格键后,创建一个激光对象,具体可以使用一个自定义的结构体来表示激光,该结构体包括激光的坐标、速度和绘制标志等属性。 4. 将新创建的激光对象添加到一个激光对象数组中,用来保存当前所有的激光对象。 5. 在主循环中更新激光对象数组中的所有激光对象,根据激光的速度更新激光的坐标位置。 6. 在主循环中绘制激光对象数组中的所有激光对象,根据激光的坐标位置在游戏窗口中绘制激光。 7. 在绘制激光时,可以使用EasyX提供的绘图函数实现,比如使用Line函数绘制一条直线来表示激光。 通过以上步骤,就可以在EasyX飞机大战游戏中实现激光的发射效果。玩家按下空格键后,会在飞机前方出现一个激光,随着时间的推移,激光会向前移动并逐渐消失。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值