飞机大战也是在练习各类语言开发中一个比较重要的案例,话不多说,直接开码!
以前的飞机大战教程:
数组实现飞机控制
仍然将画布中所有元素储存在二维数组 canvas[High][Width] 当中,用 0 表示空格,用 1 表示飞机。
飞机移动控制就和上一次小球反弹的实现类似了。
上代码:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#define High 25
#define Width 50
//全局变量
int pos_x, pos_y; //飞机位置
int canvas[High][Width] = [0]; //画布元素数组
void gotoxy(int x, int y) //移动光标便于清屏重画
{
HANDLE handle = GetStdHandle(STD_UOTPUT_HANDLE);
CROOD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle, pos);
}
void startup() //初始化
{
pos_x = High/2;
pos_y = Width/2;
canvas[pos_x][pos_y] = 1;
}
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("*"); //输出飞机
}
printf("\n"); //每完成一行后换行
}
sleep(20);
}
void updateWithoutInput() //与输入无关的更新
{}
void updateWithInput()
{
char input;
if(kbhit()) //判断是否输入
{
input = getch();
if(input == 'a') //左移
{
canvas[pos_x][pos_y] = 0;
pos_y --;
canvas[pos_x][pos_y] = 1;
}
if(input == 'd') //右移
{
canvas[pos_x][pos_y] = 0;
pos_y ++;
canvas[pos_x][pos_y] = 1;
}
if(input == 'w') //上移
{
canvas[pos_x][pos_y] = 0;
pos_x --;
canvas[pos_x][pos_y] = 1;
}
if(input == 's') //下移
{
canvas[pos_x][pos_y] = 0;
pos_x ++;
canvas[pos_x][pos_y] = 1;
}
}
}
int main()
{
startup();
while(1)
{
show();
updateWithoutInput();
updateWithInput();
}
return 0;
}
发射子弹
完成以上的部分后,画布上就有了一个飞机(虽然就是个星号),那么下一步就是给他加上子弹:
新定义数组内元素值为 2 时,函数 show() 在画布上画出子弹 ‘|’ 。
具体步骤如下:
// show()函数中
...
else if(canvas[i][j] == 2)
printf("|");
...
void updateWithoutInput()
{
int i,j;
for(i=0; i<High; i++)
{
for(j=0; j<Width; j++)
{
if(canvas[i][j] == 2) //子弹向上移动
{
canvas[i][j] = 0;
if(i>0)
canvas[i - 1][j] = 2;
}
}
}
}
// updateWithInput() 部分
...
else if(input == ' ') //发射子弹
canvas[pos_x - 1][pos_y] = 2;
...
击中敌机
到这一步,我们的飞机大战就基本搞定了。
最后加入敌机刷新和敌机的相关判定,飞机大战游戏基本功能就告成了,当然大家也可以为它添加其他规则或元素。
定义数组中元素为 3 时输出敌机 ’ @ '。
需要添加的代码如下:
// 全局变量
int score; //得分
// 初始化
//敌人坐标
enemy_x = 0;
enemy_y = pos_y;
canvas[enemy_x][enemy_y] = 3;
//得分
score = 0;
// show()
...
else if(canvas[i][j] == 3)
printf("@");
...
printf("得分: %3d\n", score);
// 击中判定
if(canvas[i][j] == 2)
{
if((i == enemy_x)&&(j == enemy_y))
{
score ++;
canvas[enemy_x][enemy_y] = 0;
// 刷新敌机位置
enemy_x = 0;
enemy_y = rand()%Width;
canvas[enemy_x][enemy_y] = 3;
// 子弹消失
canvas[i][j] = 0;
}
//子弹向上移动
else{
canvas[i][j] = 0;
if(i>0)
canvas[i - 1][j] = 2;
}
}
// 相撞
if((pos_x == enemy_x)&&(pos_y == enemy_y))
{
printf("Game Over");
sleep(1000);
system("pause");
exit(0);
}
// 敌机越界
if(enemy_x > High)
{
canvas[enemy_x][enemy_y] = 0;
// 刷新敌机位置
enemy_x = 0;
enemy_y = rand()%Width;
canvas[enemy_x][enemy_y] = 3;
// 减分
score --;
}
// 敌机下落
static int speed;
if(speed < 10)
speed ++;
if(speed == 10)
{
canvas[enemy_x][enemy_y] = 0;
enemy_x ++;
speed = 0;
canvas[enemy_x][enemy_y] = 3;
}
最后
到这里基本功能就全部实现了,以下是拓展到更多功能的小提示:
多架敌机:
或许使用数组来储存敌机位置(一个二维数组或2个一维数组)可以帮到你。更多子弹:
可以定义其他值来输出不同子弹,并且给这些子弹的判定分出不同的类。敌机主动攻击:
只需要改一改 updateWithoutInput() 即可实现。
BOSS:
更简单了,相当于又新加了一个 enemy 而已。
感谢阅读