Как создать случайный уровень из семени? [закрыто]

46

Как бы я использовал случайное начальное число для создания игрового уровня? Одно и то же семя всегда должно генерировать один и тот же уровень.

Для этого примера это будет уровень стиля Worms . Таким образом, каждый уровень будет иметь тему (луга, снег и т. Д.), Базовый ландшафт, различные объекты, такие как деревья.

Так с чего бы мне начать создавать такой генератор уровней? Что будет вовлечено? Какие понятия он использует?

Бонусные баллы за любые хорошие ссылки ( бонусные бонусные баллы за все, что связано с тем, как это было сделано в червях или аналогичных).

Благодарю.

Адам Харт
источник
Генерация случайных уровней также известна как генерация процедурного контента (PCG). И вот вики имеет дело только с этим. pcg.wikidot.com Должен дать вам несколько идей! : o)
Кадж
1
У Криса Кроуфорда есть статья, которая может показаться вам интересной. Он был написан в начале 90-х, но все еще актуален. Как построить мир
Энтони
Если вы используете любую форму или алгоритм, который использует тот же генератор случайных чисел (за исключением того, который каким-то образом крадется в инварианте, таком как системное время), то же самое начальное число будет генерировать тот же уровень, на самом деле нет никакого способа обойти его.
Кадж
1
Да, но я думаю, что хитрость заключается в том, чтобы сначала использовать начальное значение для генерации уровня. Ранее я создавал генераторы случайных уровней, но они не использовали ни одного начального числа. Часто я выбираю случайные точки, затем для каждой точки выбираю случайный актив для размещения там. Делая это таким образом, не существует ОДНОГО истинного начального числа, которое всегда будет генерировать один и тот же уровень, поскольку существует множество вещей, генерирующих свои собственные случайные числа.
Адам Харт
10
Вы уверены, что знаете, что означает «семя»? Это «начальный вектор» прошел в с помощью, например, srand(int). Последующие вызовы rand()возвращают последовательные значения, которые всегда рассчитываются в одном и том же порядке на основе этого начального числа. Вы устанавливаете семя один раз в своей программе. После этого, если алгоритм зависит только от результатов rand, вы будете получать один и тот же результат каждый раз.
Хит Ханникутт

Ответы:

7

Ключом к этому является использование вашего собственного генератора псевдослучайных чисел, который вы инициализируете с помощью известного начального значения. «Mersenne Twister» - это популярный алгоритм, здесь есть запись в Википедии и пример источника . Этот и другие алгоритмы PRNG фактически создают (очень длинный) фиксированный ряд чисел, для которых начальное значение служит отправной точкой.

Пока вы будете следовать одной и той же процедуре создания своего мира каждый раз, каждое значение будет представлять уникальный воспроизводимый мир.

Джейсон Моралес
источник
4

Вот PRNG (генератор псевдослучайных чисел), реализованный в ActionScript (доступный в AS2 или AS3). Это легкий и быстрый, идеально подходит для игр: http://lab.polygonal.de/2007/04/21/a-good-pseudo-random-number-generator-prng/

Вышеуказанная реализация основана на PRNG Park-Miller-Carta . Этот сайт даст вам больше понимания математики, стоящей за всем этим.

Чтобы построить червеобразный уровень, я бы, вероятно, использовал функцию Perlin-Noise . Если вы генерируете перлин-шумовое изображение с высотой 1 пикселя и шириной игрового мира, то вы в основном получаете карту высот, готовую к использованию. Функции шума Перлина также всегда генерируют одну и ту же карту с одним и тем же начальным числом.

Затем вы можете использовать PRNG, упомянутый выше, чтобы определить, где разместить случайные объекты на карте или где создать дыру в земле. Для дырок вы также можете воспользоваться перлин-шумом снова. Просто создайте перлин-шумовое изображение с размером вашей карты (x, y), а затем создайте дыру в вашей карте, где значение пикселя ниже заданного порога (например, 0.2).

bummzack
источник
Я бы использовал перлин-шум, но немного по-другому, использовал бы его для создания трехмерной карты высот, поместил карту на склон и удалил все пиксели ниже вашего порога. (если pixel.height - (pixel.distanceToBottom * slopeFactor) <порог) pixel = прозрачный)
Нильс
2

Теоретически, если вы можете использовать генератор псевдослучайных чисел (например, Perlin-Noise или Marsenne Twister) для обмена картами через

начальные числа, то вы также можете создавать собственные карты и сводить их к начальным, решая проблему невозможности создания

пользовательские карты при использовании PRNG. Это, однако, основано на нескольких предположениях. А именно, что генераторы псевдослучайных чисел

обратимый процесс, и ЛЮБЫЕ данные, поступающие обратно в PRNG, произведут действительное начальное число, не говоря уже о начальном числе!


источник