我是电脑玩家之打飞机游戏C语言数组法实现(高阶版)

首先我要表示抱歉,很长一段时间都没有更新博客了,这次回来我又带着我的新型升级版游戏见大家,希望你们喜欢!!!

暴击single敌人版

这里我添加了血条值,还实现了飞机连续射子弹的功能,敌机也可以向下移动随机出现,使游戏更加真实,代码里我还添加了更多的注释,更加便于大家对代码的理解

效果如下:

击杀Single敌机版(C代码实现)

详细代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>

#define high 20				//游戏画面尺寸 
#define width 36			//如果不把这两个变量设为符号常量而设为全局变量,编译器就会报错 
							//至于为什么大家可以在评论区下讨论,我想看看大家对这个的想法
							//问题:符号常量与全局变量有什么区别? 
							//最后我会公布答案

int x, y;					//飞机坐标 
int enemy_x, enemy_y;		//敌机坐标		
int score;					//得分 
int life;					//飞机生命值 
int canvas[high][width + 17] = {0};		//二维数组存储游戏画布中对应的元素
										//1为飞机,2为子弹,3为敌机 
										//width + 17 是为了保证飞机右翼不会超出右线
										//而之后的enemy_y = rand() * 100 % width + 9;是
										//为了保证敌机在左边线以右9个单位的距离
										//这是间接的控制飞机左翼不超过左边界的方法 
int digit(int s)
{
	int ne, t, bi;
	ne = s;
	int num = 0;
	while(ne)
	{
		t = ne % 10;
		ne /= 10;
		num++;
	}
	return num;
} 
								 
void startup()
{
	
	x = high / 2;
	y = width / 2;
	canvas[x][y] = 1; 
	enemy_x = 0;
	enemy_y = y;
	life = 3; 
	canvas[enemy_x][enemy_y] = 3;
	score = 0;
}

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 HideCursor()
{
	CONSOLE_CURSOR_INFO cursor_info = {1, 0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}


void show()
{
	gotoxy(0, 0);
	HideCursor();
	int i, j;
	
	for(i = 0; i < high; i++)
	{
		for(j = 0; j < width + 17; j++)
		{
			if((i == x) && (j == y))
			{
				printf("*");
			}	
			else if((i == x + 1) && (j == y - 2))
			{
				printf(" * *");
				j += 3;
			}
			else if((i == x + 2) && (j == y - 2))
			{
				printf("* * *");
				j += 4;
			}
			else if((i == x + 3) && (j == y - 6))
			{
				printf("* * * * * * *");
				j += 12;
			}
			else if((i == x + 4) && (j == y - 8))
			{
				printf("* * * * * * * * *");
				j += 16;
			}
			else if((i == x + 5) && (j == y - 1))
			{
				printf("* * ");
				j += 3;
			}
			else if(canvas[i][j] == 3)
				printf("@");
			else if(canvas[i][j] == 2)
				printf("|");
			else
				printf(" ");
		}
		printf("#\n");
	}
	
	printf("生命值:%d", life);
	int space = digit(life);
	if(space == 1)
	{
		for(i = 0; i < width + 8; i++)
			printf(" ");
	}
	else
	{
		for(i = 0; i < width + 8 - (space - 1); i++)
			printf(" ");
	}
	printf("#\n");
	printf("得分:%d", score);
	int space2 = digit(score);
	if(space2 == 1)
	{
		for(i = 0; i < width + 9; i++)
			printf(" ");
	}
	else
	{
		for(i = 0; i < width + 9 - (space2 - 1); i++)
			printf(" ");
	}
	printf("#\n");
	for(i = 0; i < width + 17; i++)
		printf("#");
}

void updateWithoutInput()		//与用户输入无关的更新 
{
	int i, j;
	for(i = 0; i < high; i++)
	{
		for(j = 0; j < width + 17; j++)
		{
			if(canvas[i][j] == 2)
			{
				if((i - 1 == enemy_x) && (j == enemy_y))
				{
					score++;			//得分 
					canvas[enemy_x][enemy_y] = 0;		//敌机已被消灭 
					enemy_x = 0;
					enemy_y = rand() * 100 % width + 9;
					canvas[enemy_x][enemy_y] = 3;		//产生敌机 
					canvas[i][j] = 0;					//子弹消耗掉 
				}
				canvas[i][j] = 0;
				if(i > 0)
					canvas[i - 1][j] = 2;		//子弹向上移动 
			}
		}
	}
	if(enemy_x > high)		//防线被突破 
	{
		canvas[enemy_x][enemy_y] = 0;
		enemy_x = 0;
		enemy_y = rand() * 100 % width + 9;
		canvas[enemy_x][enemy_y] = 3;
		score--;			//减分 
		life--;
	}
	
	if(enemy_x >= x) 
	{
		life--;
		score--;
		if(life == 0)
		{
			printf("\n任务失败!!!\n");
			system("pause");
			exit(0);
		}
		canvas[enemy_x][enemy_y] = 0;
		enemy_x = 0;
		enemy_y = rand() * 100 % width + 9;
		canvas[enemy_x][enemy_y] = 3;
	}
	
	static int speed = 0;	//控制敌机下落速度 
	if(speed < 10)
		speed++;
	if(speed == 10)
	{
		canvas[enemy_x][enemy_y] = 0; 
		enemy_x++;
		speed = 0;
		canvas[enemy_x][enemy_y] = 3;
	} 
}

void updateWithInput()		//与用户输入有关的更新 
{
	char input;
	if(kbhit())
	{
		input = getch();
		if(input == 'a')
		{
			canvas[x][y] = 0;
			y--;
			canvas[x][y] = 1;
		} 
			
		if(input == 'd')
		{
			canvas[x][y] = 0;
			y++;
			canvas[x][y] = 1;
		} 
		if(input == 'w')
		{
			canvas[x][y] = 0;
			x--;
			canvas[x][y] = 1;
		} 
		if(input == 's')
		{
			canvas[x][y] = 0;
			x++;
			canvas[x][y] = 1;
		} 
		if(input == ' ')
		{
//			bullet_x = x - 1;
//			bullet_y = y;
			canvas[x - 1][y] = 2;
		}
	}
}


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

炫酷出场方式版

我才是电脑玩家之酷炫出场飞机(C代码实现)

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>

#define high 20				//游戏画面尺寸 
#define width 36			//如果不把这两个变量设为符号常量而设为全局变量,编译器就会报错 
							//至于为什么大家可以在评论区下讨论,我想看看大家对这个的想法
							//问题:符号常量与全局变量有什么区别? 
							//最后我会公布答案

int x, y;					//飞机坐标 
int enemy_x, enemy_y;		//敌机坐标		
int score;					//得分 
int life;					//飞机生命值 
int canvas[high][width] = {0};		//二维数组存储游戏画布中对应的元素
									//1为飞机,2为子弹,3为敌机 

								 
void startup()
{
	x = high / 2;
	y = width / 2;
	canvas[x][y] = 1; 						//我方位置 
	enemy_x = 0;
	enemy_y = y;
	life = 3; 
	canvas[enemy_x][enemy_y] = 3;			//敌机位置 
	score = 0;
}

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 HideCursor()
{
	CONSOLE_CURSOR_INFO cursor_info = {1, 0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}


void show()
{
	gotoxy(0, 0);
	HideCursor();
	int i, j;
	for(i = 0; i < high; i++)
	{
		for(j = 0; j < width + 6; j++)
		{
			if((i == x) && (j == y))
			{
				printf("*");
			}	
			else if((i == x + 1) && (j == y - 2))
			{
				printf(" * *");
				j += 3;
			}
			else if((i == x + 2) && (j == y - 2))
			{
				printf("* * *");
				j += 4;
			}
			else if((i == x + 3) && (j == y - 6))
			{
				printf("* * * * * * *");
				j += 12;
			}
			else if((i == x + 4) && (j == y - 8))
			{
				printf("* * * * * * * * *");
				j += 16;
			}
			else if((i == x + 5) && (j == y - 1))
			{
				printf("* * ");
				j += 3;
			}
			else if(canvas[i][j] == 3)			//显示敌机 
				printf("@");
			else if(canvas[i][j] == 2)			//显示子弹 
				printf("|");
			else
				printf(" ");
		}
		printf("\n");
	}
	printf("生命值:%d", life);
	printf("\n得分:%d\n", score);
	for(i = 0; i < width; i++)
		printf("-");
}

void updateWithoutInput()		//与用户输入无关的更新 
{
	int i, j;
	for(i = 0; i < high; i++)
	{
		for(j = 0; j < width + 6; j++)
		{
			if(canvas[i][j] == 2)			//子弹位置 
			{
				if((i - 1 == enemy_x) && (j == enemy_y))	
				{
					score++;			//得分 
					canvas[enemy_x][enemy_y] = 0;
					enemy_x = 0;
					enemy_y = rand() * 100 % width + 9;
					canvas[enemy_x][enemy_y] = 3;
					canvas[i][j] = 0;
				}
				canvas[i][j] = 0;
				if(i > 0)
					canvas[i - 1][j] = 2;
			}
		}
	}
	if(enemy_x > high)		//防线被突破 
	{
		canvas[enemy_x][enemy_y] = 0;
		enemy_x = 0;
		enemy_y = rand() * 100 % width + 9;
		canvas[enemy_x][enemy_y] = 3;
		score--;			//减分 
		life--;
	}
	
	if(enemy_x >= x) 
	{
		life--;
		score--;
		if(life == 0)
		{
			printf("\n任务失败!!!\n");
			system("pause");
			exit(0);
		}
		canvas[enemy_x][enemy_y] = 0;
		enemy_x = 0;
		enemy_y = rand() * 100 % width + 9;
		canvas[enemy_x][enemy_y] = 3;
	}
	
	static int speed = 0;	//控制敌机下落速度 
	if(speed < 10)
		speed++;
	if(speed == 10)
	{
		canvas[enemy_x][enemy_y] = 0; 
		enemy_x++;
		speed = 0;
		canvas[enemy_x][enemy_y] = 3;
	} 
}

void updateWithInput()		//与用户输入有关的更新 
{
	char input;
	if(kbhit())
	{
		input = getch();
		if(input == 'a')
		{
			canvas[x][y] = 0;
			y--;
			canvas[x][y] = 1;
		} 
			
		if(input == 'd')
		{
			canvas[x][y] = 0;
			y++;
			canvas[x][y] = 1;
		} 
		if(input == 'w')
		{
			canvas[x][y] = 0;
			x--;
			canvas[x][y] = 1;
		} 
		if(input == 's')
		{
			canvas[x][y] = 0;
			x++;
			canvas[x][y] = 1;
		} 
		if(input == ' ')
		{
//			bullet_x = x - 1;
//			bullet_y = y;
			canvas[x - 1][y] = 2;
		}
	}
}


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

吊打多数敌机版

这里我默认5个敌机,你们也可以按你们的想法多设几个都没问题

单枪匹马干对面敌机(C代码实现)

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>

#define high 30				//游戏画面尺寸 
#define width 36			//如果不把这两个变量设为符号常量而设为全局变量,编译器就会报错 
							//至于为什么大家可以在评论区下讨论,我想看看大家对这个的想法
							//问题:符号常量与全局变量有什么区别? 
							//最后我会公布答案
#define EnemyNum 5			//敌机数目
 

int x, y;									//飞机坐标 		
int enemy_x[EnemyNum], enemy_y[EnemyNum];	//敌机位置 
int score;									//得分 
int life;									//飞机生命值 
int canvas[high][width + 17] = {0};		//二维数组存储游戏画布中对应的元素
										//1为飞机,2为子弹,3为敌机 
										//width + 17 是为了保证飞机右翼不会超出右线
										//而之后的enemy_y = rand() * 100 % width + 9;是
										//为了保证敌机在左边线以右9个单位的距离
										//这是间接的控制飞机左翼不超过左边界的方法 
int digit(int s)
{
	int ne, t, bi;
	ne = s;
	int num = 0;
	while(ne)
	{
		t = ne % 10;
		ne /= 10;
		num++;
	}
	return num;
} 
								 
void startup()
{
	x = high - 6;
	y = width / 2;
	canvas[x][y] = 1; 
	int k;
	for(k = 0; k < EnemyNum; k++)
	{
		enemy_x[k] = rand() * 100 % 5;
		enemy_y[k] = rand() * 100 % width + 9;
		canvas[enemy_x[k]][enemy_y[k]] = 3;
	} 
	life = 3; 
	score = 0;
}

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 HideCursor()
{
	CONSOLE_CURSOR_INFO cursor_info = {1, 0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}


void show()
{
	gotoxy(0, 0);
	HideCursor();
	int i, j;
	for(i = 0; i < high; i++)
	{
		for(j = 0; j < width + 17; j++)
		{
			if((i == x) && (j == y))
			{
				printf("*");
			}	
			else if((i == x + 1) && (j == y - 2))
			{
				printf(" * *");
				j += 3;
			}
			else if((i == x + 2) && (j == y - 2))
			{
				printf("* * *");
				j += 4;
			}
			else if((i == x + 3) && (j == y - 6))
			{
				printf("* * * * * * *");
				j += 12;
			}
			else if((i == x + 4) && (j == y - 8))
			{
				printf("* * * * * * * * *");
				j += 16;
			}
			else if((i == x + 5) && (j == y - 1))
			{
				printf("* * ");
				j += 3;
			}
			else if(canvas[i][j] == 3)
				printf("@");
			else if(canvas[i][j] == 2)
				printf("|");
			else
				printf(" ");
		}
		printf("#\n");
	}
	
	printf("生命值:%d", life);
	int space = digit(life);
	if(space == 1)
	{
		for(i = 0; i < width + 8; i++)
			printf(" ");
	}
	else
	{
		for(i = 0; i < width + 8 - (space - 1); i++)
			printf(" ");
	}
	printf("#\n");
	printf("得分:%d", score);
	int space2 = digit(score);
	if(space2 == 1)
	{
		for(i = 0; i < width + 9; i++)
			printf(" ");
	}
	else
	{
		for(i = 0; i < width + 9 - (space2 - 1); i++)
			printf(" ");
	}
	printf("#\n");
	for(i = 0; i < width + 17; i++)
		printf("#");
}

void updateWithoutInput()		//与用户输入无关的更新 
{
	int i, j, k;
	for(i = 0; i < high; i++)
	{
		for(j = 0; j < width + 17; j++)
		{
			if(canvas[i][j] == 2)
			{
				for(k = 0; k < EnemyNum; k++)
				{
					if((i - 1 == enemy_x[k]) && (j == enemy_y[k]))
					{
						score++;			//得分 
						canvas[enemy_x[k]][enemy_y[k]] = 0;		//敌机已被消灭 
						enemy_x[k] = rand() % 100 % 5;
						enemy_y[k] = rand() * 100 % width + 9;
						canvas[enemy_x[k]][enemy_y[k]] = 3;		//产生敌机 
						canvas[i][j] = 0;					//子弹消耗掉 
					}
					canvas[i][j] = 0;
					if(i > 0)
						canvas[i - 1][j] = 2;		//子弹向上移动 
				}
				
			}
		}
	}
	static int speed = 0;	//控制敌机下落速度 
	
	for(k = 0; k < EnemyNum; k++)
	{
		if(enemy_x[k] > high)		//敌机跑出边界 
		{
			canvas[enemy_x[k]][enemy_y[k]] = 0;
			enemy_x[k] = rand() * 100 % 5;
			enemy_y[k] = rand() * 100 % width + 9;
			canvas[enemy_x[k]][enemy_y[k]] = 3;
			score--;				//减分 
			life--;
		}
		if(enemy_x[k] >= x) 		//敌机撞上我方 
		{
			life--;
			score--;
			sleep(1);
			if(life == 0)
			{
				printf("\n任务失败!!!\n");
				system("pause");
				exit(0);
			}
			canvas[enemy_x[k]][enemy_y[k]] = 0;
			enemy_x[k] = rand() * 100 % 5;
			enemy_y[k] = rand() * 100 % width + 9;
			canvas[enemy_x[k]][enemy_y[k]] = 3;
		}
		if(speed < 20)
			speed++;
		if(speed == 20)
		{
			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')
		{
			canvas[x][y] = 0;
			y--;
			canvas[x][y] = 1;
		} 
			
		if(input == 'd')
		{
			canvas[x][y] = 0;
			y++;
			canvas[x][y] = 1;
		} 
		if(input == 'w')
		{
			canvas[x][y] = 0;
			x--;
			canvas[x][y] = 1;
		} 
		if(input == 's')
		{
			canvas[x][y] = 0;
			x++;
			canvas[x][y] = 1;
		} 
		if(input == ' ')
		{
			canvas[x - 1][y] = 2;
		}
	}
}


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

吊打多数敌机改良版(让敌机不规则分散)

吊打多数敌机改良版(让敌机不规则分散)

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>

#define high 30				//游戏画面尺寸 
#define width 36			//如果不把这两个变量设为符号常量而设为全局变量,编译器就会报错 
							//至于为什么大家可以在评论区下讨论,我想看看大家对这个的想法
							//问题:符号常量与全局变量有什么区别? 
							//最后我会公布答案
#define EnemyNum 5			//敌机数目
 

int x, y;									//飞机坐标 		
int enemy_x[EnemyNum], enemy_y[EnemyNum];	//敌机位置 
int score;									//得分 
int life;									//飞机生命值 
int canvas[high][width + 17] = {0};		//二维数组存储游戏画布中对应的元素
										//1为飞机,2为子弹,3为敌机 
										//width + 17 是为了保证飞机右翼不会超出右线
										//而之后的enemy_y = rand() * 100 % width + 9;是
										//为了保证敌机在左边线以右9个单位的距离
										//这是间接的控制飞机左翼不超过左边界的方法 
int digit(int s)
{
	int ne, t, bi;
	ne = s;
	int num = 0;
	while(ne)
	{
		t = ne % 10;
		ne /= 10;
		num++;
	}
	return num;
} 
								 
void startup()
{
	x = high - 6;
	y = width / 2;
	canvas[x][y] = 1; 
	int k;
	for(k = 0; k < EnemyNum; k++)
	{
		enemy_x[k] = rand() * 100 % 13;
		enemy_y[k] = rand() * 100 % width + 9;
		canvas[enemy_x[k]][enemy_y[k]] = 3;
	} 
	life = 3; 
	score = 0;
}

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 HideCursor()
{
	CONSOLE_CURSOR_INFO cursor_info = {1, 0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}


void show()
{
	gotoxy(0, 0);
	HideCursor();
	int i, j;
	for(i = 0; i < high; i++)
	{
		for(j = 0; j < width + 17; j++)
		{
			if((i == x) && (j == y))
			{
				printf("*");
			}	
			else if((i == x + 1) && (j == y - 2))
			{
				printf(" * *");
				j += 3;
			}
			else if((i == x + 2) && (j == y - 2))
			{
				printf("* * *");
				j += 4;
			}
			else if((i == x + 3) && (j == y - 6))
			{
				printf("* * * * * * *");
				j += 12;
			}
			else if((i == x + 4) && (j == y - 8))
			{
				printf("* * * * * * * * *");
				j += 16;
			}
			else if((i == x + 5) && (j == y - 1))
			{
				printf("* * ");
				j += 3;
			}
			else if(canvas[i][j] == 3)
				printf("@");
			else if(canvas[i][j] == 2)
				printf("|");
			else
				printf(" ");
		}
		printf("#\n");
	}
	
	printf("生命值:%d", life);
	int space = digit(life);
	if(space == 1)
	{
		for(i = 0; i < width + 8; i++)
			printf(" ");
	}
	else
	{
		for(i = 0; i < width + 8 - (space - 1); i++)
			printf(" ");
	}
	printf("#\n");
	printf("得分:%d", score);
	int space2 = digit(score);
	if(space2 == 1)
	{
		for(i = 0; i < width + 9; i++)
			printf(" ");
	}
	else
	{
		for(i = 0; i < width + 9 - (space2 - 1); i++)
			printf(" ");
	}
	printf("#\n");
	for(i = 0; i < width + 17; i++)
		printf("#");
}

void updateWithoutInput()		//与用户输入无关的更新 
{
	int i, j, k;
	for(i = 0; i < high; i++)
	{
		for(j = 0; j < width + 17; j++)
		{
			if(canvas[i][j] == 2)
			{
				for(k = 0; k < EnemyNum; k++)
				{
					if((i - 1 == enemy_x[k]) && (j == enemy_y[k]))
					{
						score++;			//得分 
						canvas[enemy_x[k]][enemy_y[k]] = 0;		//敌机已被消灭 
						enemy_x[k] = rand() % 100 % 13;
						enemy_y[k] = rand() * 100 % width + 9;
						canvas[enemy_x[k]][enemy_y[k]] = 3;		//产生敌机 
						canvas[i][j] = 0;					//子弹消耗掉 
					}
					canvas[i][j] = 0;
					if(i > 0)
						canvas[i - 1][j] = 2;		//子弹向上移动 
				}
				
			}
		}
	}
	static int speed = 0;	//控制敌机下落速度 
	if(speed < 20)
		speed++; 
	for(k = 0; k < EnemyNum; k++)
	{
		if(enemy_x[k] > high)		//敌机跑出边界 
		{
			canvas[enemy_x[k]][enemy_y[k]] = 0;
			enemy_x[k] = rand() * 100 % 13;
			enemy_y[k] = rand() * 100 % width + 9;
			canvas[enemy_x[k]][enemy_y[k]] = 3;
			score--;				//减分 
			life--;
		}
		if(enemy_x[k] >= x) 		//敌机撞上我方 
		{
			life--;
			score--;
			sleep(1);
			if(life == 0)
			{
				printf("\n任务失败!!!\n");
				system("pause");
				exit(0);
			}
			canvas[enemy_x[k]][enemy_y[k]] = 0;
			enemy_x[k] = rand() * 100 % 13;
			enemy_y[k] = rand() * 100 % width + 9;
			canvas[enemy_x[k]][enemy_y[k]] = 3;
		}
		if(speed == 20)				//敌机下落 
		{
			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')
		{
			canvas[x][y] = 0;
			y--;
			canvas[x][y] = 1;
		} 
			
		if(input == 'd')
		{
			canvas[x][y] = 0;
			y++;
			canvas[x][y] = 1;
		} 
		if(input == 'w')
		{
			canvas[x][y] = 0;
			x--;
			canvas[x][y] = 1;
		} 
		if(input == 's')
		{
			canvas[x][y] = 0;
			x++;
			canvas[x][y] = 1;
		} 
		if(input == ' ')
		{
			canvas[x - 1][y] = 2;
		}
	}
}


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

终极版

这里可以随着击杀敌机数目越多,飞机子弹不断得到升级延展,敌机速度也会变快,游戏难度也会上升,这些都可以在代码内调整,我在相关的地方都有注释,便于你们更好理解

打飞机小游戏终极版

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>

#define high 30				//游戏画面尺寸 
#define width 33			//如果不把这两个变量设为符号常量而设为全局变量,编译器就会报错 
							//至于为什么大家可以在评论区下讨论,我想看看大家对这个的想法
							//问题:符号常量与全局变量有什么区别? 
							//最后我会公布答案
#define EnemyNum 5			//敌机数目
 

int x, y;									//飞机坐标 		
int enemy_x[EnemyNum], enemy_y[EnemyNum];	//敌机位置 
int score;									//得分 
int life;									//飞机生命值 
int bulletwidth;						//子弹宽度
int enemy_speed;						//敌机速度 
int canvas[high][60] = {0};		//二维数组存储游戏画布中对应的元素
										//1为飞机,2为子弹,3为敌机 
										//width + 17 是为了保证飞机右翼不会超出右线
										//而之后的enemy_y = rand() * 100 % width + 9;是
										//为了保证敌机在左边线以右9个单位的距离
										//这是间接的控制飞机左翼不超过左边界的方法 
int digit(int s)
{
	int ne, t, bi;
	ne = s;
	int num = 0;
	while(ne)
	{
		t = ne % 10;
		ne /= 10;
		num++;
	}
	return num;
} 
								 
void startup()
{
	x = high - 6;
	y = width / 2;
	canvas[x][y] = 1; 
	int k;
	for(k = 0; k < EnemyNum; k++)
	{
		enemy_x[k] = rand() * 100 % 13;
		enemy_y[k] = rand() * 100 % width + 9;
		canvas[enemy_x[k]][enemy_y[k]] = 3;
	} 
	life = 3; 
	score = 0;
	enemy_speed = 20;
	bulletwidth = 0; 
}

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 HideCursor()
{
	CONSOLE_CURSOR_INFO cursor_info = {1, 0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}


void show()
{
	gotoxy(0, 0);
	HideCursor();
	int i, j;
	for(i = 0; i < high; i++)
	{
		for(j = 0; j < width + 17; j++)
		{
			if((i == x) && (j == y))
			{
				printf("*");
			}	
			else if((i == x + 1) && (j == y - 2))
			{
				printf(" * *");
				j += 3;
			}
			else if((i == x + 2) && (j == y - 2))
			{
				printf("* * *");
				j += 4;
			}
			else if((i == x + 3) && (j == y - 6))
			{
				printf("* * * * * * *");
				j += 12;
			}
			else if((i == x + 4) && (j == y - 8))
			{
				printf("* * * * * * * * *");
				j += 16;
			}
			else if((i == x + 5) && (j == y - 1))
			{
				printf("* * ");
				j += 3;
			}
			else if(canvas[i][j] == 3)
				printf("@");
			else if(canvas[i][j] == 2)
				printf("|");
			else
				printf(" ");
		}
		printf("#\n");
	}
	
	printf("生命值:%d", life);
	int space = digit(life);
	if(space == 1)
	{
		for(i = 0; i < width + 8; i++)
			printf(" ");
	}
	else
	{
		for(i = 0; i < width + 8 - (space - 1); i++)
			printf(" ");
	}
	printf("#\n");
	printf("得分:%d", score);
	int space2 = digit(score);
	if(space2 == 1)
	{
		for(i = 0; i < width + 9; i++)
			printf(" ");
	}
	else
	{
		for(i = 0; i < width + 9 - (space2 - 1); i++)
			printf(" ");
	}
	printf("#\n");
	for(i = 0; i < width + 17; i++)
		printf("#");
}

void updateWithoutInput()		//与用户输入无关的更新 
{
	int i, j, k;
	for(i = 0; i < high; i++)
	{
		for(j = 0; j < width + 17; 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 && enemy_speed > 6)
						{
							enemy_speed--;			//敌机变快 
						}
						if(score % 5 == 0)
							bulletwidth++;			//子弹变强 
						canvas[enemy_x[k]][enemy_y[k]] = 0;		//敌机已被消灭 
						enemy_x[k] = rand() % 100 % 13;
						enemy_y[k] = rand() * 100 % width + 9;
						canvas[enemy_x[k]][enemy_y[k]] = 3;		//产生敌机 
						canvas[i][j] = 0;					//子弹消耗掉 
					}
					canvas[i][j] = 0;
					if(i > 0)
						canvas[i - 1][j] = 2;		//子弹向上移动 
				}
				
			}
		}
	}
	static int speed = 0;	//控制敌机下落速度 
	if(speed < enemy_speed)
		speed++; 
	for(k = 0; k < EnemyNum; k++)
	{
		if(enemy_x[k] > high)		//敌机跑出边界 
		{
			canvas[enemy_x[k]][enemy_y[k]] = 0;
			enemy_x[k] = rand() * 100 % 13;
			enemy_y[k] = rand() * 100 % width + 9;
			canvas[enemy_x[k]][enemy_y[k]] = 3;
			score--;				//减分 
			life--;
		}
		if(enemy_x[k] >= x) 		//敌机撞上我方 
		{
			life--;
			score--;
			sleep(1);
			if(life == 0)
			{
				printf("\n任务失败!!!\n");
				system("pause");
				exit(0);
			}
			canvas[enemy_x[k]][enemy_y[k]] = 0;
			enemy_x[k] = rand() * 100 % 13;
			enemy_y[k] = rand() * 100 % width + 9;
			canvas[enemy_x[k]][enemy_y[k]] = 3;
		}
		if(speed == enemy_speed)				//敌机下落 
		{
			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')
		{
			canvas[x][y] = 0;
			y--;
			canvas[x][y] = 1;
		} 
			
		if(input == 'd')
		{
			canvas[x][y] = 0;
			y++;
			canvas[x][y] = 1;
		} 
		if(input == 'w')
		{
			canvas[x][y] = 0;
			x--;
			canvas[x][y] = 1;
		} 
		if(input == 's')
		{
			canvas[x][y] = 0;
			x++;
			canvas[x][y] = 1;
		} 
		if(input == ' ')
		{
			int left = y - bulletwidth;
			int right = y + bulletwidth;
			if(left < 0)
				left = 0;
			if(right > width + 16)
				right = width + 16;
			int k;
			for(k = left; k <= right; k++)
			canvas[x - 1][k] = 2;
		}
	}
}


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

如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持,明天我们不见不散!!!

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值