C语言实现地空对战游戏(附带源码)

地空对战游戏(通常称为飞机大战)是一个经典的射击类游戏,在这个游戏中,玩家控制一架飞机(通常是飞机的图形或者符号),并与敌机进行对战。敌机会从上方飞来,玩家的任务是摧毁敌机并避免被敌机击中。游戏的难度通常随着时间的推移而增加。

为了实现这个游戏,我们可以在控制台上使用C语言来模拟地空对战。程序中的飞机(玩家控制的飞机)将可以左右移动,发射子弹攻击敌机,而敌机会向下方移动并随机产生。

项目设计

  1. 游戏面板:通过一个二维数组来表示游戏面板,显示玩家飞机和敌机的位置。
  2. 玩家控制:玩家可以通过键盘控制飞机的左右移动,并发射子弹。
  3. 敌机行为:敌机会从屏幕顶部逐行向下移动,玩家需要摧毁它们。
  4. 游戏逻辑
    • 玩家飞机和敌机通过键盘输入来控制。
    • 游戏面板定期更新,确保实时显示敌机的移动和子弹的发射。
  5. 时间管理:利用系统时间来控制游戏刷新速度,模拟实时游戏体验。

C语言代码实现

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>

#define WIDTH 40  // 游戏屏幕宽度
#define HEIGHT 20 // 游戏屏幕高度
#define MAX_BULLETS 5 // 最大子弹数

// 游戏状态
char screen[HEIGHT][WIDTH + 1];  // 游戏面板
int playerX = WIDTH / 2;         // 玩家飞机位置(X坐标)
int playerY = HEIGHT - 2;        // 玩家飞机位置(Y坐标)
int bullets[MAX_BULLETS][2];     // 子弹位置(每个子弹有X, Y坐标)
int bulletCount = 0;              // 当前子弹数

// 敌机结构体
typedef struct {
    int x, y;  // 敌机位置
} Enemy;

Enemy enemies[10];  // 敌机数组
int enemyCount = 0; // 当前敌机数

// 初始化游戏屏幕
void init_screen() {
    for (int y = 0; y < HEIGHT; y++) {
        for (int x = 0; x < WIDTH; x++) {
            if (x == WIDTH - 1) {
                screen[y][x] = '\0';  // 行末尾添加字符串终结符
            } else {
                screen[y][x] = ' ';  // 空格表示屏幕的空白区域
            }
        }
    }
}

// 显示屏幕
void display_screen() {
    system("cls");  // 清屏(Windows特有,Linux可以使用system("clear"))
    for (int y = 0; y < HEIGHT; y++) {
        printf("%s\n", screen[y]);
    }
}

// 初始化玩家飞机
void draw_player() {
    screen[playerY][playerX] = '^';  // 玩家飞机用字符^表示
}

// 移动玩家飞机
void move_player() {
    if (_kbhit()) {  // 检测是否有键盘输入
        char ch = _getch();  // 获取按下的键
        if (ch == 'a' && playerX > 0) {   // 'a' 左移
            playerX--;
        } else if (ch == 'd' && playerX < WIDTH - 1) {  // 'd' 右移
            playerX++;
        } else if (ch == 'w' && playerY > 0) {  // 'w' 上移
            playerY--;
        } else if (ch == 's' && playerY < HEIGHT - 1) {  // 's' 下移
            playerY++;
        } else if (ch == ' ' && bulletCount < MAX_BULLETS) {  // 空格键发射子弹
            bullets[bulletCount][0] = playerX;
            bullets[bulletCount][1] = playerY - 1;  // 子弹从玩家飞机上方发射
            bulletCount++;
        }
    }
}

// 绘制敌机
void draw_enemies() {
    for (int i = 0; i < enemyCount; i++) {
        if (enemies[i].y < HEIGHT) {
            screen[enemies[i].y][enemies[i].x] = 'X';  // 敌机用字符'X'表示
        }
    }
}

// 敌机移动
void move_enemies() {
    for (int i = 0; i < enemyCount; i++) {
        enemies[i].y++;
        if (enemies[i].y >= HEIGHT) {
            // 如果敌机超过屏幕底部,重新生成到顶部
            enemies[i].y = 0;
            enemies[i].x = rand() % WIDTH;
        }
    }
}

// 绘制子弹
void draw_bullets() {
    for (int i = 0; i < bulletCount; i++) {
        if (bullets[i][1] >= 0) {
            screen[bullets[i][1]][bullets[i][0]] = '|';  // 子弹用字符'|'表示
        }
    }
}

// 移动子弹
void move_bullets() {
    for (int i = 0; i < bulletCount; i++) {
        bullets[i][1]--;
    }
}

// 子弹和敌机碰撞检测
void check_collisions() {
    for (int i = 0; i < bulletCount; i++) {
        for (int j = 0; j < enemyCount; j++) {
            if (bullets[i][0] == enemies[j].x && bullets[i][1] == enemies[j].y) {
                // 子弹击中敌机,消除子弹和敌机
                bullets[i][1] = -1;  // 将子弹位置设置为无效
                enemies[j].y = -1;   // 将敌机位置设置为无效
            }
        }
    }
}

// 随机生成敌机
void generate_enemies() {
    if (enemyCount < 10 && rand() % 20 == 0) {  // 每20次循环有一定几率生成敌机
        enemies[enemyCount].x = rand() % WIDTH;
        enemies[enemyCount].y = 0;
        enemyCount++;
    }
}

int main() {
    srand(time(NULL));  // 初始化随机数生成器

    init_screen();  // 初始化游戏屏幕

    while (1) {
        // 清空屏幕
        init_screen();

        // 移动玩家飞机
        move_player();
        draw_player();  // 绘制玩家飞机

        // 移动敌机
        move_enemies();
        draw_enemies();  // 绘制敌机

        // 移动子弹
        move_bullets();
        draw_bullets();  // 绘制子弹

        // 检测碰撞
        check_collisions();

        // 随机生成敌机
        generate_enemies();

        // 刷新屏幕
        display_screen();

        // 稍微延时,控制游戏的刷新速度
        Sleep(100);  // Windows平台可以使用Sleep函数(100毫秒延时)
    }

    return 0;
}

代码解析

  1. 屏幕初始化和绘制

    • init_screen()函数用来初始化整个屏幕,并将所有位置填充为空格。
    • display_screen()函数将当前的游戏屏幕输出到控制台。
  2. 玩家控制

    • 玩家可以通过按ad键来左右移动,按ws键来上下移动。按空格键发射子弹。
    • 玩家飞机的位置通过playerXplayerY来控制。
  3. 敌机生成和移动

    • 敌机通过generate_enemies()随机生成,每次生成时,敌机的X坐标随机,Y坐标为0(即从顶部生成)。
    • 敌机会下移,达到屏幕底部时会重新出现在顶部。
  4. 子弹控制

    • 子弹从玩家飞机的上方发射,子弹会向上移动。如果子弹与敌机碰撞,则敌机和子弹都会被删除。
  5. 碰撞检测

    • 每帧都进行碰撞检测,检查子弹和敌机是否重合。如果有碰撞,子弹和敌机会被“销毁”。
  6. 控制游戏刷新

    • 使用Sleep(100)函数来控制游戏更新的频率,每100毫秒更新一次屏幕。

扩展功能

  1. 计分系统:可以增加计分功能,玩家每摧毁一个敌机,得1分。可以在屏幕上显示当前分数。
  2. 敌机AI:敌机可以有更复杂的行为,例如随机左右移动,或者发射子弹反击玩家。
  3. 生命值:玩家可以有有限的生命值,撞上敌机或者被敌机击中时扣除生命值。
  4. 图形化界面:可以通过图形库(如SDL)实现更加精美的图形界面,使游戏更具互动性和可玩性。

总结

这个简单的地空对战游戏通过C语言和控制台图形实现了玩家与敌机之间的对抗。使用了键盘输入来控制玩家飞机,使用了随机生成和移动来控制敌机的行为。通过碰撞检测,玩家可以发射子弹并摧毁敌机。这是一个基础的C语言游戏开发练习,适合初学者熟悉C语言的基本操作和游戏逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值