首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用序列化java保存游戏(扫雷)进度

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

Stack Overflow用户
提问于 2013-10-03 15:13:01
回答 2查看 3.5K关注 0票数 1

我正在为uni完成一项任务,我们得到了扫雷舰游戏的源代码,我们有一些特定的要求要实现。其中之一是所有游戏在用户登录后从磁盘读取,用户可以随时保存游戏进度。我一直在阅读序列化以保存/加载游戏进度,但我发现它有点难以理解。我不是很确定该从哪里开始编写代码。这个游戏不像很多其他扫雷舰游戏那样使用2D数组。有没有人能给我指点一下容易理解的好文档,我发现有些网页太专业了,我就迷路了!或者,如果有人知道更好的方法来保存扫雷游戏的进度?抱歉,如果我的问题很宽泛,我不是100%确定我应该阅读什么来了解这一点,所以这就是为什么我寻求帮助,找到正确的方向。

EN

回答 2

Stack Overflow用户

发布于 2013-10-03 15:21:26

您希望保存与游戏所在的STATE相关的所有信息。这意味着,游戏棋盘(2D网格或您存储的任何方式),玩家姓名,分数等。

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

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

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

然后进行赋值并编写对象。

So示例:

代码语言:javascript
复制
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;
    }

}
票数 1
EN

Stack Overflow用户

发布于 2013-10-03 15:22:07

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

如果仅在实体上使用序列化,则可以正确实现序列化

代码语言:javascript
复制
class MinesweeperState implements Serializable {
    private Board board;
}

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

我想在代理或适配器上设置的只有set和set,即初始化表、填充数据集和设置周围数据集计数器的逻辑。

为了保存本身,只需使用带有以下代码的管理器

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19153000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档