飞机大战.cpp

#include <iostream>
#include <graphics.h>
#include <time.h>
#include <vector>
#include "Plane.h"
#include "runtime.h"
using namespace std;int main()
{bool sign = false;                        //标记我方爆炸效果显示bool state = false;                        //记录游戏结束时的状态bool boss_sign = false;                    //BOSS标记MUSIC music;                            //音乐对象Plane_my myplane;                 //我方飞机对象vector<Plane_enemy> enemy_planevec;           //敌人飞机对象数组PIMAGE gamebackground = newimage();          //背景图片begingame();                          //游戏开始界面playmusic(music);                       //播放音乐函数srand(time(NULL));                      //随机种子,随机数用在敌人飞机xy坐标与飞机属性上getimage(gamebackground, "F:\\visual studio projects\\飞机大战\\图片素材\\背景2.png");setimage(500, 800, gamebackground);          //设置背景图片大小for (int i = 0; i < 2; i++)//产生1个小兵{Plane_enemy enemy_plane(rand() % 2 + 1);//敌人只可能出现小兵和精英兵enemy_planevec.push_back(enemy_plane);  //插入进数组}while (true)//死循环,直到游戏结束{putimage(0, 0, gamebackground);         //输出背景图片//遍历所有敌人for (vector<Plane_enemy>::iterator it = enemy_planevec.begin(); it != enemy_planevec.end(); it++){if (it->getenemy_prop() == 4 && it->gethealth() <= 50)  //如果击败最终BOSS游戏胜利{state = true;             //游戏以胜利状态退出delimage(gamebackground);                        //释放背景图片对象endgame(state, myplane);          //游戏结束界面return 0;}it->move();                        //敌方飞机移动if (it->setgetp_y() >= 760){it->setgetp_x() = rand() % 380;it->setgetp_y() = -(rand() % 101 + 200);}//判断每一个敌人的飞机的子弹是否和我方飞机坐标重合enemy_bullet_hit(it, myplane, sign, myplane.setgetlifenum());}if (myplane.setgetscore()==0 % 10 && myplane.setgetscore()!=0)       //得分是10的倍数且不为0的时候额外增加一个敌人{Plane_enemy enemy_plane(rand() % 2 + 1); //敌人只可能出现小兵和精英兵enemy_planevec.push_back(enemy_plane);       //插入进数组myplane.setgetscore()++;               //得分额外加1myplane.setgetshieldnum() += 2;       //获得两次护盾使用次数}if (myplane.move(enemy_planevec, sign) == true)      //我方飞机移动,参数为敌人飞机数组、标记、返回真时表示我方飞机阵亡,以失败退出游戏{//返回值为true时,以游戏失败状态退出循环state = false;endgame(state,myplane);}//得分到达上限则清空所有敌人,挑战最终BOSSif ((myplane.setgetscore()) >= 120 && boss_sign==false)      //得分大于120且标记为false时执行产生最终boss{enemy_planevec.clear();               //清空所有敌人myplane.setgetunskillnum()++; //必杀次数+1Plane_enemy enemy_plane(4);                //BOSSenemy_planevec.push_back(enemy_plane);    //将BOSS插入进敌人数组中boss_sign = true;                   //只执行一次这段if代码}delay_fps(60);}return 0;
}

runtime.h

#pragma once
#include <graphics.h>
#include "Plane.h"void setimage(int pwidth, int pheight, PIMAGE img_1);//设置图片对象宽高函数
void begingame();//游戏开始
void endgame(bool sign, Plane_my& myplane);//游戏结束界面
void enemy_bullet_hit(vector<Plane_enemy>::iterator it, Plane_my& myplane, bool& sign, int& lifenum);//判断敌方子弹与我方飞机重合函数
void playmusic(MUSIC& music);//播放音乐函数

Plane.h

#pragma once
#include <graphics.h>
#include <ctime>
#include <vector>
using namespace std;struct bulxy//子弹
{int b_x;int b_y;           int prop;//子弹的属性
};class Plane//飞机类
{
public:int health;                          //飞机血量int getwidth();                       //获取飞机宽int getheight();                 //获取飞机高Plane();
protected:int width, height;                    //飞机的宽高int p_x, p_y;                        //飞机横纵坐标clock_t now_1;                      //发射子弹开始时间clock_t now_2;                        //发射子弹后时间int timediff;                      //发射子弹时间差 now_2 - 1int sign;                            //区分飞机变量bulxy temp;                         //用于向数组中插入结构vector <bulxy> bullvec;               //子弹动态数组
};class Plane_enemy : public Plane
{
public:int& setgetp_x();                    //获取和修改敌人飞机xy坐标值int& setgetp_y();int getenemy_prop();                   //获取和敌人的prop属性*****int gethealth();                 //获取敌人血量值vector<bulxy>& getenemy_bullvec();   //获取敌人的子弹数组Plane_enemy(int prop);               //根据参数,为敌人飞机对象初始化坐标、血量、图片信息void move();                      //敌人移动private:PIMAGE enemy_img_1;       //敌人小兵PIMAGE bulletimg;     //子弹图片对象int planeprop;                  //飞机属性int speed_x, speed_y;     //子弹速度每帧x轴和y轴移动单位数int attack;                       //敌机攻速(攻击间隔)inline void pushlaunch();         //向数组插入\新建子弹inline void attackspeed();          //子弹发射速度inline void laumoveunit();          //子弹速度函数inline void laudire();              //子弹移动方向函数inline void laushow();                //显示子弹函数inline void laudelete();            //删除越界子弹函数void planlaunch();                    //封装所有子弹相关函数
};class Plane_my :public Plane
{
private:const PIMAGE findplaneimg;  //我方飞机图片对象const PIMAGE bulletimg;   //子弹图片对象const PIMAGE shieldimg; //护盾图片对象const PIMAGE shieldicon;    //护盾图标const PIMAGE unskillimg;  //必杀图片对象const PIMAGE unskillicon;   //必杀图标char key;                         //接收键值int inerdis;                      //飞机惯性走的距离bool sign;                        //是否播放爆炸效果int atemp;                            //记录子弹爆炸效果的次数int btarg_x, btarg_y;          //记录集中敌人的子弹位置int btemp;                         //记录自身爆炸效果的次数int score;                         //游戏得分bool shieldsign;              //标记护盾开启clock_t shiledtime_1;               //记录护盾时间clock_t shiledtime_2;int shieldnum;                     //护盾使用次数bool unskillsign;               //标记必杀开启clock_t unskilltime_1;              //记录必杀时间clock_t unskilltime_2;int unskillnum;                       //必杀技使用次数bool upgrade;                  //飞机是否已升级int lifenum;                       //我方飞机的生命数量PIMAGE explimgarr[3];            //爆炸效果图片对象数组int i;                              //用于循环MUSIC music;                          //音乐对象void alterbullplan();//升级飞机和子弹外观void pushlaunch();//新建子弹inline void launmove();//子弹移动void launch();//发射子弹,参数区分不同的飞机和图片void beattack(vector<Plane_enemy>& enemy_planevec, bool& explsign);//攻击敌人与被敌人攻击void twoskill(vector<Plane_enemy>& enemy_planevec);//两个技能void controlmove();//飞机接收键值移动void putInterface();//输出界面信息public:Plane_my();//构造初始化图片和坐标等,只会执行一次~Plane_my();//析构释放图片对象内存vector<bulxy> getlaunxy();       //获取我方飞机子弹的坐标数组int& setgetplane_x();        //获取或设置坐标int& setgetplane_y();int& setgetscore();       //获取或设置得分char& setgetkey();         //获取或设置键值int& setgetshieldnum();            //获取或设置护盾使用次数int& setgetunskillnum();       //获取或设置必杀使用次数int& setgetlifenum();          //获取或设置我方飞机生命数//飞机移动bool move(vector<Plane_enemy>& enemy_planevec, bool& explsign);//飞机移动函数,包括升级等操作
};

runtime.cpp

#include <iostream>
#include <graphics.h>
#include "Plane.h"
#include "runtime.h"
using namespace std;void setimage(int pwidth, int pheight, PIMAGE img_1)
{int whidth = getwidth(img_1), height = getheight(img_1);PIMAGE tempimg = newimage(pwidth, pheight);putimage(tempimg, 0, 0, pwidth, pheight, img_1, 0, 0, whidth, height);   //将原本img中的图像拉伸绘制到img_2中getimage(img_1, tempimg, 0, 0, pwidth, pheight);      //img再获取temp中的图像delimage(tempimg);
}void begingame()
{initgraph(500, 760, INIT_RENDERMANUAL);    //初始化图形界面,手动渲染模式setcaption("飞机大战");PIMAGE beginimg = newimage();getimage(beginimg, "F:\\visual studio projects\\飞机大战\\图片素材\\背景.png");setimage(540, 760, beginimg);PIMAGE planetextimg = newimage();getimage(planetextimg, "F:\\visual studio projects\\飞机大战\\图片素材\\字体.png");setimage(500, 340, planetextimg);putimage(0, 0, beginimg);putimage_withalpha(NULL, planetextimg, 0, 0);setfont(26, 0, "楷体");setcolor(YELLOW); setbkmode(1);//文字背景色透明outtextxy(150, 400, "鼠标点击以开始");mouse_msg msg = { 0 };              //接收开始游戏的鼠标信息while (true){msg = getmouse();                //获取一条鼠标信息if (msg.is_left()) break;}delimage(beginimg); delimage(planetextimg);
}void endgame(bool sign, Plane_my& myplane)
{PIMAGE winbackimg = newimage();   getimage(winbackimg, "F:\\visual studio projects\\飞机大战\\图片素材\\游戏结束背景.png");setimage(500, 760, winbackimg);putimage(0, 0, winbackimg);setfont(64, 0, "楷体");sign ? outtextxy(186, 120, "胜利!") : outtextxy(186, 120, "失败!");setfont(36, 0, "楷体");myplane.setgetscore() += rand() % 10;xyprintf(162, 220, "最终得分:%d", myplane.setgetscore());delimage(winbackimg);while (true) delay_fps(1);exit(0);
}void enemy_bullet_hit(vector<Plane_enemy>::iterator it, Plane_my& myplane, bool& sign, int& lifenum)
{for (vector<bulxy>::iterator ait = it->getenemy_bullvec().begin(); ait != it->getenemy_bullvec().end(); ait++)if (ait->b_x >= myplane.setgetplane_x() && ait->b_x <= myplane.setgetplane_x() + 80 &&ait->b_y + 18 >= myplane.setgetplane_y() && ait->b_y + 18 <= myplane.setgetplane_y() + 86 ||ait->b_x + 18 >= myplane.setgetplane_x() && ait->b_x + 18 <= myplane.setgetplane_x() + 80 &&ait->b_y + 18 >= myplane.setgetplane_y() && ait->b_y + 18 <= myplane.setgetplane_y() + 86){myplane.health -= 50;it->getenemy_bullvec().erase(ait);   //删除敌人的该子弹if (myplane.health <= 0 && lifenum >= 0){myplane.setgetplane_x() = 210;  //坐标重置myplane.setgetplane_y() = 660;myplane.health = 400;         //血量重置lifenum--;                        //生命-1myplane.setgetkey() = 0;     //键值重置}sign = true;    //爆炸效果标记开启break;}
}void playmusic(MUSIC& music)
{music.OpenFile("F:\\visual studio projects\\飞机大战\\音乐\\back.wav");music.Play(1);
}

Plane.cpp

#include "Plane.h"
#include "runtime.h"
#include <iostream>
#include <graphics.h>
#include <vector>
using namespace std;int Plane::getheight()//飞机高
{return height;
}int Plane::getwidth()//飞机宽
{return width;
}Plane::Plane()//构造函数
{health = 0;width = 0;height = 0;p_x = 0;p_y = 0;now_1 = clock();now_2 = 0;timediff = 0;sign = 0;temp.b_x = 0;temp.b_y = 0;temp.prop = 0;
}void Plane_enemy::move()
{planlaunch();      //发射子弹if ((p_y + height) <= 0) {//血量switch (planeprop){case 1:health = 150; break;case 2:health = 250; break;case 3:health = 440; break;case 4:health = 20000;}}//根据飞机不同属性确定飞机移动速度switch (planeprop){case 1:case 2:        //大小兵p_y += 2; break;case 3:      //精英飞机p_y++; break;case 4:        //最终BOSS    仅缓慢移动一小段距离if (p_y <= -120) p_y++;}putimage_withalpha(NULL, enemy_img_1, p_x, p_y);    //显示飞机图片
}inline void Plane_enemy::attackspeed()
{now_2 = clock();timediff = now_2 - now_1;    //通过上一次发射子弹时间减去当前时间计算出已发射子弹的时间switch (planeprop)            //根据不同飞机,设定飞机发射子弹后多长时间再发射一枚子弹{case 1: //小兵attack = 800; break;case 2: //大兵attack = 700; break;case 3:  //小BOSSattack = 650; break;case 4: //最终BOSSattack = 300;}if (timediff >= attack)      //发射子弹后固定时间后,再次发射子弹 攻击速度{pushlaunch();timediff = 0;now_1 = clock();}
}int Plane_enemy::gethealth()
{return health;
}int Plane_enemy::getenemy_prop()
{return planeprop;
}int& Plane_enemy::setgetp_x()
{return p_x;
}int& Plane_enemy::setgetp_y()
{return p_y;
}vector<bulxy>& Plane_enemy::getenemy_bullvec()
{return bullvec;
}Plane_enemy::Plane_enemy(int prop)
{//初始化enemy_img_1 = newimage();        //敌人小兵bulletimg = newimage();      //子弹图片对象planeprop = 0;                 //飞机属性speed_x = 0, speed_y = 0;       //子弹速度每帧x轴和y轴移动单位数attack = 0;this->planeprop = prop;       //将传进来的参数赋给类变量switch (prop)//根据属性获取不同的子弹图片素材,设置飞机宽高{case 1:case 2:       //大小兵getimage(bulletimg, "F:\\visual studio projects\\飞机大战\\图片素材\\敌人子弹1.png");setimage(18, 18, bulletimg);width = 120, height = 90;break;case 3:        //精英飞机getimage(bulletimg, "F:\\visual studio projects\\飞机大战\\图片素材\\敌人子弹2.png");setimage(18, 18, bulletimg);width = 240, height = 180;break;case 4:      //最终BOSSgetimage(bulletimg, "F:\\visual studio projects\\飞机大战\\图片素材\\敌人导弹.png");setimage(40, 81, bulletimg);//子弹图片大小width = 480, height = 360;}p_x = rand() % 380, p_y = -(rand() % 101 + 200);          //随机横纵坐标switch (prop)//设定血量{case 1:getimage(enemy_img_1, "F:\\visual studio projects\\飞机大战\\图片素材\\敌人飞机大兵.png");health = 150;                 //血量break;case 2:getimage(enemy_img_1, "F:\\visual studio projects\\飞机大战\\图片素材\\敌人飞机精英怪.png");health = 250;break;case 3:getimage(enemy_img_1, "F:\\visual studio projects\\飞机大战\\图片素材\\敌人飞机BOSS2.png");health = 440;break;case 4:getimage(enemy_img_1, "F:\\visual studio projects\\飞机大战\\图片素材\\敌人飞机BOSS1.png");health = 20000;            //血量p_x = 10, p_y = -360; //BOSS从固定位置出发}setimage(width, height, enemy_img_1);         //设置图片宽高
}inline void Plane_enemy::pushlaunch()                  //向数组插入\新建子弹
{//根据属性确定子弹发射的位置和方式switch (planeprop){case 1:       //小兵case 2:     //大兵子弹temp.b_x = p_x + 51, temp.b_y = p_y + 60; //确定新子弹的位置temp.prop = 2;                       //子弹属性向左bullvec.push_back(temp);            //将子弹插入进数组中temp.prop = 3;                      //子弹属性向右bullvec.push_back(temp);break;case 3:       //小BOSS子弹temp.b_x = p_x + 110, temp.b_y = p_y + 180;    //确定新子弹的位置temp.prop = 2;                       //子弹属性向左bullvec.push_back(temp);temp.prop = 3;                     //子弹属性向右bullvec.push_back(temp);temp.prop = 1;                     //子弹属性向下bullvec.push_back(temp);break;case 4:       //最终BOSS子弹//所有子弹位于y轴位于p_y + 160,子弹属性为1temp.b_y = p_y + 160, temp.prop = 1;//分别设置每发子弹的x轴,然后将这枚子弹插入进子弹数组中temp.b_x = p_x - 20;bullvec.push_back(temp);temp.b_x = p_x + 76;bullvec.push_back(temp);temp.b_x = p_x + 172;bullvec.push_back(temp);temp.b_x = p_x + 268;bullvec.push_back(temp);temp.b_x = p_x + 364;bullvec.push_back(temp);temp.b_x = p_x + 460;bullvec.push_back(temp);}
}inline void Plane_enemy::laumoveunit()
{//根据飞机属性,确定飞机子弹的xy轴每帧移动单位switch (planeprop){case 1:case 2:      //小大兵speed_x = 4, speed_y = 4; break;case 3:      //精英兵speed_x = 6, speed_y = 18; break;case 4:     //最终BOSSspeed_x = 0, speed_y = 8;}
}inline void Plane_enemy::laudire()
{//所有子弹移动//根据子弹的属性,确定不同子弹的运动方向//通过对子弹的坐标进行+= 或 -=实现int bullsizetemp = bullvec.size();for (int i = 0; i < bullsizetemp; i++)switch (bullvec[i].prop)        //判断每一个子弹的属性,根据属性决定子弹移动方向{case 1:        //子弹1运动垂直向下bullvec[i].b_y += speed_y; //垂直向下子弹仅移动y轴break;case 2:      //子弹2运动向左下bullvec[i].b_y += speed_y, bullvec[i].b_x -= speed_x;  //左下子弹y轴逐渐增加,x轴减小break;case 3:       //右下bullvec[i].b_y += speed_y, bullvec[i].b_x += speed_x;   //右下子弹y轴逐渐增加,x轴增大break;}
}inline void Plane_enemy::laushow()
{//遍历子弹数组,显示所有子弹//这里使用自动数据类型变量遍历结构xy属性for (auto bullvectempi : bullvec)putimage_withalpha(NULL, bulletimg, bullvectempi.b_x, bullvectempi.b_y);
}inline void Plane_enemy::laudelete()
{//删除敌人越界的子弹for (vector<bulxy>::const_iterator it = bullvec.begin(); it != bullvec.end(); it++)if (it->b_y >= 800 || it->b_x + 18 <= 0 || it->b_x >= 500){bullvec.erase(it);break;}
}void Plane_enemy::planlaunch()
{attackspeed();         //子弹射速函数laumoveunit();          //子弹速度函数laudire();              //子弹方向函数laushow();              //显示子弹函数laudelete();            //删除越界子弹函数
}void Plane_my::alterbullplan()
{getimage(findplaneimg, "F:\\visual studio projects\\飞机大战\\图片素材\\己方红色飞机.png");setimage(80, 86, findplaneimg);getimage(bulletimg, "F:\\visual studio projects\\飞机大战\\图片素材\\我方导弹.png");setimage(17, 37, bulletimg);upgrade = true;       //是否已经升级
}void Plane_my::pushlaunch()
{if (upgrade) {     //如果已经升级temp.b_x = p_x - 10, temp.b_y = p_y + 40;bullvec.push_back(temp);temp.b_x = p_x + 31, temp.b_y = p_y + 40;bullvec.push_back(temp);temp.b_x = p_x + 73, temp.b_y = p_y + 40;bullvec.push_back(temp);return;}//没有升级temp.b_x = p_x + 24, temp.b_y = p_y - 20;    //确定新子弹的位置bullvec.push_back(temp);          //在子弹数组中插入新的子弹
}inline void Plane_my::launmove()
{//所有子弹移动if (upgrade)                               //如果已经升级飞机则提升弹道速度for (int i = 0; i < bullvec.size(); i++)bullvec[i].b_y -= 24;               //升级后的速度elsefor (int i = 0; i < bullvec.size(); i++)bullvec[i].b_y -= 16;                //一般速度//输出所有子弹for (int i = 0; i < bullvec.size(); i++)putimage_withalpha(NULL, bulletimg, bullvec[i].b_x, bullvec[i].b_y);
}void Plane_my::launch()
{now_2 = clock();          //精确到毫秒获取时间timediff = now_2 - now_1;   //计算子弹发射时间差int attack = 0;             //时间间隔if (upgrade)              //如果已经升级飞机则提升攻速attack = 180;           //升级后的攻速elseattack = 320;          //一般攻速if (timediff >= attack) {     //发射子弹后时间大于一定数值(毫秒)则再次发射子弹pushlaunch();           //新建子弹timediff = 0;            //累计时间重置now_1 = clock();       //重新获取子弹发射时时间}launmove();                   //子弹移动//删除我方越界的子弹for (vector<bulxy>::const_iterator it = bullvec.begin(); it != bullvec.end(); it++)if (it->b_y <= -80) {bullvec.erase(it);break;}
}void Plane_my::beattack(vector<Plane_enemy>& enemy_planevec, bool& explsign)
{if (!unskillsign)          //在没有释放必杀技时不停发射子弹launch();              //发射子弹int enemy_sizex, enemy_sizey; //敌人飞机宽高变量for (vector<Plane_enemy>::iterator enemy_it = enemy_planevec.begin(); enemy_it != enemy_planevec.end(); enemy_it++){for (vector<bulxy>::const_iterator it = bullvec.begin(); it != bullvec.end(); it++){enemy_sizex = enemy_it->getwidth(), enemy_sizey = enemy_it->getheight();  //敌人飞机的宽高//如果有一发子弹的坐标与敌人重合,则敌人掉血if (it->b_x + 17 >= enemy_it->setgetp_x() && it->b_x + 17 <= enemy_it->setgetp_x() + enemy_sizex &&it->b_y >= enemy_it->setgetp_y() && it->b_y <= enemy_it->setgetp_y() + enemy_sizey){enemy_it->health -= 50;                   //敌人的飞机血量减少btarg_x = it->b_x, btarg_y = it->b_y;    //记录爆炸效果坐标sign = true;                         //控制爆炸效果if (enemy_it->health <= 0)               //如果本次击中的敌人的血量<=0{switch (enemy_it->getenemy_prop())     //根据消灭的敌人,增加不同得分{case 1:score++;break;case 2:score += 2;break;case 3:score += 4;break;case 4:score += 21;}enemy_planevec.erase(enemy_it);            //删除与我方子弹重合且血量为空的飞机//产生一个新的敌军飞机Plane_enemy enemy_plane(rand() % 3 + 1);//敌人enemy_planevec.push_back(enemy_plane);  //插入进敌人飞机数组goto L1;                         //跳出双重循环}bullvec.erase(it);     //删除这个击中敌人的子弹break;}}}L1://击中敌人时子弹处爆炸效果if (sign) {if (music.GetPlayStatus() == MUSIC_MODE_STOP) {music.Play(100, 400);}   //播放击中音效,必须在该音效播放完毕后播放putimage_withalpha(NULL, explimgarr[atemp], btarg_x - 17, btarg_y);atemp++;          //根据爆炸图片数组来显示爆炸效果if (atemp > 2)      //播放完毕停止sign = false, atemp = 0;  //关闭信号,重置数组下标}//被敌人击中时自己的爆炸效果,显示在飞机之上if (explsign) {if (music.GetPlayStatus() == MUSIC_MODE_STOP) {music.Play(80, 450);}//播放击中音效,必须在该音效播放完毕后播放putimage_withalpha(NULL, explimgarr[btemp], p_x + 20, p_y + 20);btemp++;           //根据爆炸图片数组来显示爆炸效果if (btemp > 2) {explsign = false, btemp = 0;//播放完毕停止}}
}void Plane_my::twoskill(vector<Plane_enemy>& enemy_planevec)
{unskilltime_2 = clock();      //必杀开启之后的时间int temptime_1 = unskilltime_2 - unskilltime_1; //相减if (unskillsign)                //如果必杀开启{//同时使用一次护盾,不消耗次数shieldsign = true;     //护盾开启标记shiledtime_1 = clock();    //护盾开启时的时间putimage_withalpha(NULL, unskillimg, p_x - 32, p_y - 690);    //显示护盾图片health = 400;          //血量恢复且护盾时效内不会掉血if (temptime_1 >= 6000) {unskillsign = false;//必杀有效时间}//必杀技攻击敌人的判定,这里只判断x轴for (vector<Plane_enemy>::iterator enemy_it = enemy_planevec.begin(); enemy_it != enemy_planevec.end(); enemy_it++){int enemy_sizex = 0;   //敌人飞机的大小xyswitch (enemy_it->getenemy_prop()){case 1:case 2:enemy_sizex = 120;break;case 3:enemy_sizex = 240;break;case 4:enemy_sizex = 480;}//根据敌机的大小判断位置,这里只判断x轴if ((p_x - 16 < enemy_it->setgetp_x()) || (p_x - 16 > enemy_it->setgetp_x() + enemy_sizex)) {continue;}enemy_it->health -= 50;          //敌人的飞机血量减少btarg_x = p_x + 30, btarg_y = enemy_it->setgetp_y() + 50; //记录爆炸效果坐标,根据敌机坐标确认if (enemy_it->getenemy_prop() == 4) {btarg_y += 160;}                          //如果击中的敌人是最终BOSS则单独确定爆炸位置sign = true;                  //控制爆炸效果if (enemy_it->health > 0) {continue;}     //如果本次击中的敌人的血量减少后>0 结束本次循环switch (enemy_it->getenemy_prop())  //根据消灭的敌人,增加得分{case 1:score++;break;case 2:score += 2;break;case 3:score += 4;break;case 4:score += 21;}enemy_planevec.erase(enemy_it);  //删除与我方子弹重合且血量为空的飞机//产生一个新的敌军飞机Plane_enemy enemy_plane(rand() % 3 + 1);//敌人enemy_planevec.push_back(enemy_plane);  //插入进敌人飞机数组break;}}shiledtime_2 = clock();     //护盾开启之后的时间int temptime_2 = shiledtime_2 - shiledtime_1;   //相减if (shieldsign)             //如果护盾开启{putimage_withalpha(NULL, shieldimg, p_x - 22, p_y - 10);health = 400;         //血量恢复且护盾时效内不会掉血if (temptime_2 >= 5000) shieldsign = false;        //护盾有效时间}
}void Plane_my::controlmove()
{//移动//键盘按下if (kbhit()){//接收一个键值key = getch();switch (key){case 'w':             //w飞机向上飞,并且确定一个向上滑行距离p_y -= 6;          //移动距离inerdis = p_y - 18;  //惯性距离break;case 'a':p_x -= 6;inerdis = p_x - 18;break;case 's':p_y += 6;inerdis = p_y + 18;break;case 'd':p_x += 6;inerdis = p_x + 18;break;case 'e':            if (shieldnum <= 0)     break;shieldsign = true;   shiledtime_1 = clock();    shieldnum--;break;case 'q':if (unskillnum <= 0)break;unskillsign = true; unskilltime_1 = clock();unskillnum--;  break;case ' '://空格键暂停putimage_withalpha(NULL, findplaneimg, p_x, p_y);getch();}}//确定飞机滑行时的速度和限制飞机移动范围switch (key){case 'w':if (p_y >= inerdis) p_y -= 2;  //飞机结束移动后向特定位置滑行一段距离if (p_y <= 0) p_y = 0;         //飞机坐标越界则重置坐标break;case 'a':if (p_x >= inerdis) p_x -= 2;if (p_x <= 0) p_x = 0;break;case 's':if (p_y <= inerdis) p_y += 2;if (p_y >= 674) p_y = 674;break;case 'd':if (p_x <= inerdis) p_x += 2;if (p_x >= 420) p_x = 420;}
}void Plane_my::putInterface()
{setfont(30, NULL, "黑体");xyprintf(0, 0, "得分:%d", score);setfont(24, NULL, "黑体");xyprintf(0, 50, "生命值:%d", health);xyprintf(0, 90, "生命:%d", lifenum);//图标setfont(20, NULL, "楷体");outtextxy(6, 380, "护盾E");putimage_withalpha(NULL, shieldicon, 10, 410);  //护盾图标xyprintf(24, 460, "%d", shieldnum);             //护盾剩余使用次数outtextxy(1, 510, "必杀技Q");putimage_withalpha(NULL, unskillicon, 12, 540);   //必杀图标  ++xyprintf(26, 590, "%d", unskillnum);          //必杀剩余使用次数
}Plane_my::Plane_my() :findplaneimg(newimage()), bulletimg(newimage()), shieldimg(newimage()),
shieldicon(newimage()), unskillicon(newimage()), unskillimg(newimage())
{key = 0;inerdis = 0;     sign = false;atemp = 0;                       btarg_x = 0;btarg_y = 0;      btemp = 0;                 score = 0;                     shieldsign = false;                shiledtime_1 = 0;          shiledtime_2 = 0;shieldnum = 3;                       unskillsign = false;               unskilltime_1 = 0;         unskilltime_2 = 0;unskillnum = 2;                 upgrade = false;               lifenum = 3;                       i = 0;width = 80;height = 86;    //飞机宽高//获取并修改图片素材getimage(findplaneimg, "F:\\visual studio projects\\飞机大战\\图片素材\\己方蓝色飞机.png");setimage(width, height, findplaneimg);getimage(bulletimg, "F:\\visual studio projects\\飞机大战\\图片素材\\己方普通子弹.png");setimage(34, 74, bulletimg);getimage(shieldimg, "F:\\visual studio projects\\飞机大战\\图片素材\\护盾.png");setimage(120, 120, shieldimg);getimage(shieldicon, "F:\\visual studio projects\\飞机大战\\图片素材\\护盾.png");setimage(40, 40, shieldicon);getimage(unskillimg, "F:\\visual studio projects\\飞机大战\\图片素材\\激光.png");setimage(160, 700, unskillimg);getimage(unskillicon, "F:\\visual studio projects\\飞机大战\\图片素材\\激光.png");setimage(40, 40, unskillicon);for (i = 0; i < 3; i++) explimgarr[i] = newimage();//数组中总共1张图片,每张图片有两张重复帧for (i = 0; i < 3; i++) getimage(explimgarr[i], "F:\\visual studio projects\\飞机大战\\图片素材\\爆炸.png");p_x = 220, p_y = 660;      //飞机初始坐标health = 400;              //血量music.OpenFile("F:\\visual studio projects\\飞机大战\\音乐\\击中音效.wav");//打开音乐文件函数
}Plane_my::~Plane_my()
{delimage(findplaneimg);delimage(bulletimg);delimage(shieldimg);delimage(shieldicon);delimage(unskillicon);delimage(unskillimg);for (int i = 0; i < 3; i++) delimage(explimgarr[i]);  //释放爆炸效果数组
}vector<bulxy> Plane_my::getlaunxy()      //获取我方飞机子弹的坐标数组
{return bullvec;
}int& Plane_my::setgetplane_x()     //获取或设置坐标
{return p_x;
}int& Plane_my::setgetplane_y()
{return p_y;
}int& Plane_my::setgetscore()           //获取或设置得分
{return score;
}char& Plane_my::setgetkey()            //获取或设置键值
{return key;
}int& Plane_my::setgetshieldnum()           //获取或设置护盾使用次数
{return shieldnum;
}int& Plane_my::setgetunskillnum()      //获取或设置必杀使用次数
{return unskillnum;
}int& Plane_my::setgetlifenum()         //获取或设置我方飞机生命数
{return lifenum;
}bool Plane_my::move(vector<Plane_enemy>& enemy_planevec, bool& explsign)
{if (score >= 40)   alterbullplan();//得分大于40则升级putInterface();                      //输出界面信息twoskill(enemy_planevec);               //两个技能相关if (!lifenum)   return true;controlmove();                      //接收键值移动飞机putimage_withalpha(NULL, findplaneimg, p_x, p_y);//在飞机坐标位置显示飞机beattack(enemy_planevec, explsign); //攻击敌人与被敌人攻击return false;
}

VS2019编写,四个文件:飞机大战.cpp,  Plane.h,  runtime.h,  runtime.cpp,  Plane.cpp

需要音频文件和图片资源,用背景透明的png图片

需要ege图形库

c++课程设计:飞机大战(图形化界面)相关推荐

  1. 数据库课程设计 python+mysql+图形化界面

    进行操作的表 增加界面 import tkinter as tk import pymysqldef frame():global rootroot = tk.Tk()root.title('录入窗口 ...

  2. java飞机大战流程图_JAVA课程设计-飞机大战

    JAVA课程设计-飞机大战 1.团队名称.团队成员介绍 1.1 团队名称:做个飞机哦 1.2团队成员介绍: 余俊良(组长):编写博客.游戏主界面设计与实现.英雄机与子弹类的实现.场景设计 林祥涛:游戏 ...

  3. C语言课程设计 — 飞机大战

    这个游戏的功能很单一,也就是"飞机大战",哈哈哈哈.总共只有300多行代码左右,你也可以想想它会有多简陋,把它复制下来编译一下可以直接执行,需要的同学可以自取~ PS:我运行的环境 ...

  4. java飞机大战流程图_JAVA课程设计——飞机大战(团队)

    1.团队名称.团队成员介绍 黄力强(组长) 带带带带...带佬 陈汉煜(组员) 划水.gif 2.Gitee部分 3.项目功能架构图与主要功能流程图 游戏流程图: 面向对象设计 包图: uml(关键类 ...

  5. java飞机英雄大战代码ppt_Java课程设计--飞机大战

    #一. 团队介绍 成员姓名 任务分配 文**(组长) GUI.数据持久化 李** 背景音乐.博客撰写 #二. 参考代码 #三. 项目git地址 #四. 项目git提交记录截图,老师将重点考核 #五. ...

  6. windows API 开发飞机订票系统 图形化界面 (一)

    去年数据结构课程设计的作品,c语言实现,图形化界面使用windows API实现. 首发在我csdn博客:http://blog.csdn.net/u013805360/article/details ...

  7. 利用 Tkinter 打造专属图形化界面:设计签名

    大家好,今天本期带着大家制作一个属于自己的GUI图形化界面:用于设计签名的哦(效果如下图),是不是感觉很好玩,是不是很想学习呢? 限于篇幅,今天我们首先详细讲述一下Tkinter的使用方法.本来不准备 ...

  8. Java图形化界面设计——容器(JFrame)

    Java图形化界面设计--容器(JFrame) 程序是为了方便用户使用的,因此实现图形化界面的程序编写是所有编程语言发展的必然趋势,在命令提示符下运行的程序可以让我们了解java程序的基本知识体系结构 ...

  9. python使用界面-(八)Python 图形化界面设计

    3.1.文本输入和输出相关控件:文本的输入与输出控件通常包括:标签(Label).消息(Message).输入框(Entry).文本框(Text).他们除了前述共同属性外,都具有一些特征属性和功能. ...

  10. 零基础学Python【二十三、图形化界面设计 】(基础一篇全,欢迎认领)

    1.图形化界面设计的基本理解 当前流行的计算机桌面应用程序大多数为图形化用户界面(Graphic User Interface,GUI). 即通过鼠标对菜单.按钮等图形化元素触发指令,并从标签.对话框 ...

最新文章

  1. 2019计算机考研在职研究生,2019双证在职研究生报名条件
  2. eclipse打包jar发布到linux下运行出错(java.lang.ClassNotFoundException: cmd.WordCount$MyMapper )
  3. 制造领域的人工智能技术
  4. Java 文件的拷贝
  5. server sql 众数_sql 语句系列(众数中位数与百分比)[八百章之第十五章]
  6. C++基础02-C++对c的拓展
  7. SBUS协议及编解码
  8. 2009 managertool software download..........
  9. python request 库传送formdata_Python Requests库 form-data 上传文件操作
  10. OpenEphyra学习笔记1
  11. UBUNTU中更改文件的打开方式
  12. WD西部数据内置硬盘编号说明书
  13. 如何释放计算机内存吗,Win7如何释放内存?三招帮你将电脑中的垃圾全部清理掉!...
  14. 在html中打字如何变大,怎么把网页的字变大?教你网页操作实用技巧【步骤详解】...
  15. 理解PHP网页运行原理
  16. QEMU imx6ul开发板环境搭建
  17. LANDESK8.8版本操作说明书之核心服务器管理
  18. 2020.08.10多态
  19. saas商城跟源码商城对比优势在哪里
  20. JAVA个人博客系统毕业设计,个人博客系统设计与实现,个人博客网页设计毕设作品

热门文章

  1. 哪款蓝牙耳机佩戴比较舒适,适合踏青佩戴的蓝牙耳机推荐
  2. Zhi-同步与异步,阻塞与非阻塞
  3. linux中df命令用法,详细分析Linux df命令的使用方法
  4. python根号运算符_Python 运算符
  5. python元组和列表都支持的方法_(3)python 列表和元组
  6. 邻居表项的STALE状态超时时间
  7. SQL Server: 数据库模式SCHEMA
  8. python爬取学校新闻_Python抓取学院新闻报告
  9. windows10装ubuntu16.04双系统完全版教程!!
  10. 手把手教你如何在win7(windows7)下进行java环境变量配置