c++游戏制作指南(四):c++实现数据的存储和读取(输入流fstream)

🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿
       🍟欢迎来到静渊隐者的csdn博文,本文是c++游戏制作指南的一部🍟

🍕更多文章请点击下方链接🍕

🍨 c++游戏制作指南🍨


🍜专栏介绍:在这一专栏中,我将循循善诱,带领你,在冷峻的控制台上,种满缤纷,一同走入c++控制台游戏的殿堂。

🥨适宜人群:学习C++语言三个月及以上的爱好者,熟记基础语法(选择、循环两大结构),掌握基础算法(高精度、排序、模拟、贪心、搜索、动规等),知晓基础数据结构(数组、字符串、链表、栈、队列、树、图)。

🌭学习目的:能够自主编写出有趣的c++控制台游戏,并掌握自学的方法。
🥞喜欢的朋友可以关注一下,下次更新不迷路

目录

🥙前言

🥪一、存档存什么?

①角色扮演游戏(RPG):

②动作游戏(ACT):

③策略游戏(SLG):

④射击游戏(FPS):

⑤模拟游戏(SIM):

🌮二、fstream

①打开文件 

②关闭文件 

③读写文件

读写 

状态标志符的验证

🍔三、最终代码

🍣四、参考资料


🥙前言

游戏中存档的重要性不言而喻。

首先,存档可以帮助玩家在游戏过程中遇到问题或失误时恢复进度,避免重复操作,提高游戏体验。其次,存档可以记录玩家的游戏历程,帮助玩家回顾游戏过程,更好地理解游戏世界。

此外,有些游戏存在多个存档点,如果每次重新开始游戏,会浪费大量时间和精力。因此,存档对于玩家来说非常重要,可以让玩家随时随地继续游戏。

在游戏中,存档的方式各不相同,有些游戏需要玩家手动存档,而有些游戏则会自动存档。但是,无论哪种方式,存档的位置和方式都应该让玩家明确,避免出现存档无效或存档丢失的情况。

总之,存档是游戏中必不可少的一部分,对于玩家来说非常重要。存档可以恢复游戏进度,记录游戏历程,提高游戏体验,减少时间和精力的浪费。

因此,在玩游戏时,玩家都希望有个存档。

🥪一、存档存什么?

这一内容看似是废话,实则非常重要。

举几个例子:

①角色扮演游戏(RPG):

a. 角色数据:游戏需要存储每个角色的详细信息,包括但不限于等级、技能、装备、任务进度、角色属性等。这些数据会随着游戏的进行不断更新和调整。
b. 地图与剧情:游戏需要存储游戏中的地图设计、环境细节、剧情线、对话等元素。这些内容通常与角色数据相关联,以提供丰富的游戏体验。
c. 游戏进度:游戏需要存储玩家的游戏进度,包括已完成的任务、获得的奖励、解锁的关卡等。这将有助于在玩家下次游戏时恢复之前的进度。

8a45ef0081d843e5a0a5ffeaafa99d4f.jpeg

②动作游戏(ACT):

a. 操作记录:游戏需要存储玩家的操作记录,包括键盘、鼠标或游戏手柄的输入。这些记录有助于确认玩家的动作和决策。
b. 游戏进度:游戏需要存储玩家的游戏进度,包括已完成的任务、获得的奖励、解锁的关卡等。这将有助于在玩家下次游戏时恢复之前的进度。
c. 多人联机数据:如果游戏支持多人联机,则需要存储玩家之间的连接和通信数据,包括网络延迟、连接状态等。这将确保游戏的流畅进行。

85b961f14a3642bea43d4ae621439d67.jpeg

③策略游戏(SLG):

a. 策略信息:游戏需要存储玩家的决策数据,包括但不限于资源分配、建筑升级、战术选择等。这些数据将有助于在玩家下次游戏时恢复之前的策略。
b. 游戏地图:游戏需要存储游戏中的地图设计、环境细节、任务线、剧情等元素。这些内容将为玩家提供丰富的策略选择和游戏体验。
c. 游戏进度:游戏需要存储玩家的游戏进度,包括已完成的任务、获得的奖励、解锁的关卡等。这将有助于在玩家下次游戏时恢复之前的进度。

f8cba3c23fbc43d7b0de30a11bd928ec.webp

④射击游戏(FPS):

a. 操作记录:游戏需要存储玩家的操作记录,包括键盘、鼠标或游戏手柄的输入。这些记录有助于确认玩家的射击和决策。
b. 游戏进度:游戏需要存储玩家的游戏进度,包括已完成的任务、获得的奖励、解锁的关卡等。这将有助于在玩家下次游戏时恢复之前的进度。
c. 多人联机数据:如果游戏支持多人联机,则需要存储玩家之间的连接和通信数据,包括网络延迟、连接状态等。这将确保游戏的流畅进行。

57adc0c4cc7e4a9d96ae2b498a88a273.webp

⑤模拟游戏(SIM):

a. 模拟数据:游戏需要存储大量的模拟数据,包括但不限于环境状态、资源数量、人口规模、建筑状态等。这些数据将反映游戏的实时状态,并提供丰富的模拟体验。
b. 游戏地图:游戏需要存储游戏中的地图设计、环境细节、任务线、剧情等元素。这些内容将为玩家提供丰富的模拟环境和体验。
c. 游戏进度:游戏需要存储玩家的游戏进度,包括已完成的任务、获得的奖励、解锁的关卡等。这将有助于在玩家下次游戏时恢复之前的进度。

db464d2f838b4adbb28db5bbf80598e4.webp

总之,存档的内容要是关乎游戏发展的重要信息


🌮二、fstream


使用到的头文件有:
 

fstream  // 文件流
ifstream  // 输入文件流
ofstream  // 输出文件流


①打开文件 

  在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是: 

void open(const char* filename,int mode,int access); 

参数: 
filename:  要打开的文件名 
mode:    要打开文件的方式 
access:   打开文件的属性 

检查是否成功打开成功:

//对ifstream、ofstream对象可用,fstream对象不可用。 
if (f) 
{//打开成功
}
if (f.good()) {...}// !运算符已经重载
if (!f) 
{//打开失败
}       
if (f.fail()) {...}

所以,在实际应用中,根据需要的不同,选择不同的类来定义:如果想以输入方式打开,就用ifstream来定义;如果想以输出方式打开,就用ofstream来定义;如果想以输入/输出方式来打开,就用fstream来定

②关闭文件 

打开的文件使用完成后一定要关闭,fstream提供了成员函数close()来完成此操作。

如:file1.close(),就是把file1相连的文件关闭。 

③读写文件

读写 

  这本有一些讲究,但碍于这里并不是专门讲解此函数,因此就只需照常输入输出(指cin/cout,scanf/print等基础输入输出)即可(你应该知道存了那些东西,也清楚应读出什么东西,并把那些东西放到哪里吧)

状态标志符的验证

bad()
如果在读写过程中出错,返回 true 。例如:当我们要对一个不是打开为写状态的文件进行写入时,或者我们要写入的设备没有剩余空间的时候。

fail()
除了与bad() 同样的情况下会返回 true 以外,加上格式错误时也返回true ,例如当想要读入一个整数,而获得了一个字母的时候。

eof()
如果读文件到达文件末尾,返回true。用于判断是否读完

good()
这是最通用的:如果调用以上任何一个函数返回true 的话,此函数返回 false 。

要想重置以上成员函数所检查的状态标志,你可以使用成员函数clear(),没有参数。

🍔三、最终代码

好了,现在看一看最终的代码。

#include<iostream> 
#include<fstream>
using namespace std;
#define FILENAME "文件的名字.txt"
void dudang()//读档 
{cout<<"正在读取存档……";freopen("jisuan.txt","r",stdin);//这里各种输入(像平常那样读入,cin,scanf()等) fclose(stdin);//关闭文件,然后就可以在控制台上继续输出了 (就和平常一样了) system("cls");
}
void cundang()//存档
{cout<<"正在为你存档……"<<endl;freopen("jisuan.txt","w",stdout);//这里各种输出(像平常那样读入,cout,printf()等) fclose(stdout);//关闭文件,功效同上 system(); 
} 
int main()
{fstream _file;_file.open(FILENAME, ios::in);//打开文件 if(!_file)//打开失败,通常默认为没有存档 {}else{dudang();//存在文件,表示之前有玩过,读档 }
}

这是重中之重啊。

 

🍣四、参考资料

Fstream简介

fstream详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/42241.shtml

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

相关文章

最长重复子数组(力扣)动态规划 JAVA

给两个整数数组 nums1 和 nums2 &#xff0c;返回 两个数组中 公共的 、长度最长的子数组的长度 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 输出&#xff1a;3 解释&#xff1a;长度最长的公共子数组是 [3,2,1] 。 示例 2&#xff1a; 输…

新宝马M5谍照曝光,侵略感十足,将与奥迪、梅赛德斯-AMG正面竞争

报道称&#xff0c;宝马即将推出全新一代M5&#xff0c;该车的谍照最近再次曝光。早先&#xff0c;宝马 M5 Touring 旅行汽车的赛道测试图片已经在网络上流传开来&#xff0c;预计该车将与奥迪的RS6 Avant和梅赛德斯-AMG E63 Estate展开正面竞争。 从最新曝光的照片来看&#x…

【操作系统考点汇集】操作系统考点汇集

关于操作系统可能考察的知识点 操作系统基本原理 什么是操作系统&#xff1f; 操作系统是指控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理地组织调度计算机的工作和资源的分配&#xff0c;以提供给用户和它软件方便的接口和环境&#xff0c;是计算机系统中最基…

Python土力学与基础工程计算.PDF-钻探泥浆制备

Python 求解代码如下&#xff1a; 1. rho1 2.5 # 黏土密度&#xff0c;单位&#xff1a;t/m 2. rho2 1.0 # 泥浆密度&#xff0c;单位&#xff1a;t/m 3. rho3 1.0 # 水的密度&#xff0c;单位&#xff1a;t/m 4. V 1.0 # 泥浆容积&#xff0c;单位&#xff1a;…

【0基础入门Python笔记】一、python 之基础语法、基础数据类型、复合数据类型及基本操作

一、python 之基础语法、基础数据类型、复合数据类型及基本操作 基础语法规则基础数据类型数字类型&#xff08;Numbers&#xff09;字符串类型&#xff08;String&#xff09;布尔类型&#xff08;Boolean&#xff09; 复合数据类型List&#xff08;列表&#xff09;Tuple&…

Kafka 什么速度那么快

批量发送消息 Kafka 采用了批量发送消息的方式&#xff0c;通过将多条消息按照分区进行分组&#xff0c;然后每次发送一个消息集合&#xff0c;看似很平常的一个手段&#xff0c;其实它大大提升了 Kafka 的吞吐量。 消息压缩 消息压缩的目的是为了进一步减少网络传输带宽。而…

故障012:定时备份作业-6007悬案

故障012&#xff1a;定时备份作业-6007悬案 1. 问题描述2. 解决过程2.1 大胆推想2.2 找规律2.3 尝试换掉AP2.4 检查资源限制2.5 资源放宽SYSDBA 3. 精神感悟 DM技术交流QQ群&#xff1a;940124259 1. 问题描述 诡异的现象总是伴随着隐藏的功能被打开&#xff0c;可能耽误你很…

比ChatGPT更强的星火大模型V2版本发布!

初体验 测试PPT生成 结果&#xff1a; 达到了我的预期&#xff0c;只需要微调就可以直接交付&#xff0c;这点比ChatGPT要强很多. 测试文档问答 结果&#xff1a; 这点很新颖&#xff0c;现在类似这种文档问答的AI平台收费都贵的离谱&#xff0c;星火不但免费支持而且效果也…

opencv图片换背景色

#include <iostream> #include<opencv2/opencv.hpp> //引入头文件using namespace cv; //命名空间 using namespace std;//opencv这个机器视觉库&#xff0c;它提供了很多功能&#xff0c;都是以函数的形式提供给我们 //我们只需要会调用函数即可in…

5.利用matlab完成 符号矩阵的转置和 符号方阵的幂运算(matlab程序)

1.简述 Matlab符号运算中的矩阵转置 转置向量或矩阵 B A. B transpose(A) 说明 B A. 返回 A 的非共轭转置&#xff0c;即每个元素的行和列索引都会互换。如果 A 包含复数元素&#xff0c;则 A. 不会影响虚部符号。例如&#xff0c;如果 A(3,2) 是 12i 且 B A.&#xff0…

00-认识C++

2、认识C 2.1、例子 一个简单的C例子 #include <iostream>int main() {using namespace std; //使用名称空间cout << "Com up and C me some time.";cout << endl; //换行符&#xff0c;还可以cout<<"\n";cout <…

驱动DAY5

1.实现设备文件和设备的绑定&#xff0c;编写LED驱动 2.复习竞态的解决方法和阻塞IO实现 第一个任务 头文件 #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;u…

【MySQL系列】表内容的基本操作(增删查改)

「前言」文章内容大致是对MySQL表内容的基本操作&#xff0c;即增删查改。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、MySQL表内容的增删查改1.1 Create1.1.1 单行数据全列插入1.1.2 多行数据指定列插入1.1.3 插入否则更新1.1.4 数据替换 1.2 Ret…

MS Word表格宽度自适应

x.1 问题&#xff1a; 你的表格可能并没有占满整行&#xff0c;且右对齐&#xff0c;例如如下&#xff0c; x.2 解决方式 这个时候你想右对齐&#xff0c;你可以这么操作&#xff0c;点左上角的十字全选表格&#xff0c; 在布局里选择自动对齐&#xff0c; 对齐方式选择居中右…

git日常操作-案例

文章目录 查看tag对应版本tag一个版本切换到指定tag查看远程有那些分支 查看tag对应版本 要查看 Git 仓库中标签&#xff08;tag&#xff09;对应的版本&#xff0c;可以使用以下命令&#xff1a; git show <tag>将 替换为你要查看的标签名称。该命令将显示与标签对应的…

springBoot是如何实现自动装配的

目录 1 什么是自动装配 2 Spring自动装配原理 2.1 SpringBootConfiguration ​编辑 2.2 EnableAutoConfiguration 2.2.1 AutoConfigurationPackage 2.2.2 Import({AutoConfigurationImportSelector.class}) 2.3 ComponentScan 1 什么是自动装配 自动装配就是将官方写好的的…

vue-cli前端工程化——创建vue-cli工程 router版本的创建 目录结构 案例初步

目录 引出创建vue-cli前端工程vue-cli是什么自动构建创建vue-cli项目选择Vue的版本号 手动安装进行选择创建成功 手动创建router版多了一个router 运行测试bug解决 Vue项目结构main.jspackage.jsonvue.config.js Vue项目初步hello案例 总结 引出 1.vue-cli是啥&#xff0c;创建…

记一次项目内存优化--内存泄漏

需求–内存泄漏优化&#xff0c;PSS有所下降&#xff0c; OOM率减少 主要是与某个版本作基准进行对比&#xff08;一般是最新版本的前一个版本作原数据&#xff09;&#xff0c;优化后&#xff0c;PSS有所下降&#xff0c;线上OOM率减少&#xff08;Bugly版本对比&#xff09;…

程序员如何利用公网远程访问查询本地硬盘【内网穿透】

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《高效编程技巧》《cpolar》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 公网远程访问本地硬盘文件【内网穿透】 文章目录 公网远程访问本地硬盘文件【内网穿透】前言1. 下载cpolar和Everything软件1.…

(stm32)低功耗模式

低功耗模式 执行哪个低功耗模式的程序判断流程 标志位设置操作一定要在WFI/WFE之前&#xff0c;调用此指令后立即进入睡眠判断流程 模式对比 睡眠模式 停止模式 待机模式