我正在为uni完成一项任务,我们得到了扫雷舰游戏的源代码,我们有一些特定的要求要实现。其中之一是所有游戏在用户登录后从磁盘读取,用户可以随时保存游戏进度。我一直在阅读序列化以保存/加载游戏进度,但我发现它有点难以理解。我不是很确定该从哪里开始编写代码。这个游戏不像很多其他扫雷舰游戏那样使用2D数组。有没有人能给我指点一下容易理解的好文档,我发现有些网页太专业了,我就迷路了!或者,如果有人知道更好的方法来保存扫雷游戏的进度?抱歉,如果我的问题很宽泛,我不是100%确定我应该阅读什么来了解这一点,所以这就是为什么我寻求帮助,找到正确的方向。
发布于 2013-10-03 15:21:26
您希望保存与游戏所在的STATE相关的所有信息。这意味着,游戏棋盘(2D网格或您存储的任何方式),玩家姓名,分数等。
关于如何序列化对象的技术部分相对容易……参见http://www.javapractices.com/topic/TopicAction.do?Id=57。然而,你必须小心像静态或瞬态变量这样的东西,并知道它们是如何影响序列化的(例如,静态类对象不是序列化的,而是丢失的)。
一旦确定了需要保存的内容,就可以创建一个Class,其中包含所有重要对象的变量/引用--比如包装器。这是如果你想避免保存许多不同的文件。您还需要将implements Serialiable 添加到要序列化的对象的所有类定义中。
因此,在下面的示例中,我们编写了SavedState包装器对象,但由于其中包含Board,因此Board也必须是可序列化的。你可以把你想要保存的每个对象写在一个单独的文件中,但是我更喜欢在一个对象/文件中保存所有重要信息的对象,因为我发现它是更干净的。
然后进行赋值并编写对象。
So示例:
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;
}
}发布于 2013-10-03 15:22:07
基本上,您实现了序列化,它迫使您将它持有的所有对象转换为序列化进程,以便可以将其保存在内存中。
如果仅在实体上使用序列化,则可以正确实现序列化
class MinesweeperState implements Serializable {
private Board board;
}
class Board implements Serializable {
private int[][] mineTable;
}我想在代理或适配器上设置的只有set和set,即初始化表、填充数据集和设置周围数据集计数器的逻辑。
为了保存本身,只需使用带有以下代码的管理器
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);
}https://stackoverflow.com/questions/19153000
复制相似问题