Випадкова функція насіння для генерації карт?


28

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

Однак якщо світ нескінченний, повернення туди, де вже був гравець, викликає проблеми. Гра повинна пам'ятати, як все там насправді виглядало.

Отже, я думав - "Як Minecraft вирішує це питання?" і я подумав собі, що вони повинні використовувати якусь функцію випадкових чисел із насінням, яка може як рухатися вперед, так і назад, і таким чином відтворювати старі плитки точно так, як вони були, але в нових випадках.

Які ваші думки з цього приводу?


Як це моя відповідь на рівні +5, але питання лише в +2? Це одне з найкращих питань на головній сторінці зараз.

2
не minecraft просто зберігає шматки, які ви вже відвідали / змінили?
FxIII

@FxIII: Minecraft повинен, тому що ви можете змінювати пейзаж. Якщо ви не можете цього зробити, зберігання шматочків, ймовірно, є марною тратою або принаймні надмірним ускладненням.

@Joe Wreschnig: Добре, гаразд ... я боявся, що пропустив щось дійсно велике!
FxIII

Відповіді:


20

Що ви помітили, це різниця між генератором випадкових чисел та функцією шуму . Генератор випадкових чисел виплюває інше число кожного разу, коли ви його викликаєте. Функція шуму бере деякі аргументи - скажімо, карта x і y - і виписує числа з випадковими статистичними властивостями , але щоразу однакове значення для тих же аргументів , тобто це належна математична функція.

Два дуже тісно пов’язані між собою. Функція шуму може імітувати генератор випадкових чисел, передаючи кожен раз різне значення - наприклад noise(1), noise(2)тощо. І генератор випадкових чисел, скинутий у гігантську таблицю, може виконувати функції шуму. В обох випадках ви використовуєте неправильний інструмент для роботи.

Minecraft, зокрема, використовує шум Перліна , тип шуму, який дешево обчислити, і бажану властивість бути безперервним у тих самих розмірах, скільки вам потрібно - якщо ви будете f(x)робити графік f(x + 1), не буде різких стрибків. Це робить його дуже корисним для багатьох речей, таких як модуляція текстури, об'ємна хмара та гази та генерування місцевості.

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


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

3
@thedaian: Що в цьому випадку не особливо корисно, якщо ви не хочете відновити кожне число; функція шуму дозволяє отримати 500-е число, не маючи до цього генерувати 499.

Враховуючи алгоритм Perlin Noise, чи можливо його калібрувати? Подумайте, я хочу, щоб алгоритм з більшою ймовірністю генерував пакет стінових плиток, а потім пакет пробілів.
Mathias Lykkegaard Lorenzen

3
Ви не читали і не розуміли посилань, які я дав за шість хвилин.

1
Ця відповідь була б повною публікацією в блозі Notch: notch.tumblr.com/post/3746989361/terrain-generation-part-1
deceleratedcaviar

3

Те, як Minecraft контролює своє покоління, - це створити рівневе насіння, яке використовується для висіву всіх генерацій випадкових чисел для гри. Якщо фрагмент не існує на диску, коли він запитується, він буде генерований за допомогою функції генерації Notch на основі рівня насіння; Потім він зберігається на диску для подальшого.

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


2

Як вказував Джо, ви шукаєте хеш-функцію. Як правило, випадкові функції - це просто хеш-функції, засіяні останнім повернутим числом. Тож якби Random()повернувся Hash(seed)=1234, другий дзвінок Random()повернеться Hash(1234)і так далі.

Якщо ви шукаєте просту функцію хешування для псевдо випадкових чисел, перегляньте MurMurHash . Я реалізував це в C # і можу розмістити його десь, якщо вам цікаво. Більш детальну інформацію про Perlin Noise, який використовує таку хеш-функцію, можна знайти тут , а реалізація її в C # знаходиться тут .

Вся ця інформація виходила з питання, яке я задав рік тому тут, на Stack Overflow. Те, що ви шукаєте, називається процедурним генеруванням вмісту, тому якщо вам потрібна додаткова інформація, виконайте пошук цього. Щасливого генерування місцевості!


-1. Хеш перлінського шуму в цьому випадку не схожий на методи, які використовуються в MMH або інших криптографічних хеширующих процедурах; що код C # - це сміття, яке, як видається, просто робить лінійну інтерполяцію між випадковими значеннями; для цього потрібно набагато більше пам’яті, ніж належний Perlin-шум і, ймовірно, працює повільніше.

1
@Joe - Вибачте, що ви так сильно відчуваєте свою реалізацію Perlin Noise. Perlin Noise - сама концепція перетворення хеш-функції в функцію безперервного шуму. Я дуже ефективно генерував багато Perlin Noise з MurMurHash. Що стосується коду C #, то це приклад того, як програмно визначити значення одиничної точки в 2D Perlin шумі. Я б ніколи не використовував його у виробництві, але, на мій погляд, простіше пройти, ніж код, який ви розмістили.
dlras2

1
ОП не знала ні шуму, ні шуму, тому я просто намагалася надати довідки, сподіваючись, що вони далі розслідують і вирішать самостійно, як здійснити все, що їм потрібно зробити.
dlras2

"Perlin Noise - сама концепція перетворення хеш-функції у функцію безперервного шуму". Ні, шум Перліна - одна з функцій безперервного шуму, винайдена Кен Перлін (а не та, яку він назвав "симплекс-шум"). Не всі функції безперервного шуму - це шум Перліна; не всі функції безперервного шуму - це навіть градієнтний шум, зокрема, Перлін - шум; річ, з якою ви пов’язані, - це не градієнтний шум, а значення шуму.

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