【七、飞机大战(三)】

飞机大战也是在练习各类语言开发中一个比较重要的案例,话不多说,直接开码!

以前的飞机大战教程:

数组实现飞机控制

仍然将画布中所有元素储存在二维数组 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 而已。

感谢阅读
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值