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