美文网首页
网易c++------课时34---空战游戏

网易c++------课时34---空战游戏

作者: heiqimingren | 来源:发表于2020-10-11 18:26 被阅读0次

https://www.bilibili.com/video/BV1Rt411d7cH?p=33

#include<stdio.h>
#include<stdlib.h>    //清屏命令在这里。
#include <windows.h> //延时10毫秒-sleep,gotoxy函数
#include <iostream>
#include <conio.h>       //getch()----不用按回车,就可以输入字符。    
using namespace std;


//函数外定义全局变量
#define High 20
#define Width 50     //定义游戏画面尺寸
#define EnemyNum 5     //敌机数目

int canvas[High][Width] = {0};   //二维数组记录游戏画面中对应的元素
                            //0输出空格,1输出飞机,2输出子弹
int position_x, position_y;   //飞机坐标位置  
int enemy_x[EnemyNum], enemy_y[EnemyNum];        //敌机的坐标位置,是一个数组
int score;     //得分
int bulletwidth;     //子弹宽度 

void gotoxy(int x, int y) // 光标移动到intx,inty位置
{
    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 };  //第二个值为0,表示隐藏光标
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}



void startup()     //数据初始化
{
    position_x = High / 2;
    position_y = Width / 2;   //飞机的最开始的位置坐标
    canvas[position_x][position_y] = 1;        //1,代表此处有飞机,我方控制的飞机
    score = 0;    //得分初始化为0
    int k;
    for (k = 0; k < EnemyNum;k++)   //初始化5个敌机的坐标位置!
    {
        enemy_x[k] = rand()% 3 ;                //敌机的x坐标
        enemy_y[k] = rand() % Width;   //敌机的Y坐标
        canvas[enemy_x[k]][enemy_y[k]] = 3;        //3代表有敌人飞机,初始化敌人飞机
    }
    bulletwidth = 5;  //子弹宽度设置为5


    HideCursor();       //隐藏光标 
}
void show()     //显示画面
{
    gotoxy(0, 0);       //光标移动到原点位置,以下重置清屏
    int i, j;
    for (i = 0; i < High-1;i++)    //2个for循环,将飞机,子弹,敌机都现在在屏幕上,通过不停的循环。巧妙的思路。
    {
        for (j = 0; j < Width-1;j++)  
        {
            if (canvas[i][j] == 1)
            {
                printf("*");   //输出飞机 *
            }
            else if (canvas[i][j] == 2)
            {
                printf("|");   //输出子弹|
            }
            else if (canvas[i][j] == 3)
            {
                printf("@");   //输出敌人飞机@
            }
            else
            {
                printf(" ");      //输出空格
            }
        }
        printf("\n");  //这个位置不能乱动!否则错位。
    }   
    printf("得分:%d\n :", score);

}
void UpdateWithoutInput()  //与用户输入无关的更新,例如子弹自动往上飞,敌机自动往下落
{
    //====================让发出的子弹自动往上走==可以实现,连续多发子弹效果,nice
    int i, j,k;
    for (i = 0; i < High - 1; i++)
    {
        for (j = 0; j < Width - 1; j++)
        {
            if (canvas[i][j] == 2)   //当canvas[i][j]位置,状态为子弹的时候
            {
                for (k = 0; k < EnemyNum;k++)   //遍历整个敌机数组。是否被击中?
                {
                    //判断是否击中敌机。
                    if ((i == enemy_x[k]) && (j == enemy_y[k]))   //如果击中敌机
                    {
                        //敌机x,y坐标需要重置
                        canvas[enemy_x[k]][enemy_y[k]] = 0; //让飞机立马消失。。。
                        enemy_x[k] = rand()%3;              //新生成的敌机X坐标随机   
                        enemy_y[k] = rand() % Width;        //新生成的敌机Y坐标随机
                        canvas[enemy_x[k]][enemy_y[k]] = 3;  //敌人飞机@展示出来
                        score++;     //当击中敌机的时候,就加一分
                    }
                }
                canvas[i][j] = 0;       //没有击中敌机的话,遍历整个画布背景,设置状态为0,即为空格
                if (i>0)     //当子弹没有跑到屏幕外面时候,一直循环执行这段
                {
                    canvas[i - 1][j] = 2;     //让子弹往上走,每次往上走。2位子弹的状态码。
                }
            }
        }
    }
    //====================让发出的子弹自动往上走==可以实现,连续多发子弹效果,nice

    //====================让敌机自动往下跑,实现这个效果、
    for (k = 0; k < EnemyNum; k++)
    {
        if (enemy_x[k] > High)  //当敌机跑出下边界时候
        {
            canvas[enemy_x[k]][enemy_y[k]] = 0;  //让敌机瞬间消失 
            enemy_x[k] = rand()%3;               //生成的敌机X坐标随机   
            enemy_y[k] = rand() % Width;         //敌机Y坐标随机
            canvas[enemy_x[k]][enemy_y[k]] = 3;   //敌人飞机@展示出来
            score--;    //当敌机跑出下边界的时候,就去掉一分
        }
    }
    //通过设置一个局部静态变量,让飞机下落速度慢一些
    static int speed = 10;
    if (speed<10)
    {
        speed++;
    }
    else if (speed==10)
    {
        for (k = 0; k < EnemyNum; k++)
        {
            //if (enemy_x[k] > High)  //当敌机跑出下边界时候
            //{
            //  canvas[enemy_x[k]][enemy_y[k]] = 0;  //让敌机瞬间消失 
            //  enemy_x[k] = rand() % 3;               //生成的敌机X坐标随机 
            //  enemy_y[k] = rand() % Width;         //敌机Y坐标随机
            //  canvas[enemy_x[k]][enemy_y[k]] = 3;
            //  score--;    //当敌机跑出下边界的时候,就去掉一分
            //}

            //敌机自动下落代码
            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 == 's') 
        {
            canvas[position_x][position_y] = 0;
            position_x++;
            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 == ' ')  //按下空格,就是发射子弹。
        {
            //发射一排子弹。。。。。。。。。
            int left, right;
            left = position_y - bulletwidth;
            if (left<0)     //左边界,得设置一下,控制一下范围。
            {
                left = 0;
            }
            right = position_x + bulletwidth;
            if (right>Width-1)
            {
                right = Width-1;
            }
            int x;
            for (x = left; x < right;x++)
            {
                canvas[position_x - 1][x] = 2;   //设置该位置的子弹标识为2,
            }
        }
    }
}
int main()
{
    startup();   //数据初始化
    while (1)
    {
        show();      //显示画面
        UpdateWithoutInput();     //与用户输入无关的更新
        UpdateWithInput();        //与用户输入有关的更新。

    }
    return 0;
}

相关文章

网友评论

      本文标题:网易c++------课时34---空战游戏

      本文链接:https://www.haomeiwen.com/subject/yupfpktx.html