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.pswp.cn/news/42241.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42241.shtml
英文地址,請注明出處:http://en.pswp.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;…

神經網絡基礎-神經網絡補充概念-53-將batch norm擬合進神經網絡

代碼實現 import numpy as np import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, BatchNormalization, Activation from tensorflow.keras.optimizers import SGD# 生成隨機數據 np.random.seed(0) X np.…

【0基礎入門Python筆記】一、python 之基礎語法、基礎數據類型、復合數據類型及基本操作

一、python 之基礎語法、基礎數據類型、復合數據類型及基本操作 基礎語法規則基礎數據類型數字類型&#xff08;Numbers&#xff09;字符串類型&#xff08;String&#xff09;布爾類型&#xff08;Boolean&#xff09; 復合數據類型List&#xff08;列表&#xff09;Tuple&…

代碼隨想錄DAY62

這個移動0的問題還是比較重要的 因為涉及到一種思想&#xff1a;快慢指針&#xff01; class Solution { public: void moveZeroes(vector<int>& nums) { int slow0,fast0; for(;fast<nums.size();fast){ if(nums[fast]!0){ swap(nums[slow],nums[fast]); slow;…

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…

uniapp評論列表插件獲取

從評論列表&#xff0c;回復&#xff0c;點贊&#xff0c;刪除&#xff0c;留言板 - DCloud 插件市場里導入&#xff0c;并使用。 代碼樣式優化及接入如下&#xff1a; <template><view class"hb-comment"><!-- 閱讀數-start --><view v-if&q…

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…

java中excel文件下載

1、System.getProperty(user.dir) 獲取的是啟動項目的容器位置 2、 Files.copy(sourceFile.toPath(), destinationFile.toPath(), StandardCopyOption.REPLACE_EXISTING); StandardCopyOption.REPLACE_EXISTING 來忽略文件已經存在的異常&#xff0c;如果存在就去覆蓋掉它Sta…

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 什么是自動裝配 自動裝配就是將官方寫好的的…