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);}
}
相关文章:

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;…...

用html编写的简易新闻页面
用html编写的简易新闻页面 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…...

docker-mysql:5.7安装
1、下载mysql:5.7镜像 [rootlocalhost ~]# docker search mysql (某个XXX镜像名字) [rootlocalhost ~]# docker pull mysql:5.7 按装之前查看一下是否按装过mysql。如果安装过会占用3306端口。 [rootlocalhost ~]# ps -ef | grep mysql 2、简单的安装 [rootlocalhost ~]# d…...

SQLPro Studio:数据库管理的革命性工具 mac版
SQLPro Studio是一款强大的数据库管理和开发工具,它旨在提供高效、便捷和安全的数据库操作体验。无论是数据库管理员、开发人员还是数据分析师,SQLPro Studio都能满足他们在数据库管理、查询、设计和维护方面的需求。 SQLPro Studio mac版软件获取 首先…...

【小沐学QT】QT学习之OpenGL开发笔记
文章目录 1、简介2、Qt QOpenGLWidget gl函数3、Qt QOpenGLWidget qt函数4、Qt QOpenGLWindow5、Qt glut6、Qt glfw结语 1、简介 Qt提供了与OpenGL实现集成的支持,使开发人员有机会在更传统的用户界面的同时显示硬件加速的3D图形。 Qt有两种主要的UI开发方…...

kali安装ARL灯塔(docker)
1、root身份进入容器 ┌──(root㉿Kali)-[~/桌面] └─# su root ┌──(root㉿Kali)-[~/桌面] └─# docker 2、先更新再克隆 ┌──(root㉿Kali)-[~/桌面] └─# apt-get update …...
字节面试分享,请详细介绍为何Http Post发送两次请求
在浏览器中,内容是很开放的,任何资源都可以接入其中,如 JavaScript 文件、图片、音频、视频等资源,甚至可以下载其他站点的可执行文件。 但也不是说浏览器就是完全自由的,如果不加以控制,就会出现一些不可…...
Flink CDC 3.0 Starrocks建表失败会导致任务卡主!
Flink CDC 3.0 Starrocks建表失败会导致任务卡主! 现象 StarRocks建表失败,然后任务自动重启,重启完毕后数据回放,jobMaster打印下面日志后,整个任务会卡主 There are already processing requests. Wait for proce…...

基于 LVGL 使用 SquareLine Studio 快速设计 UI 界面
目录 简介注册与软件获取工程配置设计 UI导出源码板级验证更多内容 简介 SquareLine Studio 是一款专业的 UI 设计软件,它与 LVGL(Light and Versatile Graphics Library,轻量级通用图形库)紧密集成。LVGL 是一个轻量化的、开源的…...

Selenium IDE插件录制网页,解放双手
1、 国内下载地址 https://www.crx4chrome.com/crx/77585/ ,这个网络正常基本可以下载,目前最新版本是3.17.2。 点击Crx4Chrome下载。下载后的文件名称是:mooikfkahbdckldjjndioackbalphokd-3.17.2-Crx4Chrome.com.crx。 2、 安装 直接打开…...

【LeetCode】【滑动窗口长度不固定】978 最长湍流子数组
1794.【软件认证】最长的指定瑕疵度的元音子串 这个例题,是滑动窗口中长度不定求最大的题目,在看题之前可以先看一下【leetcode每日一题】【滑动窗口长度不固定】案例。 题目描述 定义:开头和结尾都是元音字母(aeiouAEIOU&…...

水库安全监测方案(福建地区水库安全监测案例分享)
我司星创易联最近在福建省受到了一个水库安全监测系统项目的委托。该水库位于福建中部山区,作为该地区的重要防洪与供水工程,对下游数十万人的生活产生重大影响。但是因为水库附近地质情况复杂,水库大坝在多次洪水冲击下出现一定病害,亟须全面加强对水库大坝安全状况的监测,以确…...

Oracle内存计算应用模式
前言 内存计算是利用内存来加速数据访问和应用的性能,并降低应用开发复杂度的技术。近十年来,随着软硬件技术的发展和用户需求的成熟,内存计算技术已经得到了广泛地应用。 Oracle在内存计算领域具有非常重要的地位,这主要得益于…...

ELK日志系统
一、规划 服务名所在服务器kafka1—2.13-2.4.1192.168.76.10kafka2—2.13-2.4.1192.168.76.11kafka3—2.13-2.4.1192.168.76.12zookeeper1—3.6.3192.168.76.10zookeeper2—3.6.3192.168.76.11zookeeper3—3.6.3192.168.76.12elasticsearch1—7.12.1192.168.76.10elasticsearc…...

C++:list容器(非原生指针迭代器的实现)
本章是STL容器 list 的模拟实现。 之前已经使用 C语言 对带头双向循环链表 进行实现,详见数据结构: 线性表(带头双向循环链表实现), 相较于之前的实现,C 下多了对迭代器以及模板等相关语法特性。下面将着重讲解这些新知识。 文章目录 一. list 的基本框架…...

抖音视频批量下载软件|视频评论采集工具
抖音视频评论采集软件是一款基于C#开发的高效、便捷的工具,旨在为用户提供全面的数据采集和分析服务。用户可以通过关键词搜索抓取视频数据,也可以通过分享链接进行单个视频的抓取和下载,从而轻松获取抖音视频评论数据。 批量视频提取模块&a…...
Oracle RMAN 备份恢复
Oracle RMAN 备份恢复 1.什么是RMAN RMAN在数据库服务器的帮助下实现数据库文件、控制文件、数据库文件和控制文件的映像副本,以及归档日志文件,数据库服务器参数文件的备份。RMAN也允许使用脚本文件实现数据的备份与恢复,而且这些脚本保存…...

【MySQL】学习和总结联合查询
🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-OPj5g6evbkm5ol0U {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...

Flink应用场景
1、介绍 (1) Apache Flink 功能强大,支持开发和运行多种不同种类的应用程序。它的主要特性包括:批流一体化、精密的状态管理、事件时间支持以及精确一次的状态一致性保障等。Flink 不仅可以运行在包括 YARN、 Mesos、Kubernetes 在内的多种资源管理框架…...

产品渲染3D效果图一张多少钱,哪个平台更有性价比?
产品渲染3D效果图的价格受到多方面因素的影响,包括但不限于产品类型、渲染难度以及输出尺寸等。如果效果图需要后期处理,还有可能增加其他费用。接下来,我们来了解一下产品渲染效果图的费用情况。 1.产品渲染3D效果图一张多少钱? …...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...

GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...