C#我怎样才能"保存"随机生成的Class对象的特定副本?

时间:2014-04-26 14:32:51

标签: c# class object save

我正在控制台制作一个战舰游戏,我想实施一个重播系统,我可以重新打开游戏。为此,我使用StreamWriter记录播放器的移动,在不同的循环中,StreamReader使用这些来重放'屏幕上的游戏。但是,船只的位置并不相同,因为它是在新游戏开始时生成的。 NEWGAME循环与REPLAY相同,但在重放中,comp会自动通过streamreader进行移动,但是,地图是不同的,因为它总是随机生成的。 我的问题是,如何保存“地图”的精确副本?那是在这种情况下的一个类? 提前致谢!如果您有任何问题我可以回答。

switch (x)
        {
            case "newgame":
        Mezo Játékos2Hajói= new Mezo();
        Mezo Játékos1AmitLát = new Mezo();
        Mezo Játékos1Hajói = new Mezo();
        Mezo Játékos2AmitLát = new Mezo();
....

这会产生新游戏的领域,然后是剩下的,玩家攻击等。

重播案例与新游戏的作用相同,但计算机会从流式读取器插入攻击。

        case "replay":
        Mezo Játékos2VHajói= new Mezo();
        Mezo Játékos1VAmitLát = new Mezo();
        Mezo Játékos1VHajói = new Mezo();
        Mezo Játékos2VAmitLát = new Mezo();

问题出在这里。这个案例为自己生成一个新的,因为它不会起作用,但在这里我想使用newgame中使用的那个"。

2 个答案:

答案 0 :(得分:1)

这正是Command Pattern非常适合的事情。这是您可以做的简化版本:

interface ICommand { void Execute(); }

class PlaceShip : ICommand
{
    int x;
    int y;
    Ship ship;

    public PlaceShip(int x, int y, Ship ship)
    {
        // Initialize fields
    }

    public void Execute()
    {
        // Place the ship
    }
}

class Fire : ICommand
{
    int x;
    int y;
    Player player;

    public Fire(int x, int y, Player player)
    {
        // Initialize fields
    }

    public void Execute()
    {
        // Try to hit enemy
    }
}

然后,您可以通过再次遍历列表来保存可以轻松重放的ICommand个对象的历史记录。

答案 1 :(得分:0)

您可以尝试使用XMLSerialize自动将整个类导出到Structured XMl。这是一种用XML制作对象的完整副本的方法。