项目: 空战游戏

一、项目描述和成果展示

项目描述:   在以往的程序中进行了改进。
例如:   可以发射多个子弹
        可以有多个敌机

飞机大战 1.0版
飞机大战 2.0版
现在这个版本是3.0版 这个版本的各个功能基本完善

效果图如下:

在这里插入图片描述
在这里插入图片描述

二、发射多个子弹

代码如下:

#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<Windows.h>

#define High 25 //游戏的尺寸
#define Width 50

//全局变量
int position_x,position_y;//飞机的位置
int canvas[High][Width]={0};
//二维数组存储游戏画布中对应的元素
//0为空格 1为飞机  2为子弹  3为敌机

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()//数据的初始化
{
	position_x=High/2;
	position_y=Width/2;
	canvas[position_x][position_y]=1;
}

void show()//显示画面
{
	int i,j;
	gotoxy(0,0);//将光标移动到原点位置,以下重画清屏
	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("|");//输出子弹
		}
		printf("\n");
	}
}

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;
			}
		}
	}
}

void updateWithInput()//与用户输入有关的更新
{
	char input;
	if(kbhit())//判断是否有输入
	{
		input=getch();//根据用户的不同输入来移动
		if(input=='a'||input=='A')
		{
			canvas[position_x][position_y]=0;
			position_y--;//位置左移
			canvas[position_x][position_y]=1;
		}
		else if(input=='d'||input=='D')
		{
			canvas[position_x][position_y]=0;
			position_y++;//位置右移
			canvas[position_x][position_y]=1;
		}
		else if(input=='w'||input=='W')
		{
			canvas[position_x][position_y]=0;
			position_x--;//位置上移
			canvas[position_x][position_y]=1;
		}
		else if(input=='s'||input=='S')
		{
			canvas[position_x][position_y]=0;
			position_x++;//位置下移
			canvas[position_x][position_y]=1;
		}
		else if(input==' ')//发射子弹
		{
			canvas[position_x-1][position_y]=2;
			//发射子弹的初始位置在飞机的正上方
		}
	}
}

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

效果图如下:
在这里插入图片描述

三、多个敌机

代码如下:

#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<Windows.h>

#define High 25 //游戏的尺寸
#define Width 50
#define EnemyNum 5//敌机的个数

//全局变量
int position_x,position_y;//飞机的位置
int enemy_x[EnemyNum],enemy_y[EnemyNum];//敌机的位置
int canvas[High][Width]={0};
//二维数组存储游戏画布中对应的元素
//0为空格 1为飞机  2为子弹  3为敌机
int score;//得分

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()//数据的初始化
{
	int k;
	position_x=High-1;
	position_y=Width/2;
	canvas[position_x][position_y]=1;
	for(k=0;k<EnemyNum;k++)
	{
		enemy_x[k]=rand()%2;
		enemy_y[k]=rand()%Width;
		canvas[enemy_x[k]][enemy_y[k]]=3;
	}
	score=0;
}

void show()//显示画面
{
	int i,j;
	gotoxy(0,0);//将光标移动到原点位置,以下重画清屏
	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("得分:%3d\n",score);
	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]) )//子弹击中敌机
					{
						score++;//分数加一
						canvas[enemy_x[k]][enemy_y[k]]=0;
						enemy_x[k]=rand()%2;//产生新的飞机
						enemy_y[k]=rand()%Width;
						canvas[enemy_x[k]][enemy_y[k]]=3;
						canvas[i][j]=0;//子弹消失
					}
				}
				//子弹向上移动
				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);
		}
		if(enemy_x[k]>High)//敌机跑出屏幕
		{
			canvas[enemy_x[k]][enemy_y[k]]=0;
			enemy_x[k]=rand()%2;//产生新的飞机
			enemy_y[k]=rand()%Width;
			canvas[enemy_x[k]][enemy_y[k]]=3;
			score--;//减分
		}
		static int speed=0;
		if(speed<36)
			speed++;
		if(speed==36)
		{
			//敌机下落
			for(k=0;k<EnemyNum;k++)
			{
				canvas[enemy_x[k]][enemy_y[k]]=0;
				enemy_x[k]++;
				speed=0;
				canvas[enemy_x[k]][enemy_y[k]]=3;
			}
		}
	}
}

void updateWithInput()//与用户输入有关的更新
{
	char input;
	if(kbhit())//判断是否有输入
	{
		input=getch();//根据用户的不同输入来移动
		if(input=='a'||input=='A')
		{
			canvas[position_x][position_y]=0;
			position_y--;//位置左移
			canvas[position_x][position_y]=1;
		}
		else if(input=='d'||input=='D')
		{
			canvas[position_x][position_y]=0;
			position_y++;//位置右移
			canvas[position_x][position_y]=1;
		}
		else if(input=='w'||input=='W')
		{
			canvas[position_x][position_y]=0;
			position_x--;//位置上移
			canvas[position_x][position_y]=1;
		}
		else if(input=='s'||input=='S')
		{
			canvas[position_x][position_y]=0;
			position_x++;//位置下移
			canvas[position_x][position_y]=1;
		}
		else if(input==' ')//发射子弹
		{
			canvas[position_x-1][position_y]=2;
			//发射子弹的初始位置在飞机的正上方
		}
	}
}

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

效果图如下:
在这里插入图片描述

四、增加子弹升级功能

当分数达到一定的值自动升级炮弹,当分数下降一定数值后炮弹下降一个等级。

代码如下:

#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<Windows.h>

#define High 25 //游戏的尺寸
#define Width 40
#define EnemyNum 5//敌机的个数

//全局变量
int position_x,position_y;//飞机的位置
int enemy_x[EnemyNum],enemy_y[EnemyNum];//敌机的位置
int canvas[High][Width]={0};
//二维数组存储游戏画布中对应的元素
//0为空格 1为飞机  2为子弹  3为敌机

int score;//得分
int BulletWidth;//子弹的宽度
int EnemyMoveSpeed;//敌机的移动速度

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()//数据的初始化
{
	int k;
	position_x=High-1;
	position_y=Width/2;
	canvas[position_x][position_y]=1;
	for(k=0;k<EnemyNum;k++)
	{
		enemy_x[k]=rand()%2;
		enemy_y[k]=rand()%Width;
		canvas[enemy_x[k]][enemy_y[k]]=3;
	}
	score=0;
	BulletWidth=0;
	EnemyMoveSpeed=20;
}

void show()//显示画面
{
	int i,j;
	gotoxy(0,0);//将光标移动到原点位置,以下重画清屏
	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("════════════════════════════════════════\n");
	printf("得分:%3d\n",score);
	system("date /t");
	system("time /t");
	Sleep(20);
}

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

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-1==enemy_x[k])&&(j==enemy_y[k]) )//子弹击中敌机
					{
						score++;//分数加一
						if(score%5==0&&EnemyMoveSpeed>3)//达到一定积分后敌机变快
							EnemyMoveSpeed--;
						if(score/5)//达到一定积分后子弹变厉害
						{
							BulletWidth=0;
							BulletWidth=BulletWidth+score/5;
							if(BulletWidth>5)//子弹加到一定威力后,会固定不变
								BulletWidth=5;
						}
						canvas[enemy_x[k]][enemy_y[k]]=0;
						enemy_x[k]=rand()%2;//产生新的飞机
						enemy_y[k]=rand()%Width;
						canvas[enemy_x[k]][enemy_y[k]]=3;
						canvas[i][j]=0;//子弹消失
					}
				}
				//子弹向上移动
				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);
		}
		if(enemy_x[k]>High)//敌机跑出屏幕
		{
			canvas[enemy_x[k]][enemy_y[k]]=0;
			enemy_x[k]=rand()%2;//产生新的飞机
			enemy_y[k]=rand()%Width;
			canvas[enemy_x[k]][enemy_y[k]]=3;
			score--;//减分
			if(score%5==0&&score>0)//减的分数过多,子弹威力下降
			{
				BulletWidth--;
				EnemyMoveSpeed++;
			}
		}
		static int speed=0;
		if(speed<EnemyMoveSpeed)
			speed++;
		if(speed==EnemyMoveSpeed)
		{
			//敌机下落
			for(k=0;k<EnemyNum;k++)
			{
				canvas[enemy_x[k]][enemy_y[k]]=0;
				enemy_x[k]++;
				speed=0;
				canvas[enemy_x[k]][enemy_y[k]]=3;
			}
		}
	}
}

void updateWithInput()//与用户输入有关的更新
{
	char input;
	if(kbhit())//判断是否有输入
	{
		input=getch();//根据用户的不同输入来移动
		if(input=='a'||input=='A')
		{
			canvas[position_x][position_y]=0;
			position_y--;//位置左移
			if(position_y==0)
				position_y++;
			canvas[position_x][position_y]=1;
		}
		else if(input=='d'||input=='D')
		{
			canvas[position_x][position_y]=0;
			position_y++;//位置右移
			if(position_y==Width-1)
				position_y--;
			canvas[position_x][position_y]=1;
		}
		else if(input=='w'||input=='W')
		{
			canvas[position_x][position_y]=0;
			position_x--;//位置上移
			if(position_x==0)
				position_x++;
			canvas[position_x][position_y]=1;
		}
		else if(input=='s'||input=='S')
		{
			canvas[position_x][position_y]=0;
			position_x++;//位置下移
			if(position_x==High)
				position_x--;
			canvas[position_x][position_y]=1;
		}
		else 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();//数据的初始化
	HideCursor();
	system("title 游戏中");
	system("color 09");
	while(1)//游戏循环执行
	{
		show();//显示画面
		updateWithoutInput();//与用户输入无关的更新
		updateWithInput();//与用户输入有关的更新
	}
	return 0;
}

效果图如下:

在这里插入图片描述

五、增加一些小功能

增加一个主菜单
里面增加了一些小的功能

代码如下:

#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<Windows.h>

#define High 25 //游戏的尺寸
#define Width 40
#define EnemyNum 5//敌机的个数

//全局变量
int position_x,position_y;//飞机的位置
int enemy_x[EnemyNum],enemy_y[EnemyNum];//敌机的位置
int canvas[High][Width]={0};
//二维数组存储游戏画布中对应的元素
//0为空格 1为飞机  2为子弹  3为敌机

int score;//得分
int BulletWidth;//子弹的宽度
int EnemyMoveSpeed;//敌机的移动速度

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()//数据的初始化
{
	int k;
	position_x=High-1;
	position_y=Width/2;
	canvas[position_x][position_y]=1;
	for(k=0;k<EnemyNum;k++)
	{
		enemy_x[k]=rand()%2;
		enemy_y[k]=rand()%Width;
		canvas[enemy_x[k]][enemy_y[k]]=3;
	}
	score=0;
	BulletWidth=0;
	EnemyMoveSpeed=20;
}

void show()//显示画面
{
	int i,j;
	gotoxy(0,0);//将光标移动到原点位置,以下重画清屏
	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("════════════════════════════════════════\n");
	printf("得分:%3d\n",score);
	system("date /t");
	system("time /t");
	printf("提示:按 z 键回到主菜单");
	Sleep(20);
}

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

int 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-1==enemy_x[k])&&(j==enemy_y[k]) )//子弹击中敌机
					{
						score++;//分数加一
						if(score%5==0&&EnemyMoveSpeed>3)//达到一定积分后敌机变快
							EnemyMoveSpeed--;
						if(score/5)//达到一定积分后子弹变厉害
						{
							BulletWidth=0;
							BulletWidth=BulletWidth+score/5;
							if(BulletWidth>5)//子弹加到一定威力后,会固定不变
								BulletWidth=5;
						}
						canvas[enemy_x[k]][enemy_y[k]]=0;
						enemy_x[k]=rand()%2;//产生新的飞机
						enemy_y[k]=rand()%Width;
						canvas[enemy_x[k]][enemy_y[k]]=3;
						canvas[i][j]=0;//子弹消失
					}
				}
				//子弹向上移动
				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]) )//敌机撞到我机
		{
			system("cls");
			printf("失败\n");
			printf("得分:%d\n",score);
			printf("正在返回主菜单\n");
			Sleep(3000);
			return 1;
		}
		if(enemy_x[k]>High)//敌机跑出屏幕
		{
			canvas[enemy_x[k]][enemy_y[k]]=0;
			enemy_x[k]=rand()%2;//产生新的飞机
			enemy_y[k]=rand()%Width;
			canvas[enemy_x[k]][enemy_y[k]]=3;
			score--;//减分
			if(score%5==0&&score>0)//减的分数过多,子弹威力下降
			{
				BulletWidth--;
				EnemyMoveSpeed++;
			}
		}
		static int speed=0;
		if(speed<EnemyMoveSpeed)
			speed++;
		if(speed==EnemyMoveSpeed)
		{
			//敌机下落
			for(k=0;k<EnemyNum;k++)
			{
				canvas[enemy_x[k]][enemy_y[k]]=0;
				enemy_x[k]++;
				speed=0;
				canvas[enemy_x[k]][enemy_y[k]]=3;
			}
		}
	}
	return 0;
}

void updateWithInput(char input)//与用户输入有关的更新
{
		if(input=='a'||input=='A')
		{
			canvas[position_x][position_y]=0;
			position_y--;//位置左移
			if(position_y==0)
				position_y++;
			canvas[position_x][position_y]=1;
		}
		else if(input=='d'||input=='D')
		{
			canvas[position_x][position_y]=0;
			position_y++;//位置右移
			if(position_y==Width-1)
				position_y--;
			canvas[position_x][position_y]=1;
		}
		else if(input=='w'||input=='W')
		{
			canvas[position_x][position_y]=0;
			position_x--;//位置上移
			if(position_x==0)
				position_x++;
			canvas[position_x][position_y]=1;
		}
		else if(input=='s'||input=='S')
		{
			canvas[position_x][position_y]=0;
			position_x++;//位置下移
			if(position_x==High)
				position_x--;
			canvas[position_x][position_y]=1;
		}
		else 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;
			//发射子弹的初始位置在飞机的正上方
		}
}

void gamemenu()//游戏菜单
{
	int temp=0;
	int i,j;
	char input;
	for(i=0;i<High;i++)//数组初始化
	{
		for(j=0;j<Width;j++)
		{
            canvas[i][j]=0;
		}
		printf("\n");
	}
	startup();//数据的初始化
	system("cls");
	while(1)
	{
		show();//显示画面
		temp=updateWithoutInput();//与用户输入无关的更新
		if(kbhit())//判断是否有输入
		{
			input=getch();
			updateWithInput(input);//与用户输入有关的更新
			if(input=='z'||input=='Z')
				temp=1;
		}
		if(temp==1)
		{
			system("cls");
			break;
		}
	}
}
void help()//帮助菜单
{
	char input;
	system("cls");
	printf("\n\n\n\n\n\n\n\n");
	printf("---------------------------------------\n");
	printf("                 帮助菜单                \n\n");
	printf("      1. 按空格发射炮弹                 \n");
	printf("      2. a 键左移                      \n");
	printf("      3. d 键右移                      \n");
	printf("      4. w 键上移                      \n");
	printf("      5. s 键下移                      \n");
	printf("---------------------------------------\n");
	printf("\n\n提示:按 z 键回到主菜单\n");
	printf("\n\n               祝您玩的愉快!\n");
	while(1)
	{
		input=getch();
		if(input=='z')
		{
			break;
		}
	}
}
void quit()//退出菜单
{
	exit(0);
}

void menu()//主菜单
{
	char change;
	system("cls");
	printf("\n--------------------------------------------\n");
	printf("                   8\n");
	printf("                   88\n"); 
	printf("                    888\n");
	printf("                     8888\n");
	printf("                  8888888888888\n");
	printf("                     8888\n");
	printf("                    888\n");
	printf("                   88\n");
	printf("                   8\n");
	printf("\n\n\n               Welcome to fly war!\n");
	printf("\n\n\n\n");
	printf("                 主菜单                \n\n"); 
	printf("      1. 进入游戏                 \n");
	printf("      2. 帮助菜单                      \n");
	printf("      3. 退出游戏                      \n");
	printf("---------------------------------------\n");
	printf("\n\n               祝您玩的愉快!\n");
	change=getch();
	switch(change)
	{
	case '1':
		gamemenu();//游戏菜单
		break;
	case '2':
		help();//帮助菜单
		break;
	case '3':
		quit();//退出菜单
		break;      
	}
}
int main()
{
	HideCursor();
	system("title 游戏中");
	system("color 09");
	system("mode 50,30");
	while(1)//游戏循环执行
	{
		menu();
	}
	return 0;
}

效果图如下:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值