Я ищу функцию для генерации случайной карты на основе плитки при изменении визуальных границ карты (при просмотре карты). Я хочу, чтобы карта была бесконечно большой и имела лабиринтную структуру.
Однако, если мир бесконечен, возвращение туда, где игрок уже был прежде, поднимает проблему. Игра должна помнить, как все было на самом деле.
Итак, я подумал - «Как Minecraft решает эту проблему?» и я подумал про себя, что они должны использовать какую-то функцию случайных чисел с начальным числом, которое может и идти вперед, и назад, и таким образом воссоздавать старые плитки точно так же, как они были, но в новых случаях.
Что вы думаете об этом?
tiles
random
minecraft-modding
tilemap
Матиас Ликкегор Лоренцен
источник
источник
Ответы:
Вы заметили разницу между генератором случайных чисел и функцией шума . Генератор случайных чисел выдает разные номера каждый раз, когда вы звоните. Шумовая функция принимает некоторые аргументы - скажем, карту x и y - и выплевывает числа со случайными статистическими свойствами , но каждый раз одно и то же значение для одних и тех же аргументов , т.е. это правильная математическая функция.
Два очень тесно связаны. Функция шума может имитировать генератор случайных чисел, переходя в другое значение каждый раз , - например
noise(1)
,noise(2)
и так далее. А генератор случайных чисел, помещенный в гигантский стол, может выполнять функцию шума. В обоих случаях вы используете не тот инструмент для работы.Minecraft , в частности , использования Перлин шума , тип шума , который дешев , чтобы вычислить, и имеет желаемое свойство быть непрерывным , как много размеров , как вам нужно - если график ,
f(x)
чтобыf(x + 1)
, там не будет никаких резких скачков. Это делает его очень полезным для многих вещей, таких как модуляция текстуры, объемные облака и газы, а также генерация рельефа.Если вы ищете реализацию, с которой можно начать играть, улучшенный генератор шума Perlin Кена Перлина - одна из самых простых реализаций.
источник
Minecraft контролирует свое поколение, создавая семя уровня, которое используется для заполнения всех генераций случайных чисел в игре. Если чанк не существует на диске при его запросе, он будет сгенерирован с использованием функции генерирования Notch на основе начального уровня уровня; затем он сохраняется на диск для дальнейшего использования.
Звучит так, будто вы пытаетесь добиться подобного поведения, так что это безопасный путь.
источник
Как отметил Джо, вы ищете хеш-функцию. Как правило, случайные функции - это просто хеш-функции, заполненные последним возвращаемым числом. Так что, если он
Random()
вернетсяHash(seed)=1234
, второй вызовRandom()
вернетсяHash(1234)
, и так далее.Если вы ищете простую функцию хеширования для псевдослучайных чисел, посмотрите MurMurHash . Я реализовал это в C # и могу опубликовать его где-нибудь, если вам интересно. Более подробную информацию о Perlin Noise, который использует такую хеш-функцию, можно найти здесь , а его реализация на C # - здесь .
Вся эта информация пришла из вопроса, который я задал год назад здесь, на переполнении стека. То, что вы изучаете, называется процедурной генерацией контента, поэтому, если вам нужна дополнительная информация, выполните поиск по ней. Счастливого создания ландшафта!
источник