3

我正在制作一个使用程序生成关卡的游戏,当我在测试时,我经常想要重现一个关卡。现在我还没有采取任何方法来保存关卡,但我认为更简单的解决方案是重用 Python 随机模块使用的种子。但是,我尝试使用两者random.seed()random.setstate()但似乎都不能可靠地重现结果。奇怪的是,如果我重复使用种子,有时我会连续几次获得相同的级别,但它永远不会 100% 可靠。我是否应该正常保存关卡(作为包含其信息的文件)?

编辑:

感谢大家的帮助。事实证明,我的问题来自于我从 Pygame 中的组中随机选择精灵,这些精灵是在无序的字典视图中检索的。我更改了我的代码以避免在该部分使用 Pygame 的精灵组,它现在可以完美运行。

4

4 回答 4

7

random.seed应该可以正常工作,但请记住它不是线程安全的 - 如果同时在其他地方使用随机数,您可能会在运行之间得到不同的结果。

在这种情况下,您应该使用 的实例random.Random()来获取私有随机数生成器

>>> import random
>>> seed=1234
>>> n=10
>>> random.Random(seed).sample(range(1000),n)
[966, 440, 7, 910, 939, 582, 671, 83, 766, 236]
>>> 

对于给定的种子,将始终返回相同的结果

于 2010-01-26T23:25:45.747 回答
1

随机函数生成的数字是确定性的。因此,具有已知价值的种子并保存它。从以下随机数创建一个级别。要加载关卡,只需使用相同的已知值再次播种并再次使用“随机”数字,这些数字将以相同的顺序重复出现。这是与语言无关的,但对于 Python 来说,正如gnibbler所指出的那样,请注意线程。

这个确切的技术,实际上是用来创造传奇游戏精英的巨大世界。如果你够勇敢,就去看看Ian Bell 是怎么做到的。;)

于 2010-01-26T23:37:34.903 回答
1

最好是在生成关卡时为每个随机生成的结果创建一个带有数据槽的 levelRandom 类。然后将随机生成代码与级别构建代码分开。当您想要一个新关卡时,首先生成一个新的 levelRandom 对象,然后将该对象交给关卡生成器以生成您的关卡。稍后,要再次获得相同的级别,您可以重用 levelRandom 实例。

于 2010-01-26T23:26:09.720 回答
0

当您想要另一个关卡时,您应该首先创建另一个 levelRandom 对象,并将该对象提供给关卡生成器以生成关卡(如果您使用的是一个)

于 2020-11-10T20:23:05.197 回答