Какой самый простой способ воспроизвести случайно сгенерированный уровень в Python? - PullRequest
3 голосов
/ 27 января 2010

Я создаю игру, которая использует процедурно сгенерированные уровни, и когда я тестирую, я часто хочу воспроизвести уровень. Прямо сейчас я не нашел способа сохранить уровни, но я подумал, что более простым решением было бы просто повторно использовать начальное число, используемое случайным модулем Python. Однако я попытался использовать и random.seed(), и random.setstate(), и ни один из них, похоже, не дает достоверных результатов. Как ни странно, иногда я получаю один и тот же уровень несколько раз подряд, если повторно использую семя, но оно никогда не будет на 100% надежным. Должен ли я просто сохранить уровень (как файл, содержащий его информацию)?

Edit:

Спасибо за помощь всем. Оказывается, моя проблема возникла из-за того, что я случайно выбирал спрайты из групп в Pygame, которые извлекаются в неупорядоченных словарных представлениях. Я изменил свой код, чтобы не использовать группы спрайтов Pygame для этой части, и теперь он отлично работает.

Ответы [ 3 ]

7 голосов
/ 27 января 2010

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 голос
/ 27 января 2010

Числа, генерируемые случайной функцией, являются детерминированными. Таким образом, семена с известным значением и сохранить его. Создайте уровень из следующих случайных чисел. Чтобы загрузить уровень, просто начните заново с тем же известным значением и снова используйте «случайные» числа, которые будут повторяться в той же последовательности. Это не зависит от языка, но для Python следует учитывать потоки, как указано gnibbler .

Эта точная техника фактически использовалась для создания огромного мира легендарной игры Elite . Если ты смелый, просто проверь, как Ян Белл сделал это . ;)

1 голос
/ 27 января 2010

Лучше всего было бы создать класс levelRandom со слотом данных для каждого случайно полученного результата при генерации уровня. Затем отделите код генерации случайных чисел от кода построения уровней. Когда вы хотите новый уровень, сначала сгенерируйте новый объект levelRandom, а затем передайте этот объект генератору уровней для получения вашего уровня. Позже, чтобы снова получить тот же уровень, вы можете просто повторно использовать экземпляр levelRandom.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...