栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

简易版的飞机大战(C语言)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

简易版的飞机大战(C语言)

一.只会发射激光,画质不清晰的飞机大战

游戏的总体结构根据C语言的循环制作的

本来还想说点什么但是注释里面都有 

代码: 
#include 
#include 
#include 
#include 

int main()
{
	//按q键退出
	srand((unsigned int)time(NULL));  //设置一个随机数种子,以便下面rand的使用
	//我们得先构造出一个飞机活动的空间
	int top = 0, bottom = 10, right = 20, left = 0;//这分别是飞机所在空间上下左右的最大限度
	int x = 10;   //飞机的初始纵坐标
	int y = 10;   //飞机的初始横坐标
	char input;   //通过输入字符来控制飞机的移动
	int ny = 5;    //给靶子一个初始的位置
	int isfire = 0;   //控制他攻击(激光) 我设置它1为攻击0为停止攻击
	int iskilled = 0; //判断靶子有没有被打掉,0为没有被打掉,1为被打掉了
	int time = 0;    //我用一个时间来将消灭的靶子,隔了两个次循环过后有恢复
	int sum = 0;     //记录我打靶子的分数
	while (1)
	{
		system("cls");
		//构造一个简单飞机
		if (iskilled == 1)
		{
			ny = rand() % 20;   //将他设为随机数,让靶子出现在任意空间
		}
		if (y == ny && isfire == 1) //判断靶子有没有被消灭
		{
			iskilled = 1;
			sum++;
		}
		if (iskilled == 0)  //靶子被消灭后,重新生成靶子
		{
			for (int i = 0; i < ny; i++)
				printf(" ");
			printf("+n");
		}
		if (isfire == 1) //发射激光
		{
			for (int i = 0; i < x; i++)
			{
				for (int j = 0; j < y; j++)
				{
					printf(" ");
				}
				printf("|");
				//显示分数
				if (i == 5)
				{
					for (int j = 0; j <= right - y+1; ++j)
					{
						printf(" ");
					}
					printf("当前的分数为:%d", sum);
				}
				printf("n");
			}
			isfire = 0;//这一步是将激光变成单次发射,不然就是一直发射了
		}
		else
		{
			for (int i = 0; i < x; i++)
			{
				//显示分数
				if (i == 5)
				{
					for (int j = 0; j <= right + 1; ++j)
					{
						printf(" ");
					}
					printf("当前的分数为:%d", sum);
				}
				printf("n");
			}
		}
		for (int j = 0; j < y; j++)
		{
			printf(" ");
		}
		printf("*n");
		for (int j = 0; j < y-2; j++)
			printf(" ");
		printf("*****n");
		for (int j = 0; j < y-1; j++)
			printf(" ");
		printf("* *");
		if (iskilled == 1)  //判断靶子有没有被消灭
			time++;      //如果被消灭,就开始记录时间
		if (time == 2)     //靶子消灭之后,过了两次循环,就重新恢复靶子
		{
			iskilled = 0;
			time = 0;      //并将时间重新设置为零,以便下一次的使用
		}
		input = _getch();
		//这就是飞机的移动功能,通过增加减少纵坐标和横坐标来控制飞机的移动,w向上,s向下,a向左,d向右
		if (input == 'w') //向上
			x--;
		if (input == 's') //向下
			x++;
		if (input == 'a') //向左
			y--;
		if (input == 'd') //向右
			y++;
		if (input == ' ')
			isfire = 1;  //我们将空格设置为攻击键,如果按空格就是将isfire变成1
		if (input == 'k')//设置一个退出按钮
			break;
		//飞机活动的范围
		if (x < top)
			x=top;  //如果飞机移动到顶部就x也就是纵坐标减一让他在原位置处,不能超出这个范围
		if (x > bottom)
			x--;  //跟上面一样的
		if (y < left)
			y++;
		if (y > right)
			y--;
	}
	return 0;
}
二.会发射子弹的飞机

我觉得发射激光太low了,只用发射子弹才是正宗的飞机大战,所以我写了一个改良版只能发射子弹的,比较简单,所以注释有点少

代码
#include 
#include 
#include 
#include 

int main()
{
	int x=10, y=10;//飞机的初始位置
	int top = 0, bottom = 20, left = 0, right = 10;//飞机活动的空间大小
	char input;//通过输入的字符来控制飞机的移动
	int isfire = 0;  //判断是否攻击
	while (1)
	{
		system("cls");;
		int t = x;
		if (isfire == 1)
		{
			for (int i = 0; i < x; i++)
			{
				for (int j = 0; j < t-1; j++)
					printf("n");
				for (int k = 0; k < y; k++)
					printf(" ");
				printf("on");;
				for (int i = 0; i < x - t; i++)
					printf("n");
				for (int i = 0; i < y; i++)
					printf(" ");
				printf("*n");
				for (int i = 0; i < y - 2; i++)
					printf(" ");
				printf("*****n");
				for (int i = 0; i < y - 1; i++)
					printf(" ");
				printf("* *");
				t--;
				system("cls");
			}
			isfire = 0;
		}
		system("cls");
		for (int i = 0; i < x; i++)
			printf("n");
		for (int i = 0; i < y; i++)
			printf(" ");
		printf("*n");
		for (int i = 0; i < y - 2; i++)
			printf(" ");
		printf("*****n");
		for (int i = 0; i < y - 1; i++)
			printf(" ");
		printf("* *");
		input = _getch();
		if (input == 'w')
			x--;
		if (input == 's')
			x++;
		if (input == 'a')
			y--;
		if (input == 'd')
			y++;
		if (input == ' ')
			isfire=1;     //输入空格,就将isfire变成yi以至于能攻击
	}
	return 0;
}
三.改良改良版的飞机大战(函数)

这个版的有一个总体的游戏框架,看着舒服很多,而且它的画质比前面都高,因为没有用到system("cls")清屏这个操作,我使用了void gotoxy(int x, int y) 光标移动到(x,y)位置,然后在用到void HideCursor() 来进行隐藏光标

我先给出这个两个函数,以后就用就行了,还有使用这个函数的头文件是#include

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);
}
总体代码
#include 
#include 
#include 
#include 
#include 

int position_x, position_y;  //飞机的位置
int weight, height;  //游戏的范围
char input;   //控制飞机的移动
int bullet_x, bullet_y;  //发射子弹的位置
int enemy_x, enemy_y;  //敌人的位置
static int speed = 0;  //用来控制敌机下落的速度
int score = 0;   //记录分数
int speedsize = 15;  //控制速度的大小
int market[5] = { 10,100,200,300,500 }; //分数达到多少分增加的速度
int stage = 0;  //记录分数达到哪一个阶段

void HideCursor() //光标移动到(x,y)位置
{
	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 starup() //数据初始化
{
	HideCursor();
	weight = 32;
	height = 18;
	position_x = height / 2;
	position_y = weight / 2;
	bullet_x = 0;
	bullet_y = -1;
	enemy_x = 0;
	enemy_y = weight / 2;
}
void show()   //显示画面
{
	int i, j;
	gotoxy(0, 0);
	for (i = 0; i < height; i++)
	{
		for (j = 0; j < weight; 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", score);
}
void updatewithoutInput() //与用户输入无关的数据
{
	//设置一堵墙防止飞机飞出范围
	if (position_x>= height)
		position_x--;
	if (position_x < 0)
		position_x++;
	if (position_y >= weight)
		position_y--;
	if (position_y < 0)
		position_y++;
	if (score == market[stage])  //分数达到下一个阶段就增加飞机的速度
	{
		speedsize-=3;
		stage++;
	}
	srand((unsigned int)time(NULL));  //随机数种子
	if (bullet_x == enemy_x && bullet_y == enemy_y)
	{
		score++;   //记录消灭敌机的分数+1
		enemy_y = rand() % weight; //产生新的飞机
		enemy_x = 0;
	}
	if (bullet_x >= 0)
		bullet_x--;
	speed++;
	if (speed == speedsize)
	{
		if (enemy_x <= height)//将敌机控制在范围内落下
		{
			enemy_x++;
		}
		else
		{
			enemy_x = -1;  //防止落下后没有敌机生成
			enemy_y = rand() % weight;
		}
		speed = 0;
	}
}
void updatewithInput()  //与用户输入相关的数据
{
	if (kbhit())
	{
		input = _getch();
		if (input == 'w')  //向上移动
			position_x--;
		if (input == 's')  //向下移动
			position_x++;
		if (input == 'a')  //向左移动
			position_y--;
		if (input == 'd')  //向右移动
			position_y++;
		if (input == ' ')  //攻击
		{
			bullet_x = position_x - 1;
			bullet_y = position_y;
		}
		if (input == 'z')  //按z游戏暂停
			system("pause");
	}
}
int main()
{
	starup();   //数据初始化
	while (1)    //游戏循环执行
	{
		show();   //显示画面
		updatewithoutInput();   //与用户输入无关的数据
		updatewithInput();     //与用户输入有关的数据
	}
	return 0;
}

最后感谢大家,我们一起加油。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/934377.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号