如何保存游戏状态?

时间:2012-05-16 19:17:38

标签: c#

所以我目前正在开发一个简单的游戏项目,大多数人都是以“突破”开始的。我的目标之一是以最简单的方式制作当前游戏状态的游戏。 例如

==场景==

然后让我说我输了比赛或者我想上床因为我累了,所以我想重新加载游戏状态到我回到桨,球和砖的相同位置。唯一的问题是我有多种形式,我只想将这种特定形式保存在特定的状态。

我有一个关于如何接近的想法(我会找到一种方法来保存桨,球和砖的位置以及那个确切的时间),我不知道如何执行它。 我怎么能实现这一壮举?

2 个答案:

答案 0 :(得分:5)

这可能是一个非常复杂的问题,但在你的情况下,我会建议你开始简单,然后从那里开始,因为你的游戏变得更加复杂。本质上,概率被称为Serialization。或者,将应用程序的内存写入磁盘或数据库,以便以后可以将其读回内存。

有很多技术可以做到这一点,例如将对象转换为XML或JSON或其他二进制文件格式。例如,位图文件只是内存中某些图像结构的序列化形式。

我真的不知道你用来制作游戏的技术而不是C#(XNA?)但实际上你想要使用你环境中可用的某种文件系统API并在那里编写你的序列化对象。根据您的问题,您可能需要重新设计一些游戏来促进这一点。一般来说,在游戏状态中使用单一的“真实来源”代表是一种很好的做法,但即使你不这样做,你仍然可以解决它。

所以这里是我要采取的步骤的大致概述......

<强>序列化

  1. 编写一个记录游戏状态并输出更简单,可序列化对象的例程。
    • 这些简单对象通常具有所有没有功能的公共getter / setter属性。
    • 尝试仅写出稍后重新创建游戏状态所需的最低限度信息。
    • 例如,看看国际象棋如何序列化游戏状态:chess notation
  2. 将这些对象序列化为JSON(因为它简单灵活)
  3. 将json写入磁盘。
    • 我可能会在这里使用常规基础方法。
    • 例如“Saves \ game1.json”是第一个游戏槽的状态。
    • 只需根据正确名称文件的存在推断已保存的游戏。
  4. <强>反序列化

    1. 根据上述惯例寻找游戏保存。
    2. 将JSON反序列化为简单的序列化对象。
    3. 通过查看序列化对象重新创建更复杂的游戏状态。
      • 考虑使用访客模式。
    4. 使用新补充的游戏状态恢复游戏。
    5. [编辑:添加一些额外的链接和快速代码示例]

      这是一个非常好的开源json库:http://json.codeplex.com/

      // somehow convert your game state into a serializable object graph
      var saveState = gameState.Save();
      
      // use json.net to convert that to a string
      string json = JsonConvert.SerializeObject(saveState, Formatting.Indented);
      
      // save that string to the file system using whatever is available to you.
      fileSystemService.WriteAllText("Saves\game1.json", json);
      

答案 1 :(得分:1)

您只需将其保存在XML文件中,然后在启动时读取XML文件即可。