如何在C++(Visual Studio)环境下实现游戏进度保存功能
C++ 控制台游戏退出时保存进度实现方案
核心实现逻辑是把需要持久化的游戏数据写入本地文件,下次程序启动时再从文件读取恢复即可,不需要引入复杂第三方库,非常适合初学者实现。
1. 先定义要存储的游戏数据结构
首先把你要保存的玩家数据整理成结构体,方便统一读写:
#include <fstream> #include <vector> #include <string> // 示例:道具结构体,可根据你的实际需求修改字段 struct Item { std::string name; int count; int buyPrice; }; // 全局游戏存档数据实例 struct GameSave { int money; std::vector<Item> ownedItems; } currentGameData;
2. 实现存档写入函数
程序退出前调用该函数即可把数据写入本地存档文件,新手推荐先使用文本格式存储,调试起来更直观:
void saveGameData() { // 打开存档文件,不存在会自动创建,存在则覆盖旧内容 std::ofstream outFile("game_save.txt"); if (!outFile.is_open()) { // 文件打开失败可加错误提示,不影响程序正常退出 return; } // 第一行写入玩家金钱 outFile << currentGameData.money << "\n"; // 第二行写入道具总数,方便读取时确定遍历次数 outFile << currentGameData.ownedItems.size() << "\n"; // 逐行写入每个道具的属性 for (const auto& item : currentGameData.ownedItems) { outFile << item.name << " " << item.count << " " << item.buyPrice << "\n"; } outFile.close(); }
3. 绑定到程序退出时机
两种方案任选其一即可:
- 你自己写的退出逻辑中(比如玩家输入退出指令、选择退出菜单时),先调用
saveGameData()再执行退出逻辑 - 怕遗漏调用的话,可以用标准库的
atexit()注册自动存档,程序正常退出时会自动执行:
#include <cstdlib> // 包含atexit所需头文件 int main() { // 程序启动时就注册存档函数,正常退出时自动触发 atexit(saveGameData); // 下方是你原有的游戏逻辑 // ... return 0; }
4. 可选:启动时读取存档实现
附赠读档函数,程序启动时调用即可恢复上次进度:
void loadGameData() { std::ifstream inFile("game_save.txt"); // 没有存档文件就使用初始默认值即可 if (!inFile.is_open()) { currentGameData.money = 100; // 初始金钱可自行修改 return; } // 读取金钱 inFile >> currentGameData.money; // 读取道具数量 int itemCount; inFile >> itemCount; currentGameData.ownedItems.clear(); // 循环读取所有道具 for (int i = 0; i < itemCount; i++) { Item temp; inFile >> temp.name >> temp.count >> temp.buyPrice; currentGameData.ownedItems.push_back(temp); } inFile.close(); }
注意事项
- 如果你的道具名称带空格,不要用上述文本存储方案,换成二进制写入或者用特殊符号分隔字段即可
- 怕玩家随便修改存档的话,可以给存储的数值加个固定偏移量加密,读取的时候再减回去,实现简单的防篡改
- 以上实现不需要引入任何第三方依赖,兼容所有C++标准编译环境
内容的提问来源于stack exchange,提问作者cool bean
相关产品推荐
相关产品推荐

