2010-01-26 119 views
2

我正在制作一个使用程序生成的关卡的游戏,当我测试时,我经常想重现一个关卡。目前我还没有任何方法来保存关卡,但我认为更简单的解决方案是重用Python随机模块使用的种子。不过,我已经尝试使用random.seed()random.setstate(),并且都不能可靠地重现结果。奇怪的是,如果我重复使用种子,我有时会连续几次获得同样的水平,但它绝对不可能完全100%可靠。我是否应该正常保存该级别(作为包含其信息的文件)?什么是在Python中重现随机生成级别的最简单方法?

编辑:

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

回答

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实例。

1

通过随机函数生成的数字是确定性的。因此,具有已知价值的种子并保存它。从以下随机数中创建一个关卡。要加载关卡,只需再次输入相同的已知值并再次使用“随机”数字,这些数字将以相同的顺序重新出现。这是语言无关,但为Python介意线程由gnibbler指出。

这个确切的技术实际上是用于创建传奇游戏Elite的堆积如山的世界。如果你很勇敢,只要去检查如何Ian Bell did it。 ;)

相关问题