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效果图一张多少钱? …...
基于YOLOv26深度学习算法的社区流浪动物检测系统研究与实现
文章目录 基于YOLOv26深度学习算法的社区流浪动物检测系统研究与实现 一、研究背景和意义 二、相关技术介绍 2.1 流浪动物管理现状 2.2 YOLOv26目标检测算法 2.3 动物跟踪技术 三、基于YOLOv26的社区流浪动物检测算法研究实现方法 3.1 系统架构设计 3.2 数据集构建 3.3 动物检测…...
蓝桥杯单片机CT107D平台实战:手把手教你用IIC驱动24C02实现断电记忆(附完整源码)
蓝桥杯单片机CT107D平台实战:手把手教你用IIC驱动24C02实现断电记忆(附完整源码) 在嵌入式系统开发中,数据持久化是一个常见但至关重要的需求。想象一下,你精心设计的温控系统每次断电后都要重新设置参数,或…...
moto 新机必看!这几个基础设置,让实用性和流畅度直接翻倍
刚拿到 moto 手机的朋友,大多习惯开机直接用,却很少去调整系统里那些能大幅提升体验的关键设置。默认状态下,续航、手势、通知、显示、隐私等功能往往没有达到最优状态,用久了容易出现耗电快、操作不顺手、消息杂乱等问题…...
Java虚拟线程在百万QPS网关中的真实压测报告(2024阿里/美团内部灰度数据首次公开)
第一章:Java 25 虚拟线程在高并发架构下的实践 面试题汇总虚拟线程(Virtual Threads)作为 Java 21 引入、Java 25 全面成熟的轻量级并发原语,正深刻重构高并发服务的线程模型设计范式。相比传统平台线程,虚拟线程由 JV…...
iOS设备支持文件最佳实践:跨版本调试实战指南
iOS设备支持文件最佳实践:跨版本调试实战指南 【免费下载链接】iOSDeviceSupport All versions of iOS Device Support 项目地址: https://gitcode.com/gh_mirrors/ios/iOSDeviceSupport iOS设备支持文件是企业级iOS应用开发中不可或缺的关键组件,…...
别再只会apt update了!深度解析Ubuntu/Debian的sources.list与‘package has no installation candidate’的底层逻辑
从源码到候选包:APT系统深度诊断指南 当你在Ubuntu上执行apt install时,背后发生了什么?为什么有些包会神秘地"没有安装候选"?这次我们不再停留在"换源-update三板斧",而是深入APT系统内部&#x…...
别再只跑模拟了!用Gromacs分析工具挖掘你轨迹里的隐藏信息
从轨迹文件到科研洞察:Gromacs分析工具实战指南 分子动力学模拟生成的轨迹文件就像一座未经开采的金矿,大多数研究者只挖掘了表面的一小部分。当你花费数周甚至数月时间运行模拟,最终得到的轨迹文件中其实隐藏着大量有价值的科学信息。本文将…...
【20年.NET架构师亲测有效】:C# 14 AOT下Dify客户端HttpClientFactory注入失效的7层调用栈溯源与零配置热修复方案
第一章:C# 14 原生 AOT 部署 Dify 客户端报错解决方法在使用 C# 14 的原生 AOT(Ahead-of-Time)编译方式部署 Dify 官方 .NET SDK 客户端时,常见因反射、动态代码生成或 JSON 序列化元数据缺失导致的运行时异常,典型错误…...
终极指南:原神帧率解锁工具快速上手与安全使用技巧
终极指南:原神帧率解锁工具快速上手与安全使用技巧 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 你是否曾为《原神》中60帧的硬性限制感到困扰?当你的高性能显卡…...
从Java老手到Rust新手:我在IntelliJ IDEA里踩过的那些‘环境坑’及填坑记录
从Java老手到Rust新手:我在IntelliJ IDEA里踩过的那些‘环境坑’及填坑记录 第一次在IntelliJ IDEA里创建Rust项目时,我下意识地点击了"New Project"——就像过去十年里创建Java项目那样自然。然而接下来的半小时,我的表情从困惑变…...
