【C语言】函数封装的飞机游戏

目录

0. 游戏展示

1. 游戏模块化

2. 打印飞机

2.1 操作飞机

2.2 发射子弹

3. 敌机登场

3.1 设置静止的敌机

3.2 移动的敌机

4. 击中敌机

4.1 游戏得分

4.2 击中敌机

5. 结束游戏

6. 游戏的优化

移动光标

隐藏光标

7. 游戏代码


0. 游戏展示

简单函数封装的飞机游戏

【C语言】函数封装的飞机游戏_第1张图片

1. 游戏模块化

【C语言】函数封装的飞机游戏_第2张图片

2. 打印飞机

先定义一个标准:在C语言输出时,假设在弹出来的框框中,左上角为坐标的原点(0,0),向右为x的正方向,向下为y的正方向,用小写字母*代表飞机,+代表敌机

循环遍历游戏尺寸,如果找到设定的position_x,position_y则打印飞机

system是系统函数,需要头文件stdlib.h

【C语言】函数封装的飞机游戏_第3张图片

2.1 操作飞机

和用户输入有关的代码,需要放到updateWithInput函数中

kbhit 是检测有没有按键落下的函数

功能及返回值: 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0

需要头文件conio

getch() 是编程中所用的函数,这个函数是一个不回显函数

当用户按下某个字符时,函数自动读取,无需按回车

需要头文件conio

【C语言】函数封装的飞机游戏_第4张图片

2.2 发射子弹

利用空格健发射子弹

定义全局变量bullet_x,bullet_y

【C语言】函数封装的飞机游戏_第5张图片

当按下空格健的时候,子弹应该从飞机的上方发出

所以子弹应该和飞机在同一列,也就是x相同

子弹的的起始位置应该在飞机的上方,也就是飞机 y-1 的位置

下面完成的是,子弹向上移动:

出了屏幕后,就不需要移动了

 

3. 敌机登场

定义全局变量enemy_x,enemy_y 记录敌机的位置

3.1 设置静止的敌机

首先在startup初始化里,设计敌机的初始位置

【C语言】函数封装的飞机游戏_第6张图片

然后再show函数,显示游戏画面里,如果遍历到敌机的初始位置,则打印敌机(+)

【C语言】函数封装的飞机游戏_第7张图片

【C语言】函数封装的飞机游戏_第8张图片

 

3.2 移动的敌机

利用rand随机生成敌机的下落位置,从顶部落下,所以y = 0,x 随机生成

敌机下落就是 y一直递增

为了让敌机的下落速度慢一点,利用静态变量static int speed,当speed增加到10的时候,我们才让敌机下落一次,然后将speed赋值为0,等待再一次下落

【C语言】函数封装的飞机游戏_第9张图片

4. 击中敌机

4.1 游戏得分

定义全局变量score,当打印完游戏主窗口的时候,再下面一行打印得分

因为score是全局变量,没有初始化时,默认为0

【C语言】函数封装的飞机游戏_第10张图片

4.2 击中敌机

子弹的位置和敌机的位置重合,就是击中

当击中的时候,只要将子弹的位置设置在打印不到的位置,就相当于子弹消失了

因为敌机被消灭,要再生成下一个敌机,所以将敌机的随机生成再这里也拷贝一份

最后将score得分加1就行

【C语言】函数封装的飞机游戏_第11张图片

 

5. 结束游戏

结束游戏就是敌机碰撞到飞机,也就是敌机的位置和飞机位置重回,就退出游戏即可

【C语言】函数封装的飞机游戏_第12张图片

【C语言】函数封装的飞机游戏_第13张图片

6. 游戏的优化

system的cls清屏函数被刷新很快,做一点优化

移动光标

也需要头文件windows.h

【C语言】函数封装的飞机游戏_第14张图片

需要再show函数那里调用gotoxy(0,0)相当于代替了system("cls")

【C语言】函数封装的飞机游戏_第15张图片

 

隐藏光标

函数执行一次就行,放到初始化startup里面

【C语言】函数封装的飞机游戏_第16张图片

7. 游戏代码

#define _CRT_SECURE_NO_WARNINGS 1
#include 
#include 
#include 
#include 

int position_x, position_y;    //飞机位置
int hight, width;   //游戏尺寸
int bullet_x, bullet_y;   //子弹位置
int enemy_x, enemy_y;   //敌机位置
int score;

void hideCursor()    //隐藏光标
{
	CONSOLE_CURSOR_INFO cursor_info = { 1,0 }; //第二个值为零代表隐藏光标
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

void gotoxy(int x, int y)       //清屏
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle, pos);
}

void startup()
{
	hight = 18;
	width = 30;

	position_x = width / 2;		// 飞机位置的初始化
	position_y = hight / 2;

	enemy_x = width / 2;    // 敌机位置的初始化
	enemy_y = 0;

	hideCursor();   // 隐藏光标
}

void show()
{
	gotoxy(0, 0);   // 移动光标
	int i, j;


	for (j = 0; j < hight; j++)
	{
		for (i = 0; i < width; i++)
		{

			if ((i == position_x) && (j == position_y))
				printf("*");     //输出飞机
			else if ((i == bullet_x) && (j == bullet_y))
				printf("|");  //输出子弹
			else if ((i == enemy_x) && (j == enemy_y))
				printf("+");    //输出敌机
			else
				printf(" ");	
		}
		printf("\n");
	}

	printf("score:%d\n", score);
}

void updateWithoutInput()
{
	if ((bullet_x == enemy_x) && (bullet_y == enemy_y))
	{
		score++;

		enemy_y = 0;
		enemy_x = rand() % width;
		
		bullet_y = -1;
	}
		
	if(bullet_y>-1)
		bullet_y--;

	static int speed = 0;   //利用静态变量控制飞机速度
	if (speed < 10)        //static延长局部变量生命
		speed++;

	if (enemy_y > hight)
	{
		enemy_y = 0;
		enemy_x = rand() % width;
	}
	else
	{
		if (speed == 10)	
		{
			enemy_y++;
			speed = 0;
		}
	}

}

void updateWithInput()
{
	char input = 0;

	if (kbhit())   //功能及返回值: 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
	{
		input = getch();
		if (input == 'w')
			position_y--;
		if (input == 's')
			position_y++;
		if (input == 'a')
			position_x--;
		if (input == 'd')
			position_x++;
		if (input == ' ')
		{
			bullet_y = position_y - 1;
			bullet_x = position_x;
		}	
	}
}

int main()
{
	startup();
	while (1)
	{
		show();
		updateWithoutInput();
		updateWithInput();

		if ((enemy_x == position_x) && (enemy_y == position_y))
			break;
	}
	printf("\n");
	printf("game over\n");
}

 

 

 

 

 

你可能感兴趣的:(【C语言小游戏】,游戏,c语言)