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

news2025/2/28 15:22:20

🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿
       🍟欢迎来到静渊隐者的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.coloradmin.cn/o/895578.html

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

相关文章

【卡码网】32. 子矩形的最大面积 <模拟>

【卡码网】32. 子矩形的最大面积 给定一个矩形&#xff0c;宽度为 W&#xff0c;高度为 H&#xff0c;现需要对其进行划分。现有一个数组 yCutting 用于表示在水平方向上用于切分矩形的切线位置&#xff0c;另有一个数组 xCutting 表示在垂直方向上用于切分矩形的切线位置。求…

Python中import模块导入的实现原理

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 Python中import模块导入的实现原理 什么是模块import搜索路径import导入模块的原理图书推荐 专栏&…

springboot异步文件上传获取输入流提示找不到文件java.io.FileNotFoundException

springboot上传文件&#xff0c;使用异步操作处理上传的文件数据&#xff0c;出现异常如下&#xff1a; 这个是在异步之后使用传过来的MultipartFile对象尝试调用getInputStream方法发生的异常。 java.io.FileNotFoundException: C:\Users\Administrator\AppData\Local\Temp\to…

【福建事业单位-综合基础知识】01法理学、宪法

这里写目录标题 一、法理知识1.1法的概念1.2法的规范作用1.3、法与道德1.4、法的制定&#xff01;1.5、法是实施 二、宪法2.1 宪法的概念2.2宪法的特征2.3宪法的基本原则2.4 宪法的渊源2.5 宪法的宣誓总结 三、国家基本制度 一、法理知识 1.1法的概念 法是概念是参考项&#…

Nevron 3DChart Crack,可视化界面在运行时可用

Nevron 3DChart Crack,可视化界面在运行时可用 3DChart使用OpenGL 3D图形引擎创建复杂的2D和3D图表&#xff0c;这些图表可以包含静态或动画图像。3DChart包括一个用于生成图表模板的独立应用程序和一个ASP服务器配置实用程序。该组件还包括一个专门设计用于与3DChart集成的工具…

程序员如何利用公网打造低成本轻量化的搜索和下载平台【内网穿透】

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

突破传统界限:OLED透明屏模组应用拓展到可穿戴设备

OLED透明屏模组作为一种新兴的显示技术&#xff0c;正在引起广泛的关注和应用。其独特的透明性和高质量的图像表现力&#xff0c;使其成为未来视觉体验的重要组成部分。 对此&#xff0c;尼伽将通过探讨OLED透明屏模组的特点、优势以及应用案例&#xff0c;带您了解一下OLED透…

TCP服务器实现—多进程版,多线程版,线程池版

目录 前言 1.存在的问题 2.多进程版 3.多线程版 4.线程池版 总结 前言 在上一篇文章中使用TCP协议实现了一个简单的服务器&#xff0c;可以用来服务端和客户端通信&#xff0c;但是之前的服务器存在一个问题&#xff0c;就是当有多个客户端连接服务器的时候&#xff0c;服…

LeGO-Loam代码解析(二)--- Lego-LOAM的地面点分离、聚类、两步优化方法

1 地面点分离剔除方法 1.1 数学推导 LeGO-LOAM 中前端改进中很重要的一点就是充分利用了地面点,那首先自然是提取 对地面点的提取。 如上图,相邻的两个扫描线束的同一列打在地面上如 点所示,他们的垂直高度差 &#xff0c;水平距离差 &#xff0c;计算垂直高度差和水平高度差…

Windows 10搭建 OpenGL 环境(C++)

1、创建 sdk 目录 IDE使用 Visual Studio 2022&#xff0c;在电脑上创建一个目录&#xff0c;用来存放要使用的 OpenGL 库&#xff0c;后面步骤中生成的各种库文件&#xff0c;都会放到这个目录&#xff0c;用于配置 VS 项目模板&#xff0c;本文将使用这个目录&#xff1a;F:…

【快应用】如何避免通知栏提示快应用一直获取地理位置

【关键词】 地理位置、subscribe、unsubscribe 【问题背景】 快应用中调用geolocation.subscribe接口获取地理位置&#xff0c;即使在定位完成后&#xff0c;会在通知栏一直显示某某快应用在获取地理位置&#xff0c;为了避免用户认为一直在获取他的位置&#xff0c;导致用户…

原码、补码、反码

一、前置概念 计算机底层存储数据时使用的是二进制数字&#xff0c;但是计算机在存储一个数字时并不是直接存储该数字对应的二进制数字&#xff0c;而是存储该数字对应二进制数字的补码。所以接下来我们需要来了解一下原码、反码和补码。 那么再了解原码、反码、补码之前&…

自动执行探索性数据分析 (EDA),更快、更轻松地理解数据

一、说明 EDA是 exploratory data analysis (探索性数据分析 )的缩写。所谓EDA就是在数据分析之前需要对数据进行以此系统性研判&#xff0c;在这个研判后&#xff0c;得到基本的数据先验知识&#xff0c;在这个基础上进行数据分析。本文将在R语言和python语言的探索性处理。 摄…

Hadoop学习:深入解析MapReduce的大数据魔力之数据压缩(四)

Hadoop学习&#xff1a;深入解析MapReduce的大数据魔力之数据压缩&#xff08;四&#xff09; 4.1 概述1&#xff09;压缩的好处和坏处2&#xff09;压缩原则 4.2 MR 支持的压缩编码4.3 压缩方式选择4.3.1 Gzip 压缩4.3.2 Bzip2 压缩4.3.3 Lzo 压缩4.3.4 Snappy 压缩4.3.5 压缩…

蔡司关注全民运动眼健康:与蔡司智锐镜片KEEP住视力健康

众所周知&#xff0c;运动是对我们身体最大的投资&#xff0c;但是对于视力有问题的消费者来说&#xff0c;不合适的眼镜无疑是运动路上的绊脚石&#xff0c;跑步运动时眼镜总是往下掉&#xff0c;不仅没有相对稳定的视野&#xff0c;还特别没安全感&#xff0c;由此可见一副优…

1.物联网LWIP网络,TCP/IP协议簇

一。TCP/IP协议簇 1.应用层&#xff1a;FTP&#xff0c;HTTP&#xff0c;Telent&#xff0c;DNS&#xff0c;RIP 2.传输层&#xff1a;TCP&#xff0c;UDP 3.网络层&#xff1a;IPV4&#xff0c;IPV6&#xff0c;OSPF&#xff0c;EIGRP 4.数据链路层&#xff1a;Ethernet&#…

售后工单管理系统是什么?售后服务管理系统对企业有什么作用?

售后服务管理系统可以提高客户满意度、提升售后服务效率、实现客户关系管理、支持知识库和员工培训、以及数据分析和改进等多种作用&#xff0c;从而帮助企业提高售后服务质量和效率&#xff0c;增强客户忠诚度&#xff0c;提高整体运营效率。 1、集成化信息平台   系统可以实…

基于迁移学习的基础设施成本优化框架,火山引擎数智平台与北京大学联合论文被KDD收录

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 基于迁移学习的基础设施成本优化框架&#xff0c;火山引擎数智平台与北京大学联合论文被KDD收录 近期&#xff0c;第29届国际知识发现与数据挖掘大会&#xff08;A…

android cocoscreator 检测模拟器还是真机

转载至 一行代码帮你检测Android模拟器 具体原理看原博主文章&#xff0c;这里只讲cocoscreator3.6的安卓工程怎么使用 1.新建一个com.lahm.library包&#xff0c;和com.cocos.game同目录&#xff0c;如图示 那四个文件的代码如下&#xff1a; EmulatorCheckUtil类&#…

国产化系统中遇到的视频花屏、卡顿以及延迟问题的记录与总结

目录 1、国产化系统概述 1.1、国产化操作系统与国产化CPU 1.2、国产化服务器操作系统 1.3、当前国产化系统的主流配置 2、视频解码花屏与卡顿问题 2.1、视频解码花屏 2.2、视频解码卡顿 2.3、关于I帧和P帧的说明 3、国产显卡处理速度慢导致图像卡顿问题 3.1、视频延…