Як генерувати випадковий рівень із насіння? [зачинено]


46

Як би я міг використовувати випадкове насіння для створення рівня гри? Одне і те ж насіння завжди має генерувати абсолютно той самий рівень.

У цьому прикладі це був би рівень стилю Worms . Таким чином, кожен рівень матиме тему (луки, сніг тощо), базовий ландшафт, різні об'єкти, такі як дерева.

То з чого я б почав створювати подібний генератор рівнів? Що б задіяно? Які поняття він використовує?

Бонусні бали за будь-які хороші посилання ( бонусні бонусні бали за все, що стосується того, як це було зроблено з хробаками чи подібними).

Дякую.


Генерація випадкових рівнів також відома як процесорне генерування вмісту (PCG). А ось вікі, що займається саме цим. pcg.wikidot.com Повинен дати вам кілька ідей! : o)
Кай

1
У Криса Кроуфорда є стаття, яка вам може бути цікавою. Він був написаний на початку 90-х, але все ще актуальний. Як побудувати світ
Ентоні

Якщо ви використовуєте яку - або форму або алгоритм , який використовує той же генератор випадкових чисел ( за винятком одного , що - то крадеться в инварианте як системний час), то ж насіння буде генерувати один і той же рівень, що немає дійсно ніякого шляху навколо нього.
Кай

1
Так, але я думаю, що фокус насправді полягає в використанні насіння в першу чергу для отримання рівня. Я раніше будував генератори випадкових рівнів, але вони не використовували жодного насіння. Часто я вибирав би випадкові бали, то для кожної точки вибираю випадковий актив, щоб розмістити його. У такий спосіб немає ОДНОГО справжнього насіння, яке завжди генеруватиме один і той же рівень, оскільки існує маса речей, що генерують там власні випадкові числа.
Адам Харте

10
Ви впевнені, що знаєте, що означає "насіння"? Це «початковий вектор» пройшов в с допомогою, наприклад, srand(int). Подальші виклики до rand()повертають послідовні значення, які завжди обчислюються в одному порядку, виходячи з цього насіння. Ви встановлюєте насіння один раз у своїй програмі. Після цього, якщо алгоритм залежить лише від результатів rand, ви будете отримувати однаковий результат кожного разу.
Хіт Ханнікутт

Відповіді:


7

Ключовим моментом є використання власного генератора псевдовипадкових чисел, який ви ініціалізуєте з відомим значенням насіння. "Мережа Мерсена" - популярний алгоритм, тут є запис у Вікіпедії та деякий зразок джерела . Цей та інші алгоритми 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 пікселя та шириною вашого ігрового світу, то ви в основному отримуєте карту висоти, готову до використання. Функції шуму Perlin також завжди генерують ту саму карту з тим же насінням.

Потім можна скористатися згаданим вище PRNG, щоб визначити, де розмістити випадкові об'єкти на карті або де створити яму в землі. Для отворів ви також можете знову скористатися шумом перлин. Просто створіть зображення перлін-шуму з розміром карти (x, y), а потім створіть дірку на своїй карті, де значення пікселів нижче заданого порогу (наприклад, 0,2).


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

2

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

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

спеціальні карти при використанні PRNG. Однак це побудовано на кількох припущеннях. А саме - генератори псевдовипадкових чисел

зворотний процес, і будь-які дані, що передаються назад в PRNG, дадуть дійсне насіння, не кажучи вже про насіння!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.