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//墙--1for (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;}//玩家飞机--2arr[PlayerPlane_y][PlayerPlane_x] = 2;//一开始在中央//敌机--3for (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初始0if (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://xiahunao.cn/news/2809250.html

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

相关文章

SSRF靶场实战

SSRF&#xff08;curl&#xff09; SSRF&#xff08;file_get_content&#xff09;

爬虫入门五(Scrapy架构流程介绍、Scrapy目录结构、Scrapy爬取和解析、Settings相关配置、持久化方案)

文章目录 一、Scrapy架构流程介绍二、Scrapy目录结构三、Scrapy爬取和解析Scrapy的一些命令css解析xpath解析 四、Settings相关配置提高爬取效率基础配置增加爬虫的爬取效率 五、持久化方案 一、Scrapy架构流程介绍 Scrapy一个开源和协作的框架&#xff0c;其最初是为了页面抓取…

高频面试题整理(一)

文章目录 平台无关性如何实现&#xff1f;JVM如何加载 .class文件&#xff1f;什么是反射?谈谈ClassLoader谈谈类的双亲委派机制类的加载方式Java的内存模型?JVM内存模型-jdk8程序计数器&#xff1a;Java虚拟机栈局部变量表和操作数栈&#xff1a; Java内存模型中堆和栈的区别…

✅鉴权—cookie、session、token、jwt、单点登录

基于 HTTP 的前端鉴权背景cookie 为什么是最方便的存储方案&#xff0c;有哪些操作 cookie 的方式session 方案是如何实现的&#xff0c;存在哪些问题token 是如何实现的&#xff0c;如何进行编码和防篡改&#xff1f;jwt 是做什么的&#xff1f;refresh token 的实现和意义ses…

groovy:XmlParser 读 Freeplane.mm文件,生成测试案例.csv文件

Freeplane 是一款基于 Java 的开源软件&#xff0c;继承 Freemind 的思维导图工具软件&#xff0c;它扩展了知识管理功能&#xff0c;在 Freemind 上增加了一些额外的功能&#xff0c;比如数学公式、节点属性面板等。 强大的节点功能&#xff0c;不仅仅节点的种类很多&#xff…

首届Supernova国际青少年模特艺术大赛

2024 全国海选北京站&#xff0c;于 2 月 21 日圆满成功。 # 中国首席超模 # 伍倩 # 超模 # 演员 # 那广子 身着明星挚爱高定礼服 EvaLendel 惊艳亮相。总决赛重磅起航&#xff01;报名从速&#xff01; 整场海选比赛全国进行角逐&#xff0c;有北京、深圳、重庆、新疆、安徽…

高温应用中GaN HEMT大信号建模的ASM-HEMT

来源&#xff1a;An ASM-HEMT for Large-Signal Modeling of GaN HEMTs in High-Temperature Applications&#xff08;JEDS 23年&#xff09; 摘要 本文报道了一种用于模拟高温环境下氮化镓高电子迁移率晶体管&#xff08;GaN HEMT&#xff09;的温度依赖性ASM-HEMT模型。我…

【管理咨询宝藏资料25】某能源集团五年发展战略报告

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏资料25】某能源集团五年发展战略报告 【关键词】战略规划、五年战略、管理咨询 【文件核心观点】 - LL应以快速做大做强为目标&#xff0c;专注…

信息系统项目管理师论文分享(质量管理)

水一篇文章。我发现身边考高项的朋友很多都是论文没过&#xff0c;我想着那就把我的论文分享出来&#xff0c;希望能有帮助。 质量管理 摘要 2020年5月&#xff0c;我作为项目经理参加了“某市某医联体的互联网诊疗&#xff08;互联网医院和远程医疗&#xff09;平台”的建设…

数据结构之栈的链表实现

数据结构之栈的链表实现 代码&#xff1a; #include<stdio.h> #include<stdbool.h> #include<stdlib.h> //链表节点定义 typedef struct node {int value;struct node* next; }Node; //入栈操作 bool push(Node** head, int val) {if (*head NULL){*head …

HTTP攻击,该怎么防护

一般网络世界里为人们所熟知的DDoS攻击&#xff0c;多数是通过对带宽或网络计算资源的持续、大量消耗&#xff0c;最终导致目标网络与业务的瘫痪&#xff1b;这类DDOS攻击&#xff0c;工作在OSI模型的网络层与传输层&#xff0c;利用协议特点构造恶意的请求载荷来达成目标资源耗…

.NET Core使用NPOI导出复杂,美观的Excel详解

前言&#xff1a; 这段时间一直专注于数据报表的开发&#xff0c;当然涉及到相关报表的开发数据导出肯定是一个不可避免的问题啦。客户要求要导出优雅&#xff0c;美观的Excel文档格式的来展示数据&#xff0c;当时的第一想法就是使用NPOI开源库来做数据导出Excel文档&#xf…

C语言《数据结构与算法》安排教学计划课设

背景&#xff1a; 10、安排教学计划 (1) 问题描述。 学校每学期开设的课程是有先后顺序的&#xff0c;如计算机专业&#xff1a;开设《数据结构》课程之前&#xff0c;必须先开设《C语言程序设计》和《离散数学》课程&#xff0c;这种课程开设的先后顺序称为先行、后继课程关…

python学习26

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

2-23 switch、JVM内存模型、垃圾回收机制、this、static、变量的分类

文章目录 switch 实现成绩评级JVM内存模型概念栈的特点堆的特点 垃圾回收机制通用的分代垃圾回收机制三种清理算法垃圾回收过程垃圾回收常见的两种检测引用算法内存泄露常见原因 this的用法创建对象的四步 static 静态特点 变量的分类和作用域import switch 实现成绩评级 switc…

【Redis学习笔记03】Java客户端

1. 初识Jedis Jedis的官网地址&#xff1a;https://github.com/redis/jedis 1.1 快速入门 使用步骤&#xff1a; 注意&#xff1a;如果是云服务器用户使用redis需要先配置防火墙&#xff01; 引入maven依赖 <dependencies><!-- 引入Jedis依赖 --><dependency&g…

每日五道java面试题之spring篇(六)

目录&#xff1a; 第一题 ApplicationContext通常的实现是什么&#xff1f;第二题 什么是Spring的依赖注入&#xff1f;第三题 依赖注入的基本原则第四题 依赖注入有什么优势&#xff1f;第五题 有哪些不同类型的依赖注入实现方式&#xff1f; 第一题 ApplicationContext通常的…

应用配置管理

一、Pod 配置管理 可变配置用 ConfigMap&#xff1b; 敏感信息用 Secret&#xff1b; 身份认证用 ServiceAccount 这几个独立的资源来实现的&#xff1b; 资源配置用 Resources&#xff1b; 安全管控用 SecurityContext&#xff1b; 前置校验用 InitContainers 这几个在 …

吴恩达deeplearning.ai:sigmoid函数的替代方案以及激活函数的选择

以下内容有任何不理解可以翻看我之前的博客哦&#xff1a;吴恩达deeplearning.ai专栏 文章目录 引入——改进下需求预测模型ReLU函数(整流线性单元 rectified linear unit&#xff09;线性激活函数(linear activation function)激活函数的选择实现方式为什么需要激活函数 到现在…

云尚办公-0.3.0

5. controller层 import pers.beiluo.yunshangoffice.model.system.SysRole; import pers.beiluo.yunshangoffice.service.SysRoleService;import java.util.List;//RestController&#xff1a;1.该类是控制器&#xff1b;2.方法返回值会被写进响应报文的报文体&#xff0c;而…