Збільшення ймовірності генерування подібних плиток поруч


9

Я працюю над системою карти плитки, яка виглядає так (зелена трава, повітря біле, камінь сірий, а синій - вода):

Черепиця

Він використовує простий генератор випадкових чисел, так що існує 45% шансу плитка бути травою, 30% шансів на те, що вона буде водою, і 25% шансів, що вона стане каменем.

Чи все-таки я можу посилити тенденцію, щоб трав'яні / кам'яні блоки збиваються разом, утворюючи сухопутні маси, і змушувати водяні блоки утворювати океани (на зразок того, що можна побачити в грі, як Minecraft)?

Відповіді:


17

Ви можете використовувати алгоритм, який перевіряє поблизу блоків і змінює ймовірність залежно від того, що там є, - але я думаю, що це багато в чому неправильний підхід.

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

http://en.wikipedia.org/wiki/Perlin_noise

Потім можна відрегулювати рівень води, встановивши порог того, що робить вода. Для інших блоків ви можете запустити другий набір шуму для перемикання між скелею та травою. (таким чином ви можете мати великі плями води, але менші грудочки каменю).

getTerrain(x,y) {
if(perlin_noise(x,y) > 0) {
    if(perlin_noise(x * scale,y * scale) > 0) {
        return rock
    } else {
        return dirt
    }
} else {
    return water
}

Оскільки я думаю, що метод сканування і кидання занадто складний і не надмірно масштабований, я запропоную інший метод, який мені сподобався:

Прокладіть сітку по всій карті, розбивши карту на великі квадрати.

Створіть випадкове число на кожному перехресті (від 0 до 1 буде працювати для ваших відсотків)

Розділіть, розрізавши кожен квадрат на 4 рівних квадрата - дотримуйтесь старих ліній, і там, де ви знайдете лінії підрозділу, генеруйте випадкове число між 2 сусідніми точками, аналогічно для центру хреста, генеруйте точку, яка лежить між найвищою і найнижчі значення.

Промийте та повторіть. Ви отримаєте початкову випадковість з першого проходу, але останні проходи дадуть певну рівномірність Вибачте за псуедо-випадкові числа:

0-------5  0---3---5 0-1-3-4-5 011233455
|       |  |   |   | | | | | | 012344555
|       |  |   |   | 0-2-4-6-5 002445665
|       |  |   |   | | | | | | 123445666
|       |  2---5---7 2-4-5-7-7 234455777
|       |  |   |   | | | | | | 233455688
|       |  |   |   | 2-3-5-5-9 223455589
|       |  |   |   | | | | | | 233455589
2-------9  2---4---9 2-4-4-5-9 234445579

Це працює ще краще для трикутників, оскільки у вас немає втраченої поперечної смуги при підрозділі.

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


+1 Як я думаю, стрибок у шум, як правило, куди це призведе .. Мені цікаво, чи це може бути трохи занадто великий стрибок, хоча так початкове "сканування навколо та зміна відсотків" полегшило мене на голосування :)
Джеймс

3

Шум - це одне хороше рішення, про що вже говорилося. Інший варіант - зробити другий прохід у даних, щоб підвести їх до потрібного макета. Розмиття Гаусса - один із багатьох способів, яким ви могли цього досягти. Здійснення пропуску з цим має отримати гарні "круглі" краплі кожного типу.

Незалежно від того, до якого методу ви скористаєтесь, важливо пам’ятати - зберігати результати процесу на новому місці. Якщо ви зміните карту на місці, частини, які ви вже обробляли, почнуть впливати на алгоритм, і ви отримаєте дивні шаблони.


2

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

Це призводить до чогось досить потворного та механічного вигляду. Каламуть трохи межі, і ви будете в пристойній формі.

Якщо ви створюєте велику карту, ви можете зробити це на двох рівнях. Створіть свою початкову діаграму Вороного, використовуючи, скажімо, 20 ядер, і назвіть кожен результат регіону нацією. Створіть іншу діаграму, використовуючи 400 ядер і назвіть кожну результуючу область вікаражем.

Усі загальнолюдські товари, які повністю містяться в країні, матимуть стихію нації. Частини, що містяться в двох або більше державах, виконуються випадково одним із елементів, що оточують їх.

Цей пост заслуговує на фотографію, але я лінивий надати його.



0

ви можете зробити це за допомогою цього методу:

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