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

2020-10-05  本文已影响0人  heiqimingren

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;
}

上一篇下一篇

猜你喜欢

热点阅读