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

news2025/1/19 14:39:24

//#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);

	}
}




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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STL - 图

1、图的基本概念 图是由顶点集合及顶点间的关系组成的一种数据结构&#xff1a;G (V&#xff0c; E)&#xff0c;其中&#xff1a; 顶点集合 V {x|x属于某个数据对象集}是有穷非空集合&#xff1b; 边的集合 E {(x,y)|x,y属于V}或者E {<x&#xff0c;y>|x,y属于V …

1_怎么看原理图之GPIO和门电路笔记

一、GPIO类 如下图&#xff1a;芯片输出高电平/3.3V&#xff0c;LED亮&#xff1b;当芯片输出低电平&#xff0c;则LED暗 如下图&#xff1a;输入引脚&#xff0c;当开关闭合&#xff0c;则输入为低电平/0V&#xff0c;当开关打开&#xff0c;则输入为高电平/3.3V 现在的引脚都…

前端本地化部署

前言 现在成熟的前端团队里面都有自己的内部构建平台&#xff0c;我司云长便是我们 CI/CD 的提效利器。我先来简单介绍下我司的云长&#xff0c;此云长非彼云长&#xff0c;云长主要做的是&#xff1a;获取部署的项目&#xff0c;分支&#xff0c;环境基本信息后开始拉取代码&…

Servlet使用Cookie和Session

一、会话技术 当用户访问web应用时&#xff0c;在许多情况下&#xff0c;web服务器必须能够跟踪用户的状态。比如许多用户在购物网站上购物&#xff0c;Web服务器为每个用户配置了虚拟的购物车。当某个用户请求将一件商品放入购物车时&#xff0c;web服务器必须根据发出请求的…

大厂面试-美团高频考察算法之重排链表

本文学习目标或巩固的知识点 学习如何处理链表重排类题目 巩固反转链表巩固快慢指针巩固合并链表 提前说明&#xff1a;算法题目来自力扣、牛客等等途径 &#x1f7e2;表示简单 &#x1f7e1;表示中等 &#x1f534;表示困难 &#x1f92e;表示恶心 博主真实经历&#xff0c;…

docker-compose 搭建laravel环境

laravel环境包含nginx,mysql,php7.4,redis 一、安装好docker后pull镜像 1.nginx镜像 docker pull nginx:latest单独启动容器 docker run --name nginx -p 80:80 -d nginx 2.php镜像 docker pull php:7.4-fpm3.mysql镜像 docker pull mysql:5.74.redis镜像 docker pull r…

React18原理: React核心对象之Update、UpdateQueue、Hook、Task对象

Update 与 UpdateQueue 对象 1 ) 概述 在fiber对象中有一个属性 fiber.updateQueue是一个链式队列&#xff08;即使用链表实现的队列存储结构&#xff09;是和页面更新有关的 2 &#xff09;Update对象相关的数据结构 // https://github.com/facebook/react/blob/v18.2.0/pa…

Sqli-labs靶场第11关详解[Sqli-labs-less-11]

Sqli-labs-Less-11 前言&#xff1a; SQL注入的三个条件&#xff1a; ①参数可控&#xff1b;&#xff08;从参数输入就知道参数可控&#xff09; ②参数过滤不彻底导致恶意代码被执行&#xff1b;&#xff08;需要在测试过程中判断&#xff09; ③参数带入数据库执行。&…

[rust] 10 project, crate, mod, pub, use: 项目目录层级组织, 概念和实战

文章目录 一 项目目录层级组织概念1.1 cargo new 创建同名 的 Project 和 crate1.2 多 crate 的 package1.3 mod 模块1.3.1 创建嵌套 mod1.3.2 mod 树1.3.3 用路径引用 mod1.3.3.1 使用绝对还是相对? 1.3.4 代码可见性1.3.4.1 pub 关键字1.3.4.2 用 super 引用 mod1.3.4.3 用 …

【微服务】mybatis typehandler使用详解

目录 一、前言 二、TypeHandler简介 2.1 什么是TypeHandler 2.1.1 TypeHandler特点 2.2 TypeHandler原理 2.3 mybatis自带的TypeHandler 三、环境准备 3.1 准备一张数据表 3.2 搭建一个springboot工程 3.2.1 基础依赖如下 3.2.2 核心配置文件 3.2.3 测试接口 四、T…

JAVA工程师面试专题-《Mysql》篇

目录 一、基础 1、mysql可以使用多少列创建索引&#xff1f; 2、mysql常用的存储引擎有哪些 3、MySQL 存储引擎&#xff0c;两者区别 4、mysql默认的隔离级别 5、数据库三范式 6、drop、delete 与 truncate 区别&#xff1f; 7、IN与EXISTS的区别 二、索引 1、索引及索…

Linux字符设备驱动中同类型多设备节点的创建---一个驱动程序支持多个同类型设备

文章目录 前言1 代码解析1.1 驱动层1.2 应用层 2 运行结果总结 前言 本期分享的内容相对比较简单&#xff0c;那就是同时注册多个同类型的字符设备驱动&#xff0c;那么这样我们就可以同时支持多个同类型的设备了&#xff01;下面来带大家看一下&#xff1a; 1 代码解析 1.1 …

python 线程笔记二 (概念+示例代码)

1. 线程介绍 1. 在前面了解了进程的概念&#xff0c;简单来说进程就是在内存中申请了一块内存空间&#xff0c;其实还有一个线程的概念&#xff0c; 线程包含在进程之中&#xff0c;是代码真正的执行者。也就是说进程其实是一个资源单位&#xff0c;而线程是执行单位。 2. 线程…

瑞_Redis_初识Redis(含安装教程)

文章目录 1 初识Redis1.1 认识NoSQL1.1.1 结构化与非结构化1.1.2 关联和非关联1.1.3 查询方式1.1.4 事务1.1.5 总结 1.2 认识Redis1.2.1 介绍1.2.2 特征1.2.3 优势 1.3 安装Redis ★★★1.3.1 Linux安装Redis1.3.1.0 资源准备1.3.1.1 安装Redis依赖1.3.1.2 上传安装包并解压1.3…

vim恢复.swp [BJDCTF2020]Cookie is so stable1

打开题目 扫描目录得到 关于 .swp 文件 .swp 文件一般是 vim 编辑器在编辑文件时产生的&#xff0c;当用 vim 编辑器编辑文件时就会产生&#xff0c;正常退出时 .swp 文件被删除&#xff0c;但是如果直接叉掉&#xff08;非正常退出&#xff09;&#xff0c;那么 .swp 文件就会…

windows 中, bash: conda: command not found(已解决)

git bash 中运行conda命令&#xff0c;出现这种错误&#xff0c;原因是你没有在git bash中 配置conda&#xff0c;导致git bash无法找到conda 那就配置一下&#xff0c;找到你的conda的安装位置下的bash.sh文件&#xff0c;一般在安装位置&#xff08;我的安装在C盘的自定义路径…

在Linux操作系统的ECS实例上安装Hive

目录 1. 完成hadoop安装配置2. 安装配置MySql安装配置 3. 安装Hive4. 配置元数据到MySQL5. hiveserver2服务配置文件测试 1. 完成hadoop安装配置 在Linux操作系统的ECS实例上安装hadoop 以上已安装并配置完jdk、hadoop也搭建了伪分布集群 2. 安装配置MySql 安装 下下一步…

Unity中URP实现水体效果(泡沫)

文章目录 前言一、给水上色1、我们在属性面板定义两个颜色2、在常量缓冲区申明这两个颜色3、在片元着色器中&#xff0c;使用深度图对这两个颜色进行线性插值&#xff0c;实现渐变的效果 二、实现泡沫效果1、采样 泡沫使用的噪波纹理2、控制噪波效果强弱3、定义_FoamRange来控制…

算法-计算机基础知识

1&#xff0c;坐标系与数学不同&#xff0c;x轴向下&#xff0c;y轴向右 2.案例&#xff1a;螺旋矩阵 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 class Solution {public List<Integer> spiralOrder(int[][] matrix) { List<Integer&…

解锁苏宁电商数据新纪元:关键字搜索API接口引领业务升级

苏宁关键字搜索API接口&#xff1a;电商数据探索的新篇章 一、引言 在电商领域&#xff0c;数据的重要性不言而喻。为了帮助开发者更高效地获取和利用电商数据&#xff0c;苏宁开放平台提供了关键字搜索API接口。本文将带你深入了解这一接口的技术细节&#xff0c;让你在电商…