C++ 游戏飞机大战, 字符型的

//#define _CRT_SECURE_NO_WARNINGS 1  用于禁止不安全函数的警告
#include<iostream>
#include<stdlib.h>
#include<string>
#include<conio.h>
#include<Windows.h>
#include<time.h>
#include <graphics.h>
using namespace std;
char ch;
#define Count 5//敌机数量
#define Col 40//列
#define Row 40//行
//玩家飞机坐标,声明:左上角坐标为(0,0)
int PlayerPlane_y = Row - 2;//39,墙上面最后一行
int PlayerPlane_x = Col / 2;//20,列中央
//子弹坐标
int Bullet_y;
int Bullet_x;
//敌机坐标
int Enemy_y[Count] = { 0 };
int Enemy_x[Count] = { 0 };
//敌机的移动速度
int EnemySleep = 250;
int sleep = 0;//当二者相等时敌机才发生移动,sleep可认为缓冲,该设置用于控制速度与难度梯度
//分数
int score = 0;
//技能充能
int skill1 = 20;
int skill2 = 5;
//容错度
int error = 0;//抵达五时失败
//获取系统时间
char* time()//返回指针
{
	time_t rawtime;//原始时间
	struct tm* curtime;//指向结构体的变量
	time(&rawtime); // 获取系统时间并存储
	curtime = localtime(&rawtime); //转换为本地时间
	char* now = asctime(curtime);//更改为指针类型
	return now;
}
//弄一个结构体保存当前位置的各项数据,但是不保存已使用的子弹,以此来实现简单存档
typedef struct history
{
	int PlayerPlane_y;
	int PlayerPlane_x;
	int Enemy_y[Count];
	int Enemy_x[Count];
	int EnemySleep;
	int sleep;
	int score;
	int skill1;
	int skill2;
	int error;
	char* curtime;
	int flag = 0;//初始化标记
}history, * apple;
void contain(apple& L, int PlayerPlane_y, int PlayerPlane_x, int EnemySleep, int sleep, int score, int skill1, int skill2, int error, int flag, char* curtime)
{
	L = new history;//赋予空间
	L->PlayerPlane_y = PlayerPlane_y;
	L->PlayerPlane_x = PlayerPlane_x;
	L->EnemySleep = EnemySleep;
	L->sleep = sleep;
	L->score = score;
	L->skill1 = skill1;
	L->skill2 = skill2;
	L->error = error;
	L->flag = flag;
	L->curtime = curtime;
}
void game();//有关进入游戏后的各项函数
void menu()
{
	printf("                                           --------------飞机大作战--------------\n");
	printf("                                          |                                       |\n");
	printf("                                          |             3.查看历史记录            |\n");
	printf("                                          |             2.选择存档开始            |\n");
	printf("                                          |             1.开始游戏                |\n");
	printf("                                          |             0.退出游戏                |\n");
	printf("                                          |             W/A/S/D移动               |\n");
	printf("                                          |           空格射击 E/R技能            |\n");
	printf("                                          |                                       |\n");
	printf("                                          |w温馨提示,游戏过程中可以按下\"Esc\"退出游戏 |\n");
	printf("                                          ----------------------------------------------\n");
}

int main()
{
	system("color b");
	int input = 0;
	menu();
	printf("请选择:");
	scanf("%d", &input);
	switch (input)
	{
	case 1:
		game();//大部分函数均包括在内
		break;
	case 0:
		printf("退出游戏\n");
		break;
	default:
		printf("输入有误,请重新输入:\n");
		break;
	}
	return 0;
}
//隐藏光标
void HideCursor()
{
	CONSOLE_CURSOR_INFO cursor_info = { 1,0 };  //第二个值为0,表示隐藏光标
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

// 光标移到(X, Y)位置
void gotoxy(int x, int y)
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle, pos);
}

void DisPlay(int arr[Col][Row])//绘制画面
{
	gotoxy(0, 0);
	for (int i = 0; i < Col; i++)
	{
		for (int j = 0; j < Row; j++)
		{
			if (arr[i][j] == 0)//路
			{
				printf("  ");
			}
			if (arr[i][j] == 1)//基地区域
			{
				printf("█");
			}
			if (arr[i][j] == 2)//己方
			{
				printf("++");
			}
			if (arr[i][j] == 3)//敌机
			{
				printf("%%+");
			}
			if (arr[i][j] == 4)//子弹
			{
				printf("/\\");
			}
		}
		printf("\n");
	}
	//各项数值
	char* curtime = time();
	printf("得分:%d ", score);
	printf("EnemySleep=%d ", EnemySleep);
	printf("skill1(20)=%d ", skill1);
	printf("skill2(5)=%d ", skill2);
	printf("时间:%s", curtime);
	Sleep(20);//刷新频率
}

void InSet(int arr[Col][Row])
{
	srand(time(NULL));//设置随机数种子
	//路--0
	//墙--1
	for (int i = 0; i < Col; i++)//赋值定义
	{
		arr[i][0] = 1;
		arr[i][Row - 1] = 1;
	}
	for (int i = 0; i < Row; i++)
	{
		arr[0][i] = 1;
		arr[Col - 1][i] = 1;
	}
	//玩家飞机--2
	arr[PlayerPlane_y][PlayerPlane_x] = 2;//一开始在中央
	//敌机--3
	for (int i = 0; i < Count; i++)//随机出现敌机
	{
		Enemy_y[i] = rand() % 3 + 1;//确保敌机不出现在墙区域,并且不会太接近下方基地
		Enemy_x[i] = rand() % (Row - 2) + 1;//确保不会出现在墙中
		arr[Enemy_y[i]][Enemy_x[i]] = 3;//敌机位置
	}
	//子弹--4
}
void PlayerPlay(int arr[Col][Row])
{

	if ((ch == 'w' || ch== 72) && arr[PlayerPlane_y - 1][PlayerPlane_x] == 0)//上飞,且路通
	{
		arr[PlayerPlane_y][PlayerPlane_x] = 0;//清除
		PlayerPlane_y--;//数值小则上
		arr[PlayerPlane_y][PlayerPlane_x] = 2;//飞机位置
	}
	if ((ch == 'a' || ch== 75) && arr[PlayerPlane_y][PlayerPlane_x - 1] == 0)//下述同理
	{
		arr[PlayerPlane_y][PlayerPlane_x] = 0;
		PlayerPlane_x--;
		arr[PlayerPlane_y][PlayerPlane_x] = 2;
	}
	if ((ch == 's' || ch == 80) && arr[PlayerPlane_y + 1][PlayerPlane_x] == 0)
	{
		arr[PlayerPlane_y][PlayerPlane_x] = 0;
		PlayerPlane_y++;
		arr[PlayerPlane_y][PlayerPlane_x] = 2;
	}
	if ((ch == 'd' || ch == 77) && arr[PlayerPlane_y][PlayerPlane_x + 1] == 0)
	{
		arr[PlayerPlane_y][PlayerPlane_x] = 0;
		PlayerPlane_x++;
		arr[PlayerPlane_y][PlayerPlane_x] = 2;
	}
	if (ch == ' ')//空格射击
	{
		Bullet_y = PlayerPlane_y - 1;
		Bullet_x = PlayerPlane_x;
		arr[Bullet_y][Bullet_x] = 4;//子弹位置
	}
	if (ch == 'r')//技能
	{
		if (skill1 == 20)//充能结束
		{
			for (int i = 1; i < Row - 1; i++)//火力覆盖
			{
				skill1 = 0;//归零
				Bullet_y = PlayerPlane_y - 1;//上飞,完成后一行子弹上飞到顶
				Bullet_x = i;//布满横行
				arr[Bullet_y][Bullet_x] = 4;//位置
			}
		}
	}
	if (ch == 'e')//技能
	{
		int left = PlayerPlane_x - 3;//左线
		int right = PlayerPlane_x + 3;//右线
		if (skill2 == 5)//充能
		{
			for (int i = left; i < right; i++)//火力覆盖
			{
				if (i > 0 && i < Row - 1)//可见r技能火力充足
				{
					skill2 = 0;//归零
					Bullet_y = PlayerPlane_y - 1;//上飞,几颗子弹到顶
					Bullet_x = i;
					arr[Bullet_y][Bullet_x] = 4;
				}
			}
		}
	}

}
void BulletEnemy(int arr[Col][Row])//关于子弹与敌机的处理,包括能量与加速的处理
{

	for (int i = 0; i < Col; i++)
	{
		for (int j = 0; j < Row; j++)
		{
			if (arr[i][j] == 4)//有子弹
			{
				for (int k = 0; k < Count; k++)//检查各个敌机
				{
					//子弹击中敌机的处理
					if (i == Enemy_y[k] && j == Enemy_x[k])
					{
						if (skill1 < 20)
						{
							skill1++;
						}
						if (skill2 < 5)
						{
							skill2++;
						}
						score += 100;//分数
						arr[Enemy_y[k]][Enemy_x[k]] = 0;//清除
						Enemy_y[k] = rand() % 3 + 1;
						Enemy_x[k] = rand() % (Row - 2) + 1;
						arr[Enemy_y[k]][Enemy_x[k]] = 3;//重构
						//每500分敌机加速
						if (score % 500 == 0 && EnemySleep > 4)
						{
							EnemySleep -= 2;
						}
					}
				}

				//子弹的移动
				if (arr[i][j] == 4)
				{
					arr[i][j] = 0;
					if (i > 1)
					{
						arr[i - 1][j] = 4;
					}
				}
			}
		}

		//敌机的移动,sleep初始0
		if (sleep < EnemySleep)
		{
			sleep++;
		}
		else if (sleep > EnemySleep)
		{
			sleep = 0;
		}

		for (int i = 0; i < Count; i++)//遍历敌机
		{
			if (PlayerPlane_y == Enemy_y[i] && PlayerPlane_x == Enemy_x[i] || score < 0)
			{
				printf("  /\\_/\\  \n");//敌机击中玩家飞机的处理
				printf(" ( o.o ) \n");
				printf("  > ^ < \n");
				printf("游戏失败!\n");
				printf("\a");//发出失败警告
				system("pause");//等待
				exit(0);
			}
			//敌机到达最底面的处理
			if (Enemy_y[i] >= Col - 2)//提前处理,不破坏墙面,当然不提前处理也没问题,可以设1
			{
				score -= 100;
				arr[Enemy_y[i]][Enemy_x[i]] = 0;
				Enemy_y[i] = rand() % 3 + 1;
				Enemy_x[i] = rand() % (Row - 2) + 1;
				arr[Enemy_y[i]][Enemy_x[i]] = 3;
			}
			//敌机下移的处理
			if (sleep == EnemySleep)
			{
				for (int j = 0; j < Count; j++)
				{
					arr[Enemy_y[j]][Enemy_x[j]] = 0;
					sleep = 0;
					Enemy_y[j]++;
					arr[Enemy_y[j]][Enemy_x[j]] = 3;
				}
			}
		}
	}
}
void write(apple& L, FILE* fp)//传引用,避免指针的使用
{
	L->curtime = time();
	fprintf
	(fp, "%d %d %d %d %d %d %d %d %d %s ",
		L->PlayerPlane_y,
		L->PlayerPlane_x,
		L->EnemySleep,
		L->sleep,
		L->score,
		L->skill1,
		L->skill2,
		L->error,
		L->flag,
		*(L->curtime));
	for (int i = 0; i < Count; i++)
		fprintf(fp, "%d %d", L->Enemy_y[i], L->Enemy_x[i]);
}
void creathistory(apple& L)//创建存档
{

	FILE* fp;
	if ((fp = fopen("history.txt", "a+")) == NULL) { cout << "打开失败,没有存档,请建立新的存档"; system("pause"); exit(0); }
	else
	{
		write(L, fp);
	}
}
void read(apple& L)
{
	FILE* fp;
	if ((fp = fopen("history.txt", "a+")) == NULL) { cout << "打开失败,没有存档,请建立新的存档"; system("pause"); exit(0); }
	else
	{
		int PlayerPlane_y;
		int PlayerPlane_x;
		int Enemy_y[Count];
		int Enemy_x[Count];
		int EnemySleep;
		int sleep;
		int score;
		int skill1;
		int skill2;
		int error;
		char* curtime;
		int flag;
		while (fscanf
		(fp, "%d %d %d %d %d %d %d %d %d %s\n",
			&L->PlayerPlane_y,
			&L->PlayerPlane_x,
			&L->EnemySleep,
			&L->sleep,
			&L->score,
			&L->skill1,
			&L->skill2,
			&L->error,
			&L->flag,
			L->curtime))
		{
			for (int i = 0; i < Count; i++)
				fscanf(fp, "%d %d", L->Enemy_y[i], L->Enemy_x[i]);
		}
		rewind(fp);//指针归位
	}
}
void again(apple& L)
{
	int arr[Col][Row] = { 0 };
	for (int i = 0; i < Count; i++)
	{
		arr[L->Enemy_y[i]][L->Enemy_x[i]] = 3;
	}
	arr[L->PlayerPlane_y][L->PlayerPlane_x] = 2;
	for (int i = 0; i < Col; i++)//赋值定义
	{
		arr[i][0] = 1;
		arr[i][Row - 1] = 1;
	}
	for (int i = 0; i < Row; i++)
	{
		arr[0][i] = 1;
		arr[Col - 1][i] = 1;
	}
	//打印游戏界面
	DisPlay(arr);
	//玩家移动
	while (1)
	{
		//时间
		time();
		//玩家操作
		PlayerPlay(arr);
		//打印棋盘
		DisPlay(arr);
		//子弹与敌机的操作
		BulletEnemy(arr);
	}
}
void findhistory(apple& L)//查找存档
{
	for (int i = 0; i < L->flag; i++)
	{
		read(L);
		printf("请输入你选择的存档编号flag:");
		int a = getch();
		cout << a << endl;
		if (_kbhit() && i == L->flag - 1)//判断是否有键盘输入
		{
			system("cls");
			again(L);

		}
	}
}

void game()
{
	system("cls");
	//设置一个存放信息的数组
	int arr[Col][Row] = { 0 };
	apple L;
	//隐藏光标
	//HideCursor();
	//放置信息
	InSet(arr);
	//打印游戏界面
	DisPlay(arr);
	//玩家移动
	while (1)
	{
		if (_kbhit()) {
			ch = getch();
				if (ch == 27) {
					cout << "是否退出并保存存档" << endl;
						system("pause");
						if (getch() == 27)
						{
							creathistory(L);
								cout << "存档成功,继续按键将退出" << endl;
								system("pause");
								exit(0);
						}
				}
				else
				{
					time();
					//玩家操作
					PlayerPlay(arr);
				}

		}
		//打印棋盘
		DisPlay(arr);
		//子弹与敌机的操作
		BulletEnemy(arr);

	}
}




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/410940.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫-付费代理推荐和使用

付费代理的使用 相对免费代理来说&#xff0c;付费代理的稳定性更高。本节将介绍爬虫付费代理的相关使用过程。 1. 付费代理分类 付费代理分为两类&#xff1a; 一类提供接口获取海量代理&#xff0c;按天或者按量收费&#xff0c;如讯代理。 一类搭建了代理隧道&#xff0…

一元函数微分学——刷题(22

目录 1.题目&#xff1a;2.解题思路和步骤&#xff1a;3.总结&#xff1a;小结&#xff1a; 1.题目&#xff1a; 2.解题思路和步骤&#xff1a; 由于是极坐标方程&#xff0c;所以这个式子一定成立&#xff1a; 然后代入r即可变为参数方程的求导&#xff1a; 3.总结&#xff…

52.仿简道云公式函数实战-文本函数-LEFT

1. LEFT函数 从一个文本字符串的第一个字符开始返回指定个数的字符。 2. 函数用法 LEFT(text,[num_chars]) 3. 函数示例 从一个文本字符串的第一个字符开始返回指定个数的字符。 4. 代码实战 首先我们在function包下创建text包&#xff0c;在text包下创建LeftFunction类…

POST参数里加号+变成空格的问题处理

今天遇到个这样的问题&#xff0c;从前端传到后端的加密报文&#xff0c;里面包含了号&#xff0c;但在后端日志输出看出&#xff0c;变成空格。这个是由于经过RSA加密后引起的 解决办法&#xff1a; 1.前端转码&#xff1a;使用encodeURIComponent对参数进行转码 2.后端解码…

msvcp110.dll找不到的处理方法,一键修复msvcp110.dll文件

如果你遭遇到了“msvcp110.dll文件丢失”的现象&#xff0c;那就要引起足够的重视&#xff0c;因为这通常意味着你的电脑上某些依赖此DLL文件的应用程序将无法正常启动。msvcp110.dll是许多软件中必须的组件&#xff0c;一旦发生丢失&#xff0c;影响的不仅是单个程序&#xff…

Java SpringBoot 整合 MyBatis 小案例

Java SpringBoot 整合 MyBatis 小案例 基础配置&#xff08;注意版本号&#xff0c;容易报错&#xff09; pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http…

武汉灰京文化:中国手游行业新技术的涌现与产业链的完善

中国手游行业正迎来新技术的涌现&#xff0c;如虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;和人工智能&#xff08;AI&#xff09;。这些技术为游戏提供了全新的可能性&#xff0c;扩展了游戏的玩法和体验。例如&#xff0c;VR技术可以让玩家沉浸…

卖家横扫海外露营市场的机会来了,赛盈分销预测2024年消费者新需求

甲辰龙年开篇&#xff0c;就要迎来国外野营浪潮了&#xff0c;希望点开这篇推送的你&#xff0c;红红火火、热辣滚烫一整年。每年的3月份&#xff0c;海外用户对露营设备的搜索开始迅速增长。今天和大家聊聊露营市场出海的一些布局方向。 全球露营商品的市场规模愈发壮大&#…

Maven jar 的查找及依赖版本确定

关于 jar 的查找&#xff0c;及使用版本的确定&#xff0c;及依赖的版本确认&#xff0c;避免 jar 冲突或版本不兼容 在使用 maven 构建项目时&#xff0c;需要的 jar 可以通过在 https://mvnrepository.com/ 可以找到部分需要的依赖&#xff0c;这里以查找 mybatis 依赖为例&…

再次委托|工科背景老师赴美国斯坦福大学自费访学

工科背景的I老师&#xff0c;几年前曾通过我们获得美国哈佛大学医学院的无薪博士后职位&#xff0c;从事医工交叉学科研究。回国完成2年服务期后&#xff0c;I老师再次委托并仍希望去美国顶尖高校&#xff0c;最终我们落实了世界名校斯坦福大学的访问学者职位&#xff0c;满足了…

微信小程序自制动态导航栏

写在前面 关于微信小程序导航栏的问题以及解决办法我已经在先前的文章中有提到&#xff0c;点击下面的链接即可跳转~ &#x1f90f;微信小程序自定义的导航栏&#x1f90f; 在这篇文章中我们需要做一个这样的导航栏&#xff01;先上效果图 &#x1f447;&#x1f447;&#x1f…

HTTP/HTTPS协议

什么是HTTP协议 HTTP被称为超文本传输协议(里面不仅仅可以是字符串,还可以是图片,特殊字符等),这是一种应用非常广泛的应用层协议. HTTP协议诞生于1991年,现在是最主流使用的一种应用层协议.它从诞生到现在为止迭代了多个版本. 但目前最主流使用的还是HTTP1.1和HTTP2.0. HTTP协…

大学餐厅菜品推荐和点评系统设计与实现

**&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;**一 、设计说明 1.1 研究背景…

Opencv(2)深浅拷贝与基本绘图(c++python

Opencv(2)深浅拷贝与基本绘图 文章目录 Opencv(2)深浅拷贝与基本绘图三、深浅拷贝四、HSV色域(1).意义(2).cvtColor()(3).inRange()(4).适应光线 三、深浅拷贝 浅拷贝是指当图像之间进行赋值时&#xff0c;图像数据并未发生复制&#xff0c;而是两个对象都指向同一块内存块。 …

Amazon Generative AI | 基于 Amazon 扩散模型原理的代码实践之采样篇

以前通过论文介绍 Amazon 生成式 AI 和大语言模型&#xff08;LLMs&#xff09;的主要原理之外&#xff0c;在代码实践环节主要还是局限于是引入预训练模型、在预训练模型基础上做微调、使用 API 等等。很多开发人员觉得还不过瘾&#xff0c;希望内容可以更加深入。因此&#x…

鲲鹏arm64架构下安装KubeSphere

鲲鹏arm64架构下安装KubeSphere 官方参考文档: https://kubesphere.io/zh/docs/quick-start/minimal-kubesphere-on-k8s/ 在Kubernetes基础上最小化安装 KubeSphere 前提条件 官方参考文档: https://kubesphere.io/zh/docs/installing-on-kubernetes/introduction/prerequi…

【教程】ONLYOFFICE 桌面应用程序 v8.0 版本更新全面解读

文章目录 &#x1f4df; 引言 官网&#xff1a;ONLYOFFICE 官方网站 近日&#xff0c;ONLYOFFICE 桌面应用程序迎来了 v8.0 版本的更新&#xff0c;为用户带来了许多新功能和改进&#xff0c;如全新的 RTL 界面、本地主题、Moodle 集成等。本文将详细介绍 ONLYOFFICE 桌面编辑…

微服务架构中的 隔离和超时控制

文章目录 隔离的应用场景隔离的措施机房隔离实例隔离分组隔离连接池隔离和线程池隔离第三方依赖隔离慢任务隔离 隔离的缺点更多思考 超时控制超时控制目标超时控制形态确定超时时间1、根据用户体验来确定2、根据响应时间来确定3、压力测试4、根据代码计算 超时中断业务更多思考…

QT信号槽实现分析

1.宏定义 qt中引入了MOC来反射&#xff0c;编译阶段变成 MOC–>预处理–>编译–>汇编–>链接 1-1、Q_OBJECT 这个宏定义了一系列代码&#xff0c;包括元对象和处理的函数 #define Q_OBJECT \public: \QT_WARNING_PUSH \Q_OBJECT_NO_OVERRIDE_WARNING \static c…

Python接口自动化测试 —— unittest批量用例管理!

我们日常项目中的接口测试案例肯定不止一个&#xff0c;当案例越来越多时我们如何管理这些批量案例&#xff1f;如何保证案例不重复&#xff1f;如果案例非常多&#xff08;成百上千&#xff0c;甚至更多&#xff09;时如何保证案例执行的效率&#xff1f;如何做&#xff08;批…