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效果图一张多少钱? …...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
