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://www.mzph.cn/news/703084.shtml

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

相关文章

Rust升级慢,使用国内镜像进行加速

背景 rustup 是 Rust 官方的跨平台 Rust 安装工具&#xff0c;国内用户使用rustup update的时候&#xff0c;网速非常慢&#xff0c;可以使用国内的阿里云镜像源来进行加速 0x01 配置方法 1. Linux与Mac OS用户配置环境变量 修改~/.bash_profile文件添加如下内容&#xff1…

微信小程序 --- 小程序基础知识

小程序基础知识 1. 认识什么是小程序 什么是微信小程序 微信小程序是一种运行在微信内部的 轻量级 应用程序。 在使用小程序时 不需要下载安装&#xff0c;用户 扫一扫 或 搜一下 即可打开应用。它也体现了 “用完即走” 的理念&#xff0c;用户不用关心安装太多应用的问题…

力扣链表篇

以下刷题思路来自代码随想录以及官方题解 文章目录 203.移除链表元素707.设计链表206.反转链表24.两两交换链表中的节点19.删除链表的倒数第N个节点面试题 02.07. 链表相交142.环形链表II 203.移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链…

AutoGen Studio助力打造私人GPTs

微软最近在开源项目里的确挺能整活儿啊! 这次我介绍的是AutoGen Studio,我认为这个项目把AutoGen可用性又拔高了一个层次的项目 项目给自己的定义是交互式的多Agent workflow 项目地址:autogen/samples/apps/autogen-studio at main microsoft/autogen (github.com) 首先我…

微信小程序02: 使用微信快速验证组件code获取手机号

全文目录,一步到位 1.前言简介1.1 专栏传送门1.1.1 上文小总结1.1.2 上文传送门 2. 微信小程序获取手机号2.1 业务场景(使用与充值)2.2 准备工作2.3 具体代码使用与注释如下2.3.1 代码解释(一)[无需复制]2.3.2 代码解释(二)[无需复制] 2.4 最后一步 获取手机号信息2.4.1 两行代…

MYSQL--(1.存储引擎 *2.事务*)

一 存储引擎: 1.介绍 1>在数据库管理系统当中通过使用数据引擎来实现数据的增删改,查询 2>不同的存储引擎提供的有不同的存储机制,索引技巧等功能 MYSQL的核心,就是存储引擎 3>同样的,用户也可以根据自己的需要进行选择,更改自己需要…

【Linux】部署前后端分离项目---(Nginx自启,负载均衡)

目录 前言 一 Nginx&#xff08;自启动&#xff09; 2.1 Nginx的安装 2.2 设置自启动Nginx 二 Nginx负载均衡tomcat 2.1 准备两个tomcat 2.1.1 复制tomcat 2.1.2 修改server.xml文件 2.1.3 开放端口 2.2 Nginx配置 2.2.1 修改nginx.conf文件 2.2.2 重启Nginx服务 2…

力扣● 343. 整数拆分 ● 96.不同的二叉搜索树

● 343. 整数拆分 想不到&#xff0c;要勇于看题解。 关键在于理解递推公式。 1、DP数组及其下标的含义&#xff1a;dp[i]是分解i这个数得到的最大的乘积。 2、DP数组如何初始化&#xff1a;dp[0]和dp[1]都没意义&#xff0c;所以直接不赋值&#xff0c;初始化dp[2]1即可。…

WordPres Bricks Builder 前台RCE漏洞复现(CVE-2024-25600)

0x01 产品简介 Bricks Builder是一款用于WordPress的开发主题,提供直观的拖放界面,用于设计和构建WordPress网站。它使用户能够轻松创建自定义的网页布局和设计,无需编写或了解复杂的代码。Bricks Builder具有用户友好的界面和强大的功能,使用户可以通过简单的拖放操作添加…

计算机设计大赛 深度学习图像风格迁移 - opencv python

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习图像风格迁移 - opencv python 该项目较为新颖&#xff0c;适合作为竞赛课题…

istio系列教程

istio学习记录——安装https://suxueit.com/article_detail/otVbfI0BWZdDRfKqvP3Gistio学习记录——体验bookinfo及可视化观测https://suxueit.com/article_detail/o9VdfI0BWZdDRfKqlv0r istio学习记录——kiali介绍https://suxueit.com/article_detail/pNVbfY0BWZdDRfKqX_0K …

【Java EE初阶二十三】servlet的简单理解

1. 初识servlet Servlet 是一个比较古老的编写网站的方式&#xff0c;早起Java 编写网站,主要使用 Servlet 的方式&#xff0c;后来 Java 中产生了一个Spring(一套框架)&#xff0c;Spring 又是针对 Servlet 进行了进一步封装,从而让我们编写网站变的更简单了&#xff1b;Sprin…

【卷积神经网络中用1*1 卷积有什么作用或者好处呢?】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;深度学习 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 1*1 卷积有什么作用或者好处呢 作用降维和增加非线性特征组合和交互网络的宽度和深度调整全连接替代增强…

高频面试题整理(一)

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

Android Gradle开发与应用 (二) : Groovy基础语法

1. Groovy是什么 Groovy是基于JVM虚拟机的一种动态语言&#xff0c;语法和Java非常相似&#xff0c;并能够无缝地与Java代码集成和互操作&#xff0c;增加了很多动态类型和灵活的特性。(闭包、DSL) 语法和Java非常相似这个特点&#xff0c;意味着&#xff0c;如果我们完全不懂…

Python爬虫进阶:爬取在线电视剧信息与高级检索

简介&#xff1a; 本文将向你展示如何使用Python创建一个能够爬取在线电视剧信息的爬虫&#xff0c;并介绍如何实现更高级的检索功能。我们将使用requests和BeautifulSoup库来爬取数据&#xff0c;并使用pandas库来处理和存储检索结果。 目录 一、爬取在线电视剧信息 …

174基于matlab的雷达数字信号处理

基于matlab的雷达数字信号处理。该程序具备对雷达目标回波的处理能力&#xff0c;能够从噪声中将目标检测出来&#xff0c;并提取目标的距离、速度、角度信息。有相应的试验文档。程序已调通&#xff0c;可直接运行。 174 雷达数字信号处理 目标检测出来 (xiaohongshu.com)

赵本山指着李琳(桂琴):这个琴你买不起,小沈阳:那得多少钱哪?

赵本山指着李琳&#xff08;桂琴&#xff09;&#xff1a;这个琴你买不起&#xff0c;小沈阳&#xff1a;那得多少钱哪&#xff1f; --小品《同桌的你》&#xff08;中2&#xff09;的台词 赵本山&#xff1a;照全家福的家长没回来你跟谁照呢 小沈阳&#xff1a;哎哪算你一个呗…

国产替代MATLAB的征途

国产替代MATLAB的征途 The Journey of Domestic Alternatives to MATLAB 在科技的浪潮中&#xff0c;软件成为了推动进步的重要工具。MATLAB&#xff0c;这一工程和科学计算的巨擘&#xff0c;因其强大的数值分析、矩阵运算能力和丰富的应用工具箱&#xff0c;在全球学术界和工…

5 buuctf解题

命令执行 [BJDCTF2020]EasySearch1 打开题目 尝试弱口令&#xff0c;发现没有用 扫描一下后台&#xff0c;最后用御剑扫描到了index.php.swp 访问一下得到源码 源码如下 <?phpob_start();function get_hash(){$chars ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu…