gpt4 book ai didi

java - 序列化 java.util.Random

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:13:04 24 4
gpt4 key购买 nike

我正在开发一款简单的小游戏(主要是为了学习 Java 8 和 JavaFX 中的新功能)。我拥有的功能之一是能够为游戏的随机数生成器提供种子,这样您就可以在不同的系统上与 friend 玩大致相同的游戏(想想 Minecraft map 或 The艾萨克的绑定(bind)游戏)。

我想添加保存游戏以便稍后恢复的功能。查看 java.util.Random 类的文档后,我找不到获取随机数生成器当前种子的方法。我想出的在保存游戏后恢复随机数生成器的唯一方法是在保存时通过反射访问种子并使用它,或者在加载时播种初始种子并调用 nextInt( ) 一遍又一遍,直到我们将随机数生成器前滚到足以恢复游戏保存前的位置。

最佳答案

首先,正如@user2357112 指出的那样,Random工具 Serializable ,并通过编写 seed 字段(以及 nextNextGaussianhaveNextNextGaussian 字段)来实现。您是否尝试过简单地序列化它?那应该“正常工作”™。其他序列化程序,如 Gson,也可以工作。 gson.fromJson(gson.toJson(r), Random.class); 返回一个相同的对象。

您不一定需要相同 Random 实例,只需一个一致的实例即可。您可以简单地调用 nextLong() 并将该值作为 random_seed 或其他任何内容写入您的保存文件。然后只需用该种子初始化一个 Random 实例,现在从该文件加载的所有运行都将表现相同。如果需要,您甚至可以将当前运行的游戏中的 Random 实例也重置为相同的种子。

另一方面,如果您随机生成 map 或其他看似恒定的内容并希望它在加载之间持续存在,我认为您最好将 Random 简单地播种在开始,并像您描述的那样保存该值。为了节省计算,您可以在小于整个关卡的 block 中执行此操作。例如,将每个级别分成 10 级,并为每 10 级使用(并保存)不同的种子。然后你只需要生成用户现在所在的部分,而不是他们已经穿过的部分。如果您只按照您的建议保存当前状态,则用户无法在 map 中后退(这对您的游戏来说可能不是特别的问题,但通常不是一个很好的做法)。


用户体验警告:保存游戏的随机性似乎可能过度设计。作为用户,我通常不希望保存文件保持随机性。事实上,有时玩家会利用这一点,例如,如果他们在保存后立即死于随机遭遇战,重新加载游戏不会立即让他们回到同一遭遇战中。我会考虑让您的游戏的 Random 不做种子,让每个游戏都略微独特。

关于java - 序列化 java.util.Random,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29551847/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com