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;
}
网友评论