使用序列化java保存游戏(扫雷)进度

时间:2013-10-03 07:13:01

标签: java serialization

我正在完成uni的任务,我们获得了扫雷游戏的源代码,我们有一些要求实现。其中之一是在用户登录后从磁盘读取所有游戏,用户可以随时保存游戏进度。我一直在阅读序列化以保存/加载游戏进度,但我发现它有点难以理解这个概念。我不确定从哪里开始为此编写代码。像许多其他扫雷游戏一样,游戏不使用2D阵列。有人能指出任何易于理解的好文档,我发现有些网页太技术化了,我迷路了!或者,如果有人知道更好的方法来保存扫雷游戏的进度?对不起,如果我的问题很广泛,我不是百分之百确定我应该阅读什么来了解这一点,这就是为什么我要求帮助,指出正确的方向。

2 个答案:

答案 0 :(得分:1)

基本上你实现了序列化,迫使你将它所持有的所有对象转换为序列化过程,以便将它保存在内存中。

如果仅在实体上使用

,则可以正确实现序列化
class MinesweeperState implements Serializable {
    private Board board;
}

class Board implements Serializable {
    private int[][] mineTable;
}

只有设置和获取,初始化表格,填充矿井和设置其周围的矿山计数器的逻辑我想在代理或适配器上设置。

对于保存本身,只需使用具有此代码的管理器

FileOutputStream fos = null;
    ObjectOutputStream out = null;
try {
    fos = new FileOutputStream(YOUR_FILENAME_CONSTANT,false);
    out = new ObjectOutputStream(fos);
    out.writeObject(minesweeperState);
    out.close();
    System.out.println("Minesweeper state persisted");
} catch (IOException ex) {
    LOGGER.err(ex);
}

答案 1 :(得分:0)

您希望保存与游戏所在的STATE相关的所有信息。 这意味着,游戏板(2D网格或你存储),玩家名称,分数等

关于如何序列化对象的技术部分相对容易......请参阅http://www.javapractices.com/topic/TopicAction.do?Id=57。 但是,你必须小心静态或瞬态变量之类的东西,并知道它们如何影响序列化(例如静态类对象不是序列化但是丢失了)。

一旦确定了需要保存的内容,就可以创建一个包含所有重要对象的变量/引用的类 - 比如包装器。这是为了避免保存许多不同的文件。 您还需要将implements Serialiable 添加到要序列化的对象的所有类定义中。

因此,在下面的示例中,我们编写了SavedState包装器对象,但由于它包含Board,因此Board也必须是可序列化的。您可以将要保存的每个对象写在一个单独的文件中,但我更喜欢在1个对象/文件中包含一个包含所有重要信息的对象,因为我发现它更清晰

然后你做作业并写下你的对象。

示例:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.ArrayList;

public class Game {

    Board board;
    String name;

    public static void main(String[] args) {
        Game game = new Game();
        game.InitBoard();

        //Now save the board
        game.SaveBoard();
        System.out.println("Player Name is:"+game.name);
        System.out.println("Saved Board, changing in memory playername to 'test'.");
        game.name = "test";
        game.LoadBoard();

        System.out.println("Loaded Board, Player Name is:"+game.name);  
    }

    public void InitBoard()
    {
        board = new Board();
        name = "player...";
    }

    public void SaveBoard()
    {
        try {
            SavedState state = new SavedState(board, name);
            OutputStream file = new FileOutputStream("game.mine");
            OutputStream buffer = new BufferedOutputStream(file);
            ObjectOutput output = new ObjectOutputStream(buffer);
            output.writeObject(state);
            output.flush();
            output.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public void LoadBoard()
    {
        SavedState state;

         InputStream file;
        try {
            file = new FileInputStream("game.mine");
            InputStream buffer = new BufferedInputStream(file);
            ObjectInput input = new ObjectInputStream (buffer);
            state = (SavedState)input.readObject();
            this.board = state.board;
            this.name = state.playerName;
            input.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }

}

class Board implements Serializable {
    ArrayList<Integer> boardElements = new ArrayList<Integer>(); // or however
                                                                    // else you
                                                                    // store
                                                                    // your
                                                                    // values

    // etc...

    public Board() {
        boardElements.add(1); // etc...
    }

}

class SavedState implements Serializable {

    Board board;
    String playerName;

    public SavedState(Board board, String playerName) {
        this.board = board;
        this.playerName = playerName;
    }

}