在Python中,复制随机生成的关卡最简单的方法是什么?

4
我正在制作一个使用程序生成的关卡的游戏,测试时我经常想要重现一个关卡。目前我还没有制作任何保存关卡的方法,但我认为一个更简单的解决方案是重复使用Python随机模块使用的种子。然而,我尝试使用random.seed()random.setstate(),但两者都不能可靠地重现结果。奇怪的是,如果我重复使用种子,有时会连续几次得到相同的关卡,但它从未完全可靠到100%。我应该正常保存关卡吗(将其信息保存在文件中)?
编辑:感谢大家的帮助。事实证明,我的问题来自于我在Pygame中从组中随机选择精灵,这些精灵以无序的字典视图检索。我修改了我的代码,避免使用Pygame的精灵组部分,现在它完美地工作了。
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]
>>> 

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


1
最好创建一个 levelRandom 类,为生成级别时每个随机生成的结果分配一个数据插槽。然后将随机生成代码与级别构建代码分离。当您想要一个新级别时,首先生成一个新的 levelRandom 对象,然后将该对象交给级别生成器来生成您的级别。稍后,要再次获得相同的级别,只需重新使用 levelRandom 实例即可。

1

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

实际上,这种精确技术曾用于创建传奇游戏Elite的巨大世界。如果你勇敢的话,去看看Ian Bell是如何做到的。 ;)


0

当你想要一个新的关卡时,你应该首先创建一个新的levelRandom对象,并将该对象提供给关卡生成器来生成关卡(如果你正在使用一个)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接