在Python中重现随机生成关卡的最简单方法是什么?
我正在制作一个游戏,这个游戏的关卡是通过程序自动生成的。在测试的时候,我常常想要重现一个关卡。目前我还没有找到保存关卡的方法,但我想了一个简单的办法,就是重复使用Python随机模块的种子(seed)。不过,我试过用 random.seed()
和 random.setstate()
,结果都没有可靠地重现出相同的结果。有时候,如果我重复使用同一个种子,我会连续几次得到相同的关卡,但这并不是完全可靠的。难道我应该像往常一样保存关卡(把它的信息存成一个文件)吗?
编辑:
谢谢大家的帮助。原来我的问题出在我从Pygame的组里随机选择精灵(sprites),而这些精灵是以无序的字典视图获取的。我修改了代码,避免在那部分使用Pygame的精灵组,现在一切都正常了。
4 个回答
最好的办法是创建一个叫做levelRandom的类,这个类里有一个数据槽,用来存放每次生成关卡时随机产生的结果。然后,把随机生成的代码和构建关卡的代码分开。当你想要生成一个新关卡时,首先创建一个新的levelRandom对象,然后把这个对象交给关卡生成器来生成你的关卡。以后如果想要再得到同样的关卡,你只需要重新使用那个levelRandom实例就可以了。
随机函数生成的数字是有规律可循的,也就是说它们是确定性的。因此,你可以使用一个已知的种子值并保存它。然后用这些随机数字创建一个关卡。当你想加载这个关卡时,只需要再次用同样的种子值进行初始化,这样“随机”数字就会以相同的顺序再次出现。这种方法不依赖于特定的编程语言,但在使用Python时,要注意线程问题,正如gnibbler提到的那样。
实际上,这种技术被用来创建传奇游戏Elite的庞大世界。如果你有兴趣,可以去看看Ian Bell是怎么做到的。;)
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]
>>>
对于给定的种子,它总是会返回相同的结果。