我有一个随机生成的大小为gameSize
x gameSize
(用户输入)的网格,它包含在向量向量中。用户可以输入两个坐标(x,y),以便将网格中的数字更改为预定义值。
例如,用户输入X:0 Y:0和:
{9, 7, 9}
{9, 6, 8}
{5, 1, 4}
变为:
{0, 7, 9} <-- Changes position 0,0 to 0 (the predefined value)
{9, 6, 8}
{5, 1, 4}
我试图找出如何制作它,以便用户可以保存当前的电路板状态并在以后访问它。我知道我需要以某种方式将游戏(myGame)保存到文件中,这样我就可以访问它并将其再次加载到控制台应用程序中,基本上可以保存并重新启动已保存的游戏,但我不知道从哪里开始。
答案 0 :(得分:2)
你可以使用标准库中的fstream并为你的游戏类添加特殊方法,这里有一个例子:
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Game
{
public:
Game(int gameSize) : size(gameSize), field(size, vector<int>(size))
{
//Randomize(); //generate random numbers
//just filling example for test
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
field[i][j] = i * size + j;
}
}
}
Game(string filename) {
Load(filename);
}
void Load(string filename) {
fstream in;
in.open(filename, fstream::in);
in >> size;
field.resize(size, vector<int>(size));
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
in >> field[i][j];
}
}
in.close();
}
void Save(string filename) {
fstream out;
out.open(filename, fstream::out);
out << size << endl;
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
out << field[i][j] << " ";
}
out << endl; //for user friendly look of file
}
out.close();
}
private:
int size;
vector<vector<int>> field;
};
int main() {
Game game(3);
game.Save("game.txt");
game.Load("game.txt");
game.Save("game2.txt");
return 0;
}
不要忘记将游戏大小存储在文件中以方便阅读。如果要加载已存储的游戏,最好将size属性添加到您的类中并使用另一个构造函数。如果添加一些文件格式合适的检查,也会更好。 如果它们不存在,您可以将所有转换为游戏类的逻辑添加为方法。祝你好运!
答案 1 :(得分:1)
逐行保存,每行一行:
void Game::save(std::istream& s)
{
for (const auto& row: myGame)
{
for (auto cell: row)
{
s << cell << ' ';
}
s << '\n';
}
}
然后逐行回读并随时创建行:
void Game::load(std::istream& s)
{
myGame.clear();
std::string line;
while (std::getline(s, line))
{
std::istringstream cells(line);
std::vector<int> row;
int cell = 0;
while (cells >> cell)
{
row.push_back(cell);
}
myGame.push_back(row);
}
}
将行分隔成行意味着您不需要跟踪长度
使用istream&
和ostream&
参数意味着您不仅限于使用文件,还可以使用任何流,例如stringstream
,cin
和cout
。
后者可以派上用场进行调试。
答案 2 :(得分:0)
首先,您应了解CSV格式。要求用户为游戏设置名称,然后将数组保存为如下文件:
- 每行1次保存
- 行以保存名称开头
- 接下来的两个值代表尺寸X和尺寸Y.
- 直到行末端的下一个值表示数组数据
加载保存游戏的行为如下:
- 向用户显示可用存储的列表
- 用于保存打算加载的用户输入
- 应用程序加载如下数据:在文件中搜索包含要加载的名称的行,读取大小x和大小y以初始化该大小的数组,将内容加载到数组中。