C ++控制台保存并加载已保存的游戏"

时间:2017-04-20 06:12:15

标签: c++ console save restart

我有一个随机生成的大小为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)保存到文件中,这样我就可以访问它并将其再次加载到控制台应用程序中,基本上可以保存并重新启动已保存的游戏,但我不知道从哪里开始。

3 个答案:

答案 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&参数意味着您不仅限于使用文件,还可以使用任何流,例如stringstreamcincout
后者可以派上用场进行调试。

答案 2 :(得分:0)

首先,您应了解CSV格式。要求用户为游戏设置名称,然后将数组保存为如下文件:
- 每行1次保存 - 行以保存名称开头 - 接下来的两个值代表尺寸X和尺寸Y. - 直到行末端的下一个值表示数组数据 加载保存游戏的行为如下:
- 向用户显示可用存储的列表
- 用于保存打算加载的用户输入
- 应用程序加载如下数据:在文件中搜索包含要加载的名称的行,读取大小x和大小y以初始化该大小的数组,将内容加载到数组中。