我试图创建一个游戏,我希望在相同种子的情况下始终运行相同的游戏。这意味着对于使用相同种子的两个玩家来说,随机事件 - 无论他们可能是什么 - 将始终是相同的。 但是,考虑到用户保存和加载游戏的能力,每次加载保存时Ruby都会重置,如果两个玩家在不同点保存和加载,则整个原则无效。
我想象的唯一解决方案是,无论何时加载保存文件,都要生成与之前相同数量的点,从而使Ruby的Random变为与加载前相同的状态。但是,要做到这一点,我需要对其进行扩展,以便每次生成随机数时都会更新计数器。
有没有人知道如何做到这一点或有更好的方法来恢复Ruby的随机状态?
PS:我不能使用Random(Random.new)和Marshall的实例。我必须使用Ruby的默认设置。
答案 0 :(得分:1)
Marshal.dump/Marshal.load之类的声音可能就是您想要的。 Random
类documentation明确指出"随机对象可以被编组,允许保存和恢复序列。"
您可能仍然遇到跨游戏同步的问题,因为不同的基于用户的决策可以带您通过不同的逻辑路径,从而以完全不同的方式使用随机数序列。
答案 1 :(得分:0)
我建议可以保存当前的'用户决定保存(或程序关闭时)的数据到文件,具体取决于您的喜好。
这可以使用ruby中的File类来完成。
这意味着您需要跟踪转弯并将其与保存数据一起传递。或者你可以循环浏览文件中的数据,并找出我想要的转弯次数。
所以你有类似的东西:
def loadGame(loadFile)
loadFile.open
data = loadFile.read
# What you do below here depends on how you decide to store the data in saveGame.
end
def saveGame(saveFile)
saveFile.open
saveFile.puts data
end
还没有真正尝试过上面的代码,所以它可能是错误的语法等。它主要是我想要碰到的概念。
希望有帮助吗?
答案 2 :(得分:0)
有许多生成器仅根据前一个值计算序列中的每个随机数,因此如果您使用其中一个,则只需将最后一个随机数保存为游戏状态的一部分。一个示例是基本linear congruential generator,其格式为:
z(n+1) = (az(n) + b) mod c
其中a
,b
和c
通常是大(已知)常量,z(0)
是种子。
一个可以说是更好的是所谓的" mulitply-with-carry"方法