游戏效果
利用数组知识改进空战游戏,实现多台敌机、发射散弹等效果。
实现步骤
1、显示与控制飞机
2、发射子弹
3、击中敌机
4、多台敌机
5、发射散弹
搭建一个简化的游戏框架
//函数外全局变量定义
int main()
{
startup(); //初始化
while (1)
{
show(); //显示画面
updateWithoutInput(); //与用户输入无关的更新
updateWithInput(); //与用户输入有关的更新
}
return 0;
}
Step 1:显示与控制飞机
第一步实现飞机的显示与控制。
- 在 二维数组 canvas[High][Width] 中 存储游戏数据,当二维数组 canvas[High][Width] 中 元素为1时输出飞机 ‘ * ’
Step 2 : 发射子弹
- 在 二维数组 canvas[High][Width] 中 元素为2时输出子弹 ‘ | ’
Step 3 :击中敌机
增加下落的敌机,二维数组 canvas[High][Width] 中 元素为3时输出敌机 ‘ @ ’
增加 子弹击中敌机、敌机与我机相撞、敌机下落的功能。
Step 4 : 多台敌机
利用 enemy_x [EnemyNum],enemy_y [EnemyNum] 存储多台敌机的位置, 实现多台敌机同时出现的效果。
Step 5 :发射散弹
实现发射宽度 BulletWidth 的散弹。(可类比反弹球增加挡板长度的功能)
当积分 score 增加后,散弹半径增加, 敌机移动速度发生改变。
全部代码
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#define High 25 //游戏画面尺寸
#define Width 50
#define EnemyNum 5 //敌机数量
//全局变量
int canvas[High][Width] = { 0 }; //二维数组存储游戏画面中对应的元素
// 0 表示空格; 1 表示飞机;2 表示子弹;3 表示敌机
int position_x, position_y; //飞机的位置
int enemy_x[EnemyNum], enemy_y[EnemyNum]; //敌机的位置
int score; //得分
int BulletWidth; //子弹宽度
int EnemyMoveSpeed; //敌机移动速度
void gotoxy(int x, int y) //清屏
{
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 };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void startup() //初始化
{
position_x = High / 2;
position_y = Width / 2;
canvas[position_x][position_y] = 1;
score = 0;
BulletWidth = 0;
EnemyMoveSpeed = 10;
int k;
for (k = 0; k < EnemyNum; k++)
{
enemy_x[k] = rand() % 5;
enemy_y[k] = rand() % Width;
canvas[enemy_x[k]][enemy_y[k]] = 3;
}
}
void show() //显示画面
{
gotoxy(0, 0); //光标移到原点,以下清屏
int i, j;
for (i = 0; i < High; i++)
{
for (j = 0; j < Width; j++)
{
if (canvas[i][j] == 0)
printf(" "); //输出空格
else if (canvas[i][j] == 1)
printf("*"); //输出飞机 *
else if (canvas[i][j] == 2)
printf("|"); //输出子弹 |
else if (canvas[i][j] == 3)
printf("@"); //输出敌机 @
}
printf("\n");
}
printf("得分:%d\n", score);
HideCursor(); //隐藏光标
Sleep(20);
}
void updateWithoutInput() //与用户输入无关的更新
{
int i, j, k;
for (i = 0; i < High; i++)
{
for (j = 0; j < Width; j++)
{
if (canvas[i][j] == 2)
{
for (k = 0; k < EnemyNum; k++)
{
if (i == enemy_x[k] && j == enemy_y[k]) //子弹击中敌机
{
canvas[enemy_x[k]][enemy_y[k]] = 0;
enemy_x[k] = 0; //产生新的敌机
enemy_y[k] = rand() % Width;
canvas[enemy_x[k]][enemy_y[k]] = 3;
canvas[i][j] = 0; //子弹消失
score++; //得分加1
if (score % 5 == 0 && EnemyMoveSpeed < 20) //达到一定分数敌机变换
EnemyMoveSpeed++;
if (score % 10 == 0) //达到一定分数发射散弹
BulletWidth++;
}
}
//子弹向上移动
canvas[i][j] = 0;
if (i >= 0)
canvas[i - 1][j] = 2;
}
}
}
for (k = 0; k < EnemyNum; k++)
{
if (position_x == enemy_x[k] && position_y == enemy_y[k]) //敌机击中我机
{
printf("游戏失败!\n");
Sleep(3000);
system("pause");
exit(0);
}
}
for (k = 0; k < EnemyNum; k++)
{
if (enemy_x[k] > High) //敌机越出下界
{
canvas[enemy_x[k]][enemy_y[k]]= 0;
enemy_x[k] = 0; //产生新的敌机
enemy_y[k] = rand() % Width;
canvas[enemy_x[k]][enemy_y[k]] = 3;
score--; //得分减1
}
}
static int speed = 0;
if (speed < EnemyMoveSpeed)
speed++;
else
{
//敌机下落
for (k = 0; k < EnemyNum; k++)
{
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 == 'w')
{
canvas[position_x][position_y] = 0;
position_x--;
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 == ' ') //发射子弹
{
int left = position_y - BulletWidth;
int right = position_y + BulletWidth;
if (left < 0)
left = 0;
if (right > Width - 1)
right = Width - 1;
int k;
for (k = left; k <= right; k++)
canvas[position_x - 1][k] = 2;
}
}
}
int main()
{
startup(); //初始化
while (1)
{
show(); //显示画面
updateWithoutInput(); //与用户输入无关的更新
updateWithInput(); //与用户输入有关的更新
}
return 0;
}
编译器:Visual Studio 2019