【问题标题】:What's the easiest way to reproduce a randomly generated level in Python?在 Python 中重现随机生成的关卡最简单的方法是什么?
【发布时间】:2011-01-09 18:01:09
【问题描述】:

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

编辑:

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

【问题讨论】:

    标签: python random pygame


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      这种精确的技术实际上被用来创造传奇游戏Elite 的巨大世界。如果你很勇敢,就去看看Ian Bell did it。 ;)

      【讨论】:

        【解决方案3】:

        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]
        >>> 
        

        对于给定的种子总是返回相同的结果

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-17
            • 2016-01-08
            • 2010-09-23
            • 2011-08-01
            • 1970-01-01
            • 2010-10-12
            相关资源
            最近更新 更多