空战游戏 1.0

460 阅读2分钟

游戏效果

利用数组知识改进空战游戏,实现多台敌机、发射散弹等效果。

实现步骤

1、显示与控制飞机

2、发射子弹

3、击中敌机

4、多台敌机

5、发射散弹

搭建一个简化的游戏框架

//函数外全局变量定义
int main()
{
    startup();    //初始化
    while (1)
    {
        show();    //显示画面
        updateWithoutInput();  //与用户输入无关的更新
        updateWithInput();     //与用户输入有关的更新
    }

    return 0;
}

Step 1:显示与控制飞机

第一步实现飞机的显示与控制。

- 在 二维数组 canvas[High][Width] 中 存储游戏数据,当二维数组 canvas[High][Width] 中 元素为1时输出飞机 ‘ * ’

Step 2 : 发射子弹

- 在 二维数组 canvas[High][Width] 中 元素为2时输出子弹 ‘ | ’

Step 3 :击中敌机

增加下落的敌机,二维数组 canvas[High][Width] 中 元素为3时输出敌机 ‘ @ ’ 

增加 子弹击中敌机、敌机与我机相撞、敌机下落的功能。

Step 4 : 多台敌机

利用 enemy_x [EnemyNum],enemy_y [EnemyNum] 存储多台敌机的位置, 实现多台敌机同时出现的效果。

Step 5 :发射散弹

实现发射宽度 BulletWidth 的散弹。(可类比反弹球增加挡板长度的功能)

当积分 score 增加后,散弹半径增加, 敌机移动速度发生改变。

全部代码

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

#define High 25   //游戏画面尺寸
#define Width 50
#define EnemyNum 5 //敌机数量

//全局变量
int canvas[High][Width] = { 0 }; //二维数组存储游戏画面中对应的元素
                               // 0 表示空格; 1 表示飞机;2 表示子弹;3 表示敌机
int position_x, position_y;    //飞机的位置
int enemy_x[EnemyNum], enemy_y[EnemyNum];   //敌机的位置
int score; //得分
int BulletWidth;  //子弹宽度
int EnemyMoveSpeed; //敌机移动速度

void gotoxy(int x, int y)   //清屏
{
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle, pos);
}

void HideCursor()  //隐藏光标
{
    CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

void startup()    //初始化
{
    position_x = High / 2;
    position_y = Width / 2;
    canvas[position_x][position_y] = 1;

    score = 0;
    BulletWidth = 0;
    EnemyMoveSpeed = 10;

    int k;
    for (k = 0; k < EnemyNum; k++)
    {
        enemy_x[k] = rand() % 5;
        enemy_y[k] = rand() % Width;
        canvas[enemy_x[k]][enemy_y[k]] = 3;
    }
}

void show()  //显示画面
{
    gotoxy(0, 0);  //光标移到原点,以下清屏

    int i, j;
    for (i = 0; i < High; i++)
    {
        for (j = 0; j < Width; j++)
        {
            if (canvas[i][j] == 0)
                printf(" ");   //输出空格
            else if (canvas[i][j] == 1)
                printf("*");   //输出飞机 *
            else if (canvas[i][j] == 2)
                printf("|");   //输出子弹 |
            else if (canvas[i][j] == 3)
                printf("@");   //输出敌机 @

        }
        printf("\n");
    }
    printf("得分:%d\n", score);

    HideCursor();  //隐藏光标
    Sleep(20);
}

void updateWithoutInput()  //与用户输入无关的更新
{
    int i, j, k;
    for (i = 0; i < High; i++)
    {
        for (j = 0; j < Width; j++)
        {
            if (canvas[i][j] == 2)
            {
                for (k = 0; k < EnemyNum; k++)
                {
                    if (i == enemy_x[k] && j == enemy_y[k]) //子弹击中敌机
                    {
                        canvas[enemy_x[k]][enemy_y[k]] = 0;
                        enemy_x[k] = 0;  //产生新的敌机
                        enemy_y[k] = rand() % Width;
                        canvas[enemy_x[k]][enemy_y[k]] = 3;

                        canvas[i][j] = 0; //子弹消失

                        score++; //得分加1
                        if (score % 5 == 0 && EnemyMoveSpeed < 20)  //达到一定分数敌机变换
                            EnemyMoveSpeed++;
                        if (score % 10 == 0) //达到一定分数发射散弹
                            BulletWidth++;
                    }
                }

                //子弹向上移动
                canvas[i][j] = 0;
                if (i >= 0)
                    canvas[i - 1][j] = 2;
            }
        }
    }

    for (k = 0; k < EnemyNum; k++)
    {
        if (position_x == enemy_x[k] && position_y == enemy_y[k])  //敌机击中我机
        {
            printf("游戏失败!\n");
            Sleep(3000);
            system("pause");
            exit(0);
        }
    }

    for (k = 0; k < EnemyNum; k++)
    {
        if (enemy_x[k] > High) //敌机越出下界
        {
            canvas[enemy_x[k]][enemy_y[k]]= 0;
            enemy_x[k] = 0;  //产生新的敌机
            enemy_y[k] = rand() % Width;
            canvas[enemy_x[k]][enemy_y[k]] = 3;

            score--; //得分减1
        }
    }

    static int speed = 0; 
    if (speed < EnemyMoveSpeed)
        speed++;
    else
    {
        //敌机下落
        for (k = 0; k < EnemyNum; k++)
        {
            canvas[enemy_x[k]][enemy_y[k]] = 0;
            enemy_x[k]++;
            canvas[enemy_x[k]][enemy_y[k]] = 3;
        }
        speed = 0;
    }
}


void updateWithInput()     //与用户输入有关的更新
{
    char input;

    if (_kbhit())
    {
        input = _getch();
        if (input == 'a')
        {
            canvas[position_x][position_y] = 0;
            position_y--;
            canvas[position_x][position_y] = 1;
        }
        if (input == 'd')
        {
            canvas[position_x][position_y] = 0;
            position_y++;
            canvas[position_x][position_y] = 1;
        }
        if (input == 'w')
        {
            canvas[position_x][position_y] = 0;
            position_x--;
            canvas[position_x][position_y] = 1;
        }
        if (input == 's')
        {
            canvas[position_x][position_y] = 0;
            position_x++;
            canvas[position_x][position_y] = 1;
        }
        if (input == ' ')  //发射子弹
        {
            int left = position_y - BulletWidth;
            int right = position_y + BulletWidth;
            if (left < 0)
                left = 0;
            if (right > Width - 1)
                right = Width - 1;
            int k;
            for (k = left; k <= right; k++)
                canvas[position_x - 1][k] = 2;
        }
    }
}

int main()
{
    startup();    //初始化
    while (1)
    {
        show();    //显示画面
        updateWithoutInput();  //与用户输入无关的更新
        updateWithInput();     //与用户输入有关的更新
    }

    return 0;
}

编译器:Visual Studio 2019