美文网首页
网易c++------课时27--函数封装的飞机游戏

网易c++------课时27--函数封装的飞机游戏

作者: heiqimingren | 来源:发表于2020-10-05 20:39 被阅读0次

    image.png

    image.png

    #include<stdio.h>
    #include<stdlib.h>    //清屏命令在这里。
    #include <windows.h> //延时10毫秒-sleep,gotoxy函数
    #include <iostream>
    #include <conio.h>       //getch()----不用按回车,就可以输入字符。    
    using namespace std;
    
    
    
    
    //函数外定义全局变量
    int position_x, position_y;         //定义飞机的位置
    int high, width;            //定义游戏画面尺寸。
    int bullet_x, bullet_y;    //子弹的两个坐标
    int enemy_x, enemy_y;      //定义敌机的两个坐标
    int score;                 //游戏得分
    
    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()     //数据初始化
    {
        high = 15;
        width = 30;
        position_x = high / 2;
        position_y = width / 2;
    
        bullet_y = position_y;
        bullet_x = -1;   //让子弹初始值为-1,在屏幕外面。否则,会显示在屏幕当中!
    
        enemy_x = 0;
        enemy_y = width / 2;
    
        score = 0;
    
    }
    void show()     //显示画面
    {
        gotoxy(0, 0);       //光标移动到原点位置,以下重置清屏
        HideCursor();       //隐藏光标 
        int i, j;
        //system("cls");   //清除屏幕
        //cout << position_x << "  " << position_y << endl;
        for (i = 0; i < high; i++)    //2个for循环,将飞机,子弹,敌机都现在在屏幕上,通过不停的循环。巧妙的思路。
        {
            for (j = 0; j < width; j++)
            {
                if ((i == position_x) && (j == position_y))   //当i,j达到目的地飞机坐标x,y的时候,就输出*
                {
                    printf("*");     //输出飞机*
                }
    
                else if ((i == bullet_x) && (j == bullet_y))   //当i,j达到目的地飞机坐标x,y的时候,就输出*
                {
                    printf("|");     //输出子弹 |
                }
                else if ((i == enemy_x) && (j == enemy_y))   //当i,j达到目的地飞机坐标x,y的时候,就输出*
                {
                    printf("@");     //输出敌人@
                }
                else
                {
                    printf(" ");    //输出空格
                }
    
            }
            printf("\n");  //这个位置不能乱动!否则错位。
        }
        printf("得分:%d", score);
    
    }
    void UpdateWithoutInput()  //与用户输入无关的更新,例如子弹自动往上飞,敌机自动往下落
    {
    
        if ((bullet_x == enemy_x) && (bullet_y == enemy_y))   //当子弹击中敌机的时候,
        {
            score++;   //分数加1
            enemy_x = 0;  //敌人飞机X坐标重置为0
            enemy_y = rand() % width;     //让敌人飞机Y坐标随机===rand函数生成的数很大,0-32767之间。取余数,就可以得到0-30的数,很巧妙。
            bullet_x = -1;  //让子弹消失
        }
    
    
        //==============飞机下落部分=========================
        static int speed = 0;  //静态内存变量--用于控制飞机下落速度
        if (speed < 10)    //speed是速度,当速度小于10的时候,累加。
        {
            speed++;
        }
    
        if (enemy_x > high)  //这一段:控制飞机下落的操作。
        {
            enemy_x = 0;  //当敌人飞机落到屏幕外面之后,充值敌人飞机位置,=0
            enemy_y = rand() % width;     //让敌人飞机Y坐标随机===rand函数生成的数很大,0-32767之间。取余数,就可以得到0-30的数,很巧妙。
        }
        else  //否则!
        {
            if (speed == 10)   //当speed==10次(程序运行10次)的时候,飞机下落1次,目的是为了控制敌人飞机下落速度
            {
                enemy_x++; //敌人飞机生成之后,自动往下落。
                speed = 0;
            }
        }
        //==============飞机下落部分=========================
    
        if (bullet_x > -1)  //当子弹小于-1的时候,没必要继续减去了。
        {
            bullet_x--;  //发出子弹之后,让自动自动往上跑,不需要用户操作操心。所以放在这里。    
        }
    
    }
    void UpdateWithInput()  //与用户输入有关的更新。
    {
        char input;
        if (kbhit())   //当按键时候执行。
        {
            input = getch();
    
            if (input == 'a')
            {
                position_y--;
            }
            if (input == 'd')
            {
                position_y++;
            }
            if (input == 's')
            {
                position_x++;
            }
            if (input == 'w')
            {
                position_x--;
            }
            if (input == ' ')   //当按下空格的时候,发出子弹
            {
                bullet_x = position_x - 1;    //设置子弹的x坐标
                bullet_y = position_y;    //设置子弹的Y坐标
            }
    
        }
    }
    int main()
    {
        startup();   //数据初始化
        while (1)
        {
            show();      //显示画面
            UpdateWithoutInput();     //与用户输入无关的更新
            UpdateWithInput();        //与用户输入有关的更新。
    
        }
        return 0;
    }
    
    

    相关文章

      网友评论

          本文标题:网易c++------课时27--函数封装的飞机游戏

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