项目:用封装的方法实现飞机大战游戏

目录

  • 一、项目描述和最终的成果展示
  • 二、用函数进行封装
  • 三、新型的发射子弹功能
  • 四、实现移动的敌机功能和更正屏幕闪烁,清除光标功能
  • 五、订正一些BUG和完成一些美化

这是上一次的飞机大战游戏的项目。项目: 最简单的飞机大战游戏
上次没有用函数进行的封装。这次在上次的基础上进行封装和一些功能的优化。

一、项目描述和最终的成果展示

项目描述:   在上一次的基础上用函数进行了封装,对于一些功能也进行了一些优化。

最终效果图如下:
项目:用封装的方法实现飞机大战游戏_第1张图片

二、用函数进行封装

代码如下:

#include
#include
#include
#include

//全局变量
int position_x,position_y;//飞机位置
int high,width;//游戏画面尺寸

void startup()//数据的初始化
{
	high = 20;
	width = 30;
	position_x = high/2;//飞机的上下位置
	position_y = width/2;//飞机的左右·位置
}

void show()//显示画面
{
	system("cls");
	int i,j;
	for(i=0;i<high;i++)
	{
		for(j=0;j<width;j++)
		{
			if( (i == position_x) && (j== position_y))//输出飞机
				printf("☆");
			else
				printf(" ");
		}
        printf("\n");
	}
}

void updateWithoutInput()//与用户输入无关的更新
{

}

void updateWithInput()//与用户输入有关的更新
{
	char input;
	if(kbhit())//判断有无输入
	{
		input=getch();
		if( input == 'a' || input == 'A')
			position_y--;//左移
		if( input == 'd' || input == 'D')
			position_y++;//右移
		if( input == 'w' || input == 'W')
			position_x--;//上移
		if( input == 's' || input == 'S')
			position_x++;//下移
	}
}


int main(void)
{
	startup();  //数据的初始化
	while(1)
	{
		show();//显示画面
	    updateWithoutInput();//与用户输入无关的更新
		updateWithInput();//与用户输入有关的更新
	}
	return 0;
}

三、新型的发射子弹功能

代码如下:

#include
#include
#include
#include

//全局变量
int position_x,position_y;//飞机位置
int high,width;//游戏画面尺寸
int bullet_x,bullet_y;//子弹位置


//定义隐藏光标函数
void HideCursor()
{
	CONSOLE_CURSOR_INFO cursor;    
	cursor.bVisible = FALSE;    
	cursor.dwSize = sizeof(cursor);    
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);    
	SetConsoleCursorInfo(handle, &cursor);
}


void startup()//数据的初始化
{
	high = 120;
	width = 100;
	position_x = high/2;//飞机的上下位置
	position_y = width/2;//飞机的左右·位置
	bullet_x = 0;
	bullet_y = position_y;
}

void show()//显示画面
{
	system("cls");
	int i,j;
	for(i=0;i<high;i++)
	{
		for(j=0;j<width;j++)
		{
			if( (i == position_x) && (j== position_y))//输出飞机
				printf("☆");
			else if( (i == bullet_x)&&(j == bullet_y))
				printf("|");//输出子弹
			else
				printf(" ");
		}
        printf("\n");
	}
}

void updateWithoutInput()//与用户输入无关的更新
{
	if(bullet_x>-1)
		bullet_x--;
}

void updateWithInput()//与用户输入有关的更新
{
	char input;
	if(kbhit())
	{
		input=getch();
		if( input == 'a' || input == 'A')
			position_y--;//左移
		if( input == 'd' || input == 'D')
			position_y++;//右移
		if( input == 'w' || input == 'W')
			position_x--;//上移
		if( input == 's' || input == 'S')
			position_x++;//下移
		if( input == ' ')
		{
			bullet_x=position_x-1;
			bullet_y=position_y;
		}
	}
}


int main(void)
{
	startup();//数据的初始化
	while(1)
	{
		show();//显示画面
		HideCursor();//隐藏光标,防止光标乱闪。
	    updateWithoutInput();//与用户输入无关的更新
		updateWithInput();//与用户输入有关的更新
	}
	return 0;
}

效果图如下:

发射子弹的功能和上次有了明显的改进,有了一个动态发射的一个效果。

四、实现移动的敌机功能和更正屏幕闪烁,清除光标功能

代码如下;

#include
#include
#include
#include

//全局变量
int position_x,position_y;//飞机位置
int high,width;//游戏画面尺寸
int bullet_x,bullet_y;//子弹位置
int enemy_x,enemy_y;//敌机的位置
int score;//得分


//定义隐藏光标函数
void HideCursor()
{
	CONSOLE_CURSOR_INFO cursor;    
	cursor.bVisible = FALSE;    
	cursor.dwSize = sizeof(cursor);    
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);    
	SetConsoleCursorInfo(handle, &cursor);
}

void gotoxy(int x,int y)//将光标移动到(x,y)位置
{
	HANDLE handle =GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle,pos);
}
void startup()//数据的初始化
{
	system("color 09");
	high = 30;
	width =50;
	position_x = high/2;//飞机的上下位置
	position_y = width/2;//飞机的左右位置
	bullet_x = 0;
	bullet_y = position_y;
	enemy_x=0;
	enemy_y=position_y;
	score=0;
}

void show()//显示画面
{
	//system("cls");
	gotoxy(0,0);
	int i,j;
	for(i=0;i<high;i++)
	{
		for(j=0;j<width;j++)
		{
			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("得分:%d\n",score);
}

void updateWithoutInput()//与用户输入无关的更新
{
	static int speed=0;
	if(bullet_x>-1)
		bullet_x--;
	 if( (bullet_x == enemy_x) && (bullet_y ==enemy_y) )//子弹击中飞机
	 {
		 score++;//分数无效
		 enemy_x=-1;//产生新的敌机
		 enemy_y=rand()%width;
		 bullet_x=-2;//子弹无效
	 }
	// 用来控制敌机向下移动的速度,每隔几次循环才移动一次敌机
	// 这样修改,虽然用户按键的交互速度还是很快,但是NPC的移动显示可以降速
	if(speed<10)
		speed++;
	if(speed == 10 )
	{
		enemy_x++;
		speed = 0;
	}
}

void updateWithInput()//与用户输入有关的更新
{
	char input;
	if(kbhit())
	{
		input=getch();
		if( input == 'a' || input == 'A')
			position_y--;//左移
		if( input == 'd' || input == 'D')
			position_y++;//右移
		if( input == 'w' || input == 'W')
			position_x--;//上移
		if( input == 's' || input == 'S')
			position_x++;//下移
		if( input == ' ')
		{
			bullet_x=position_x-1;
			bullet_y=position_y;
		}
	}
}


int main(void)
{
	startup();//数据的初始化
	while(1)
	{
		show();//显示画面
		HideCursor();//隐藏光标,防止光标乱闪。
	    updateWithoutInput();//与用户输入无关的更新
		updateWithInput();//与用户输入有关的更新
	}
	return 0;
}

效果图如下:

五、订正一些BUG和完成一些美化

我们的项目基本是已经完成了。但是还有很多的漏洞。
比如:  飞机控制越界问题,以及敌机越界问题。
而且界面不够好看我们要再美化一下。
以及增加游戏暂停功能。
游戏结束功能。

代码如下:

#include
#include
#include
#include

//全局变量
int position_x,position_y;//飞机位置
int high,width;//游戏画面尺寸
int bullet_x,bullet_y;//子弹位置
int enemy_x,enemy_y;//敌机的位置
int score;//得分


//定义隐藏光标函数
void HideCursor()
{
	CONSOLE_CURSOR_INFO cursor;    
	cursor.bVisible = FALSE;    
	cursor.dwSize = sizeof(cursor);    
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);    
	SetConsoleCursorInfo(handle, &cursor);
}

void gotoxy(int x,int y)//将光标移动到(x,y)位置
{
	HANDLE handle =GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle,pos);
}
void startup()//数据的初始化
{
	system("color 09");
	high = 30;
	width =50;
	position_x = high/2;//飞机的上下位置
	position_y = width/2;//飞机的左右位置
	bullet_x = 0;
	bullet_y = position_y;
	enemy_x=0;
	enemy_y=position_y;
	score=0;
}

void show()//显示画面
{
	//system("cls");
	gotoxy(0,0);
	int i,j;
	for(i=0;i<high;i++)
	{
		for(j=0;j<width;j++)
		{
			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 if(j==width-1&&i==position_x)
				//飞机那一行,因为有飞机多占一格,所以要删除前面的一个空格
				printf("\b+");
			else if(j==width-1)
				printf("+");
			else if(i==high-1)
				printf("-");
			else
				printf(" ");//输出空格
		}
        printf("\n");
	}
	printf("得分:%d\n",score);
	printf("按1键游戏暂停\n");
}

void updateWithoutInput()//与用户输入无关的更新
{
	static int speed=0;
	if(bullet_x>-1)
		bullet_x--;
	 if( (bullet_x == enemy_x) && (bullet_y ==enemy_y) )//子弹击中飞机
	 {
		 score++;//分数无效
		 enemy_x=-1;//产生新的敌机
		 enemy_y=rand()%width+1;
		 bullet_x=-2;//子弹无效
	 }
	// 用来控制敌机向下移动的速度,每隔几次循环才移动一次敌机
	// 这样修改,虽然用户按键的交互速度还是很快,但是NPC的移动显示可以降速
	if(speed<6)
		speed++;
	if(speed == 6 )
	{
		enemy_x++;
		if(enemy_x==high-1)//如果飞机越界再次生成
		{
			enemy_x=-1;//产生新的敌机
			enemy_y=rand()%width+1;
		}
		if( enemy_x==position_x-1)//撞机了 游戏结束
		{
			system("cls");
			printf("飞机坠毁了,游戏结束\n");
			printf("分数为:%d\n",score);
			printf("请重启再开始新的一局\n");
			while(1)
			{

			}
		}
		speed = 0;
	}
}

void updateWithInput()//与用户输入有关的更新
{
	char input;
	if(kbhit())
	{
		input=getch();
		if( input == 'a' || input == 'A')
		{
			position_y--;//左移
			if(position_y==0)//判断是否越界
			{
				position_y++;
			}
		}
		if( input == 'd' || input == 'D')
		{
			position_y++;//右移
			if(position_y==width-2)//判断是否越界
			{
				position_y--;
			}
		}
		if( input == 'w' || input == 'W')
		{
			position_x--;//上移
			if(position_x==1)//判断是否越界
			{
				position_x++;
			}
		}
		if( input == 's' || input == 'S')
		{
			position_x++;//下移
			if(position_x==high-1)//判断是否越界
			{
				position_x--;
			}
		}
		if( input == ' ')//发射子弹
		{
			bullet_x=position_x-1;
			bullet_y=position_y;
		}
		if( input == '1')//按1键游戏暂停
		{
			while(1)
			{
				input=getch();
				if(input == '1')//再按1键游戏继续
					break;
			}
		}
	}
}


int main(void)
{
	startup();//数据的初始化
	while(1)
	{
		show();//显示画面
		HideCursor();//隐藏光标,防止光标乱闪。
	    updateWithoutInput();//与用户输入无关的更新
		updateWithInput();//与用户输入有关的更新
	}
	return 0;
}

效果图如下:
项目:用封装的方法实现飞机大战游戏_第2张图片

你可能感兴趣的:(C语言游戏开发,c++,游戏,C语言)