0

我正在制作一个只打字的游戏(没有图形),我需要在其中保存游戏状态并稍后重新加载。我一直在想,但什么也想不到(我不是一个很有经验的程序员)。有人可以启发我吗?

4

3 回答 3

3

你需要你的类来实现Serializable接口。然后将对象写入文件。然后在启动时再次读回文件。

序列化对象意味着将其状态转换为字节流,以便字节流可以恢复为对象的副本。如果 Java 对象的类或其任何超类实现了 java.io.Serializable 接口或其子接口 java.io.Externalizable,则它是可序列化的。反序列化是将对象的序列化形式转换回对象副本的过程。

接口的美妙之Serialzable处在于您不需要实现任何方法。它是一个标记界面。您只需创建一个类Serializable,然后将其写入文件。

这里要注意的是:每次写入文件时都需要截断文件。不要尝试向其附加数据。它破坏了文件的标题。

教程在这里:http ://docs.oracle.com/javase/tutorial/jndi/objects/serial.html

于 2013-11-05T08:34:13.207 回答
2

你可以使用ObjectOutputStream并调用它的方法writeObject来保存你的游戏状态。

并使用ObjectInputStream并调用其方法readObject来加载游戏状态。

例如

保存游戏状态

public void saveGameDataToFile(File file) {   

    try {   
        FileOutputStream fileStream = new FileOutputStream(file);   
        ObjectOutputStream objectStream = new ObjectOutputStream(fileStream);   

        objectStream.writeObject(flag);   
        objectStream.writeObject(color);   
        objectStream.writeObject(snake);   
        objectStream.writeObject(food);   
        objectStream.writeObject(new Integer(score));   

        objectStream.writeObject(barrier);   
        objectStream.writeObject(new Boolean(needToGenerateFood));   
        objectStream.writeObject(new Boolean(needToGenerateBarrie));   

        objectStream.close();   
        fileStream.close();   

        JOptionPane.showConfirmDialog(frame, 
            "Save game state successfully.", 
            "Snake Game",   
            JOptionPane.DEFAULT_OPTION);   
    } catch (Exception e) {   
        JOptionPane.showConfirmDialog(frame, 
            e.toString() + "\nFail to save game state.",   
            "Snake Game", 
            JOptionPane.DEFAULT_OPTION);   
    }   
}   

加载游戏状态

public void loadGameDataFromFile(File file) throws ClassNotFoundException{   

    ... ...

    FileInputStream fileStream = new FileInputStream(file);   
    ObjectInputStream objectStream = new ObjectInputStream(fileStream);   

    svaedFlag = (int[][]) objectStream.readObject();
    savedColor = (Color[][]) objectStream.readObject();     
    savedSnake = (Snake) objectStream.readObject();   
    savedFood = (Grid) objectStream.readObject();   
    savedScore = (Integer) objectStream.readObject();   
    savedBarriers =(Barriers) objectStream.readObject();   
    savedNeedToGenerateFood = (Boolean)objectStream.readObject();   
    savedNeedToGenerateBarrie = (Boolean)objectStream.readObject();   
    ... ...
}
于 2013-11-05T08:42:12.153 回答
0

为了保持对象状态,您可以

  1. 使用序列化
  2. 将内容保存为文本或 xml
  3. 将内容保存到数据库(sqlLite,hsql)
于 2013-11-05T08:34:40.917 回答