亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++實現(xiàn)飛機大戰(zhàn)

 更新時間:2020年11月30日 14:30:47   作者:塵客-追夢  
這篇文章主要為大家詳細介紹了C++實現(xiàn)飛機大戰(zhàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了C++實現(xiàn)飛機大戰(zhàn)的具體代碼,供大家參考,具體內(nèi)容如下

開發(fā)工具

vs2019(vs系列都可以),easyx圖形庫

效果展示

源代碼

一些頭文件

myhelp.h文件

#pragma once
#include<easyx.h>
#include<conio.h>
#include<list>
#include<vector>
#include<iostream>
using namespace std;
struct node
{
 int x, y;
 node(int x, int y) :x(x), y(y) {}
 node() { x = 0; y = 0; }
};

airplan.h文件

#pragma once
#include"myhelp.h"
class airplan
{
 node Plan; //自己的飛機
 int px;  //飛機大小
 list<node> enemyPlan; //敵機
public:
 airplan();
 airplan(int x, int y);
 list<node>& getEnemyPlan()
 {
 return enemyPlan;
 }
 node& getPlan()
 {
 return Plan;
 }
 bool planeColide(node& v1, node& v2, int px); //飛機碰撞
 void destoryEnemy(int height);
};

airplan.cpp文件

#include "airplan.h"
airplan::airplan(int x, int y) :Plan(x, y)
{
 px = 40;
}
airplan::airplan(){}
bool airplan::planeColide(node& v1, node& v2, int px)
{
 int x = abs(v1.x - v2.x);
 int y = abs(v1.y - v2.y);
 return y < px&& x < px;
}
void airplan::destoryEnemy(int height)
{
 for (auto it = enemyPlan.begin(); it != enemyPlan.end(); it++)
 {
 if (it->y > height)
 {
 enemyPlan.erase(it);//刪除it當前位置的數(shù)據(jù)
 break;
 }
 }
}

bullet.h文件

#pragma once
#include"myhelp.h"
#include"airplan.h"
class Bullet
{
 list<node> bullet; //子彈節(jié)點
public:
 list<node>& getBullet()
 {
 return bullet;
 }
 void spwnBullet(node& plan); //發(fā)射子彈
 void dextoryBullet(); //銷毀子彈
};

bullet.cpp文件

#include "bullet.h"

void Bullet::spwnBullet(node& plan) //發(fā)射子彈
{
 bullet.push_back(node(plan.x, plan.y + 10));
}
void Bullet::dextoryBullet() //銷毀子彈
{
 for (auto it = bullet.begin(); it != bullet.end(); it++)
 {
 if (it->y < 0)
 {
  bullet.erase(it);
  break;
 }
 }
}

game.h文件

#pragma once
#include"airplan.h"
#include"bullet.h"
class game
{
 int wid;
 int height;
 int grade;
 int px;  //圖片大小
 TCHAR tc[30]; //輸入文字提示
 vector<IMAGE> ving; //圖片
 airplan plan;
 Bullet bullet;
public:
 game(int wid, int height);
 ~game();
 //初始化
 void init();
 //生成敵機
 void spawnEnemy();
 //移動
 void control();
 //飛機撞子彈
 bool bulletCollide(airplan& plan, int px);
 //游戲是否結(jié)束
 bool isGameOver();
 void draw();
 //刷新
 void updata(airplan& plan, Bullet& bullet);
 //開始游戲
 void start();
};

game.cpp文件

#include "game.h"
game::game(int wid, int height) :wid(wid), height(height)
{
 initgraph(wid, height);
 px = 40;
 ving.resize(3);
 loadimage(&ving[0], _T("res/1.jpg"), px, px);
 loadimage(&ving[1], _T("res/2.jpg"), px, px);
 loadimage(&ving[2], _T("res/3.jpg"), px, px);
 grade = 0;
 plan = { wid / 2, height - px * 2 };  //飛機在中間
}
game::~game()
{
 closegraph();
}
void game::init()
{
 grade = 0;
 plan = { wid / 2, height - px * 2 };  //飛機在中間
 bullet.getBullet().clear();
 plan.getEnemyPlan().clear();
}
//生成敵機
void game::spawnEnemy()
{
 static int x = 0; // 敵機的數(shù)量
 if (x >= 20)
 {
 if (plan.getEnemyPlan().size() < 5)
 {
  plan.getEnemyPlan().push_back(node(rand() % (wid - px) + px / 2, 0));
 }
 x = 0;
 }
 x++;
}
//移動
void game::control()
{
 int speed = 4;
 if (GetAsyncKeyState(VK_UP) || GetAsyncKeyState('w'))
 {
 if (plan.getPlan().y > px / 2)
  plan.getPlan().y -= speed;
 }
 if (GetAsyncKeyState(VK_RIGHT) || GetAsyncKeyState('d'))
 {
 if (plan.getPlan().x < wid - px)
  plan.getPlan().x += speed;
 }
 if (GetAsyncKeyState(VK_LEFT) || GetAsyncKeyState('a'))
 {
 if (plan.getPlan().x > 0)
  plan.getPlan().x -= speed;
 }
 if (GetAsyncKeyState(VK_DOWN) || GetAsyncKeyState('s'))
 {
 if (plan.getPlan().y < height - px)
  plan.getPlan().y += speed;
 }
 if (_kbhit())
 {
 if (_getch() == (VK_SPACE))
 {
  bullet.spwnBullet(plan.getPlan());
 }
 }
}
//飛機撞子彈
bool game::bulletCollide(airplan& plan, int px)
{
 for (auto p = bullet.getBullet().begin(); p != bullet.getBullet().end(); p++)
 {
 for (auto en = plan.getEnemyPlan().begin(); en != plan.getEnemyPlan().end(); en++)
 {
  if (plan.planeColide(*p, *en, px))
  {
  bullet.getBullet().erase(p);
  plan.getEnemyPlan().erase(en);
  return true;
  }
 }
 }
 return false;
}
//游戲是否結(jié)束
bool game::isGameOver()
{
 for (auto p : plan.getEnemyPlan())
 {
 if (plan.planeColide(plan.getPlan(), p, px))
 {
  return true;
 }
 }
 return false;
}
void game::draw()
{
 BeginBatchDraw();
 cleardevice();
 for (auto p : plan.getEnemyPlan())
 {
 putimage(p.x, p.y, &ving[0]);
 }
 for (auto p : bullet.getBullet())
 {
 putimage(p.x, p.y, &ving[2]);
 }
 putimage(plan.getPlan().x, plan.getPlan().y, &ving[1]);
 wsprintf(tc, _T("score:%d"), grade);
 outtextxy(wid / 2, px, tc);
 EndBatchDraw();
}
//刷新
void game::updata(airplan& plan, Bullet& bullet)
{
 for (auto& p : plan.getEnemyPlan())
 {
 p.y += 2;
 }
 for (auto& p : bullet.getBullet())
 {
 p.y -= 8;
 }
 if (bulletCollide(plan, px))
 grade++;
 plan.destoryEnemy(height);
 bullet.dextoryBullet();
 spawnEnemy();
}
//開始游戲
void game::start()
{
 while (true)
 {
 updata(plan, bullet);
 control();
 draw();
 if (isGameOver())
 {
  if (MessageBox(GetForegroundWindow(), _T("是否開始新的游戲"), _T("游戲結(jié)束"), MB_YESNO) == IDYES)
  {
  init();
  }
  else
  break;
 }
 Sleep(20);
 }
}


main.cpp文件

#include<iostream>
#include"game.h"
using namespace std;
int main()
{
 game play(360, 630);
 play.start();
 system("pause");
 return 0;
}

素材

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++實現(xiàn)LeetCode(111.二叉樹的最小深度)

    C++實現(xiàn)LeetCode(111.二叉樹的最小深度)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(111.二叉樹的最小深度),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 深入解析C++的WNDCLASS結(jié)構(gòu)體及其在Windows中的應用

    深入解析C++的WNDCLASS結(jié)構(gòu)體及其在Windows中的應用

    這篇文章主要介紹了C++的WNDCLASS結(jié)構(gòu)體及其在Windows中的應用,WNDCLASS被用來定義窗口,文中介紹了其諸多屬性,需要的朋友可以參考下
    2016-01-01
  • Cocos2d-x學習筆記之CCScene、CCLayer、CCSprite的默認坐標和默認錨點實驗

    Cocos2d-x學習筆記之CCScene、CCLayer、CCSprite的默認坐標和默認錨點實驗

    這篇文章主要介紹了Cocos2d-x學習筆記之CCScene、CCLayer、CCSprite的默認坐標和默認錨點實驗,這是一個非常值得研究的問題,需要的朋友可以參考下
    2014-09-09
  • C++設(shè)置事件通知線程工作的方法

    C++設(shè)置事件通知線程工作的方法

    這篇文章主要介紹了C++設(shè)置事件通知線程工作的方法,是Windows應用程序設(shè)計中非常實用的技巧,需要的朋友可以參考下
    2014-10-10
  • Android App仿微信界面切換時Tab圖標變色效果的制作方法

    Android App仿微信界面切換時Tab圖標變色效果的制作方法

    這篇文章主要介紹了Android App仿微信界面切換時Tab圖標變色效果的制作方法,重點講解了圖標的繪制技巧,需要的朋友可以參考下
    2016-04-04
  • Qt信號與槽知識點總結(jié)歸納

    Qt信號與槽知識點總結(jié)歸納

    信號和槽是一種高級接口,應用于對象之間的通信,它是QT的核心特性,下面這篇文章主要給大家介紹了關(guān)于Qt信號與槽知識點總結(jié)歸納的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • c++ 動態(tài)內(nèi)存分配相關(guān)總結(jié)

    c++ 動態(tài)內(nèi)存分配相關(guān)總結(jié)

    這篇文章主要介紹了c++ 動態(tài)內(nèi)存分配相關(guān)的相關(guān)資料,幫助大家更好的理解和學習和使用c++,感興趣的朋友可以了解下
    2021-02-02
  • 詳解c++中的異常

    詳解c++中的異常

    程序在運行過程中,有對也就有錯,正確那么就不用說了,但是如果錯誤,那么我們?nèi)绾慰焖俚亩ㄎ坏藉e誤的位置,以及知道發(fā)生了什么錯誤。當一個函數(shù)發(fā)現(xiàn)自己無法處理的異常,就會拋出一個異常,讓函數(shù)調(diào)用者直接或者間接的處理這個錯誤。本文將詳解介紹c++中的異常
    2021-06-06
  • C語言 strcpy和memcpy區(qū)別詳細介紹

    C語言 strcpy和memcpy區(qū)別詳細介紹

    這篇文章主要介紹了C語言 strcpy和memcpy區(qū)別詳細介紹的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • 詳解C語言數(shù)組中是以列優(yōu)先嗎

    詳解C語言數(shù)組中是以列優(yōu)先嗎

    這篇文章主要給大家介紹了關(guān)于C語言指針名稱及所指變量的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C語言具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-12-12

最新評論