笨方法实现基于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(