返回

用C++的EasyX库制作飞机大战,带你玩转经典游戏

前端

  1. EasyX库简介

EasyX是一个使用C/C++语言开发的跨平台图形库,可以帮助开发者快速创建2D游戏和图形程序。EasyX库具有以下特点:

  • 易学易用,学习曲线平缓,非常适合游戏开发初学者。
  • 跨平台,支持Windows、Linux和macOS等多种操作系统。
  • 提供丰富的图形函数,可以轻松创建各种图形对象和动画。
  • 支持多种输入设备,包括键盘、鼠标和游戏手柄。
  • 拥有强大的声音支持,可以轻松播放音乐和音效。

2. 游戏界面设计

在开始编写游戏代码之前,我们需要先设计游戏界面。飞机大战游戏的界面通常由以下几个部分组成:

  • 游戏背景:通常是一张图片或动画,作为游戏场景的背景。
  • 飞机:玩家控制的飞机,可以使用键盘或鼠标控制其移动和射击。
  • 敌人:敌方飞机、地面的炮台等,会向玩家的飞机射击。
  • 子弹:玩家的飞机和敌人的飞机都会发射子弹,击中目标后会造成伤害。
  • 得分:显示玩家的得分,通常是击落敌机获得的。
  • 生命值:显示玩家飞机的生命值,被敌人子弹击中后会减少。

3. 游戏逻辑实现

游戏界面的设计完成后,就可以开始编写游戏逻辑了。飞机大战游戏的逻辑主要包括以下几个部分:

  • 飞机移动:处理玩家的输入,控制飞机的移动和射击。
  • 敌人移动:控制敌人的移动和射击,并判断是否击中了玩家的飞机。
  • 子弹移动:控制子弹的移动,并判断是否击中了敌机或玩家的飞机。
  • 得分计算:计算玩家击落敌机的得分,并显示在得分板上。
  • 生命值管理:管理玩家飞机的生命值,当生命值降为0时,游戏结束。

4. 游戏结束

当玩家的飞机被敌人的子弹击中或生命值降为0时,游戏结束。此时,游戏需要显示游戏结束的画面,并允许玩家重新开始游戏或退出游戏。

5. 完整代码

以下是用C++的EasyX库编写的飞机大战游戏完整代码:

#include <graphics.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>

//游戏画面尺寸
const int SCREEN_WIDTH = 800;
const int SCREEN_HEIGHT = 600;

//飞机的结构体
struct Plane {
    int x, y; //位置坐标
    int speedX, speedY; //速度
    int life; //生命值
    int score; //得分
};

//敌人的结构体
struct Enemy {
    int x, y; //位置坐标
    int speedX, speedY; //速度
    int life; //生命值
};

//子弹的结构体
struct Bullet {
    int x, y; //位置坐标
    int speedX, speedY; //速度
};

//游戏变量
Plane player; //玩家飞机
Enemy enemies[10]; //最多10个敌人
Bullet bullets[100]; //最多100发子弹
int score; //玩家得分
int level; //游戏等级

//游戏函数
void InitGame(); //初始化游戏
void DrawGame(); //绘制游戏画面
void UpdateGame(); //更新游戏状态
void CheckCollision(); //检查碰撞
void ControlPlayer(); //控制玩家飞机
void MoveEnemies(); //移动敌人
void MoveBullets(); //移动子弹
void ShowScore(); //显示得分
void ShowLife(); //显示生命值
void GameOver(); //游戏结束

//主函数
int main() {
    //初始化游戏
    InitGame();

    //游戏循环
    while (true) {
        //处理玩家输入
        ControlPlayer();

        //更新游戏状态
        UpdateGame();

        //绘制游戏画面
        DrawGame();

        //检查碰撞
        CheckCollision();

        //显示得分和生命值
        ShowScore();
        ShowLife();

        //游戏结束
        if (player.life <= 0) {
            GameOver();
            break;
        }

        //延迟一段时间,使游戏运行速度适中
        _sleep(10);
    }

    //释放资源
    closegraph();

    return 0;
}

//初始化游戏
void InitGame() {
    //初始化图形库
    initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);

    //初始化玩家飞机
    player.x = SCREEN_WIDTH / 2;
    player.y = SCREEN_HEIGHT - 100;
    player.speedX = 0;
    player.speedY = 0;
    player.life = 100;
    player.score = 0;

    //初始化敌人
    for (int i = 0; i < 10; i++) {
        enemies[i].x = rand() % SCREEN_WIDTH;
        enemies[i].y = rand() % (SCREEN_HEIGHT / 2);
        enemies[i].speedX = rand() % 5 - 2;
        enemies[i].speedY = rand() % 5 - 2;
        enemies[i].life = 10;
    }

    //初始化子弹
    for (int i = 0; i < 100; i++) {
        bullets[i].x = -1;
        bullets[i].y = -1;
        bullets[i].speedX = 0;
        bullets[i].speedY = 0;
    }

    //初始化分数和等级
    score = 0;
    level = 1;
}

//绘制游戏画面
void DrawGame() {
    //清除屏幕
    cleardevice();

    //绘制背景
    setbkcolor(BLACK);
    cleardevice();

    //绘制玩家飞机
    setfillcolor(BLUE);
    solidcircle(player.x, player.y, 10);

    //绘制敌人
    setfillcolor(RED);
    for (int i = 0; i < 10; i++) {
        solidcircle(enemies[i].x, enemies[i].y, 10);
    }

    //绘制子弹
    setfillcolor(YELLOW);
    for (int i = 0; i < 100; i++) {
        if (bullets[i].x != -1 && bullets[i].y != -1) {
            solidcircle(bullets[i].x, bullets[i].y, 2);
        }
    }

    //显示得分和生命值
    settextcolor(WHITE);
    settextstyle(DEFAULT_FONT, HORIZ_DIR, 2);
    char scoreStr[10];
    sprintf(scoreStr, "得分: %d", score);
    outtextxy(10, 10, scoreStr);
    char lifeStr[10];
    sprintf(lifeStr, "生命: %d", player.life);
    outtextxy(10, 30, lifeStr);
}

//更新游戏状态
void UpdateGame() {
    //移动玩家飞机
    player.x += player.speedX;
    player.y += player.speedY;

    //移动敌人
    MoveEnemies();

    //移动子弹
    MoveBullets();
}

//检查碰撞
void CheckCollision() {
    //检查玩家飞机是否与敌人发生碰撞
    for (int i = 0; i < 10; i++) {
        if (iscollision(player.x, player.y, 10, enemies[i].x, enemies[i].y, 10)) {
            player.life -= 10;
            enemies[i].life = 0;
        }
    }

    //检查玩家飞机是否被子弹击中
    for (int i = 0; i < 100; i++) {
        if (bullets[i].x != -1 && bullets[i].y != -1 && iscollision(player.x, player.y, 10, bullets[i].x, bullets[i].y, 2)) {
            player.life -= 10;
            bullets[i].x = -1;
            bullets[i].y = -1;
        }
    }

    //检查敌人是否被