Как бы я использовал случайное начальное число для создания игрового уровня? Одно и то же семя всегда должно генерировать один и тот же уровень.
Для этого примера это будет уровень стиля Worms . Таким образом, каждый уровень будет иметь тему (луга, снег и т. Д.), Базовый ландшафт, различные объекты, такие как деревья.
Так с чего бы мне начать создавать такой генератор уровней? Что будет вовлечено? Какие понятия он использует?
Бонусные баллы за любые хорошие ссылки ( бонусные бонусные баллы за все, что связано с тем, как это было сделано в червях или аналогичных).
Благодарю.
algorithm
procedural-generation
random
Адам Харт
источник
источник
srand(int)
. Последующие вызовыrand()
возвращают последовательные значения, которые всегда рассчитываются в одном и том же порядке на основе этого начального числа. Вы устанавливаете семя один раз в своей программе. После этого, если алгоритм зависит только от результатовrand
, вы будете получать один и тот же результат каждый раз.Ответы:
Ключом к этому является использование вашего собственного генератора псевдослучайных чисел, который вы инициализируете с помощью известного начального значения. «Mersenne Twister» - это популярный алгоритм, здесь есть запись в Википедии и пример источника . Этот и другие алгоритмы PRNG фактически создают (очень длинный) фиксированный ряд чисел, для которых начальное значение служит отправной точкой.
Пока вы будете следовать одной и той же процедуре создания своего мира каждый раз, каждое значение будет представлять уникальный воспроизводимый мир.
источник
Вот 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).
источник
Теоретически, если вы можете использовать генератор псевдослучайных чисел (например, Perlin-Noise или Marsenne Twister) для обмена картами через
начальные числа, то вы также можете создавать собственные карты и сводить их к начальным, решая проблему невозможности создания
пользовательские карты при использовании PRNG. Это, однако, основано на нескольких предположениях. А именно, что генераторы псевдослучайных чисел
обратимый процесс, и ЛЮБЫЕ данные, поступающие обратно в PRNG, произведут действительное начальное число, не говоря уже о начальном числе!
источник