21xrx.com
2024-11-05 14:44:12 Tuesday
登录
文章检索 我的文章 写文章
C++源代码:飞机大战
2023-07-13 06:20:53 深夜i     --     --
C++编程 飞机游戏 自动射击 关卡设计 图形界面设计

飞机大战是一款非常经典的游戏,在各种平台上都有它的存在。本文将分享一个基于C++的飞机大战源码,希望对学习C++游戏开发的初学者们有所帮助。

首先,我们来了解一下游戏的基本逻辑。游戏中分为玩家和敌人两个阵营,玩家通过键盘控制自己的飞机进行移动和开火,敌人则会不断向玩家飞机发射子弹,玩家需要躲避并尽可能多地消灭敌人,最终获得胜利。游戏演示如下:

[演示视频]

接着,我们来看一下源代码的具体实现。首先是游戏中的飞机类:

class Plane{

public:

  int x,y; //飞机的坐标

  int sx,sy; //飞机的速度

  int life; //飞机的生命值

  char pic[20][20]; //飞机的图像

  void init(int x,int y,int sx,int sy,char pic[20][20]); //初始化函数

  void move(); //移动函数

  void display(); //绘制函数

};

在这个类中,我们定义了飞机的坐标、速度、生命值和图像等基本属性,并且实现了初始化、移动和绘制函数。例如,移动函数的实现如下:

void Plane::move(){

  x += sx;

  y += sy;

}

这个函数表示飞机的移动是将飞机的坐标加上速度,从而实现位置的更新。而绘制函数则是将飞机的图像绘制在屏幕上,这里使用了Windows API函数来实现:

void Plane::display(){

  //获取窗口句柄

  HWND hwnd = GetForegroundWindow();

  HDC hdc = GetDC(hwnd);

  //设置颜色

  SetTextColor(hdc,RGB(255,0,0));

  //绘制图像

  for(int i=0;i<20;i++){

    for(int j=0;j<20;j++){

      if(pic[i][j]=='*'){

        TextOut(hdc,x+j,y+i,"*",1);

      }

    }

  }

  //释放句柄

  ReleaseDC(hwnd,hdc);

}

接下来是子弹类的实现:

class Bullet{

public:

  int x,y; //子弹的坐标

  int sy; //子弹的速度

  char pic[2]; //子弹的图像

  void init(int x,int y,char pic[2]); //初始化函数

  void move(); //移动函数

  void display(); //绘制函数

};

子弹类的基本属性包括坐标、速度和图像等,实现了初始化、移动和绘制函数。飞机和子弹的类定义类似,这里不再赘述。

在游戏的主程序中,我们创建了玩家和敌人的飞机以及子弹,并且循环进行运算,识别键盘按键来控制玩家飞机的移动和发射子弹:

while(1){

  //清屏

  system("cls");

  //更新玩家飞机

  player_plane.move();

  player_plane.display();

  //更新敌人飞机

  for(int i=0;i

    enemy_plane[i].move();

    enemy_plane[i].display();

  }

  //更新子弹

  for(int i=0;i

    bullet[i].move();

    bullet[i].display();

  }

  //获取键盘按键

  if(kbhit()){

    char c = getch();

    if(c=='a' || c=='A')

      player_plane.sx = -2;

    else if(c=='d' || c=='D')

      player_plane.sx = 2;

    else if(c=='w' || c=='W')

      player_plane.sy = -2;

    else if(c=='s' || c=='S')

      player_plane.sy = 2;

    else if(c==' '){

      player_bullet[bullet_count].init(player_plane.x+9,player_plane.y-1,bullet_pic);

      bullet_count++;

    }

  }

  //随机生成敌人飞机

  if(rand()%100 < enemy_rate){

    enemy_plane[enemy_count].init(rand()%width,0,0,enemy_speed,enemy_pic);

    enemy_count++;

  }

  //碰撞检测

  for(int i=0;i

    if(collide(player_plane,enemy_plane[i]))

      player_plane.life--;

    for(int j=0;j

      if(collide(bullet[j],enemy_plane[i])){

        bullet[j].sy = -bullet[j].sy;

        enemy_plane[i].life--;

      }

    }

  }

  //结束条件

  if(player_plane.life <= 0)

    break;

  if(enemy_count >= enemy_num)

    break;

  //延时

  Sleep(20);

}

其中,碰撞检测函数是检测飞机和子弹是否碰撞的函数,只需要判断两个物体的坐标是否重叠即可,其实现如下:

bool collide(Plane p,Bullet b){

  if(b.x>=p.x && b.x =p.y && b.y

    return true;

  }

  else

    return false;

}

最后附上完整源代码:[点击下载]。发布本代码的目的在于方便C++游戏开发初学者们进行学习和交流,希望大家能够通过这个项目掌握更多的C++游戏开发知识。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复