Математический вопрос: процедурное поколение галактики

Если это только два массива чисел или строк, это быстрый однострочный

const array1 = [1, 2, 3];
const array2 = [1, 3, 4];
console.log(array1.join(',') === array2.join(',')) //false

const array3 = [1, 2, 3];
const array4 = [1, 2, 3];
console.log(array3.join(',') === array4.join(',')) //true
43
задан Mark Cidade 8 December 2008 в 17:34
поделиться

13 ответов

Если Вы чувствуете себя храбрыми, Вы могли бы сделать хуже, чем взгляд на то, как Ian Bell сделал это для исходной версии Элиты

23
ответ дан Gareth 4 August 2019 в 18:24
поделиться

Это - мое второе, улучшенное решение. Плеер начнет в случайным образом сгенерированной солнечной системе. Каждая система подключена с между 1 и 4 другими системами. Думайте о них как о севере, юге, восточных и западных системах. Если плеер должен был переместиться через север jumpgate, он будет взят к системе, семя которой является еще одним, чем система прежде. Если он пойдет на юг, семя для той системы будет тем меньше. 2 + и 2-для востока и запада соответственно. Расстояния до тех систем (в парсеках или световые годы или безотносительно) вычисляются с семенем систем и направлением, от которого Вы прибываете. Таким образом, размер галактики только ограничен макс., и минута числа раньше содержала семена.

дыры Деформации для движения в другие галактики будут помещены определенное расстояние от стартовой системы. Следующая галактика будет просто похожа на продолжение этой галактики, в которой числа семени будут увеличены таким же образом и что система, которая находится на другом конце галактической дыры деформации, просто будет "востоком" или "северным" соединением от стартовой системы.

Между прочим, это использование постепенного увеличения семян приводит к сети, в отличие от вышеупомянутого решения. Кроме того, Вы видите, что этот метод использует четырехугольники, в то время как вышеупомянутое решение использовало шестиугольники, которые лишили возможности создавать сеть.

, Конечно, все это основано на предположении, что все семена генерируют случайную последовательность чисел, которая отличается от любой другой последовательности. Это делает его так, чтобы каждая система была уникальна.

0
ответ дан Dove 4 August 2019 в 18:24
поделиться

Пока Вы называете srandom () с тем же семенем, Вы получите те же значения из случайного (). Так, просто основывайте все в звездообразной системе от единственного вызова к srandom ()... Затем необходимо будет только сохранить 1 целое число (семя) для целой звездообразной системы. Теперь это - сжатие!

0
ответ дан dicroce 4 August 2019 в 18:24
поделиться

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

Использование первое число от псевдослучайного потока числа, которое генерирует количество "логических элементов". Пройдите каждый логический элемент и заставьте значение от потока числа присваиваться к и отбирать каждую целевую систему.

Генерируют featurs каждой системы на основе того семени.

существует несколько известных алгоритмов для генерации случайных семян.

Дают вихрь Мерсенна трещина

0
ответ дан Nat 4 August 2019 в 18:24
поделиться

Вот то, что я придумал. Не знайте, будет ли это окончательная версия все же.

Воображают шестиугольную сетку, и в каждой вершине, солнечной системе. С тех пор мы находимся на шестиугольной сетке, существует только три строки, идущие от любой вершины. Каждый всегда горизонтален, и другие два являются диагоналями. Если мы даем стартовому семени значение n, мы можем дать солнечную систему, которая горизонтально подключена к начальной точке значение n+1, другие получают значения n+2 и n-2.

, О, дерьмо. Мы привычка обязательно получаем сетку. Damnit. Позволяет попробовали еще раз.

0
ответ дан Dove 4 August 2019 в 18:24
поделиться

Если Вы действительно хотите возвратиться к фиксированному состоянию, я не думаю, что процедурное поколение от единственного значения является правильным способом пойти.

Позволяют нам принять, у Вас есть сетка с фиксированным шагом 256x256 системы в каждой плоскости и 16 плоскостях во вселенной. Каждая плоскость имеет до 512 торговых станций и до 8 ссылок на другие плоскости. Все торговые станции и ссылки находятся на фиксированной позиции. Ваше начальное значение семени должно быть, по крайней мере, 2^76 для кодирования всех возможных вселенных. Добавьте еще некоторые объекты (планеты, поставки...), и число растет экспоненциально.

Редактирование: это немного меньше, если Вы не позволяете больше чем одну торговую станцию или ссылку в каждой системе. Я использовал бы некоторое постоянное хранение, возможно, встроенная база данных как Firebird или sqlite. Случайно я в настоящее время разрабатываю такую игру.

0
ответ дан 4 August 2019 в 18:24
поделиться

Случайное семя для каждой солнечной системы является эффективным решением, но у меня есть чувство, что Вы рявкаете неправильное дерево здесь.

плеер может сделать что-нибудь для изменения то, что там? (Скажите, создайте что-то, взорвите depleatable ресурс и т.д.?) Если так, необходимо будет сохранить состояние так или иначе.

плеер может искать то, на что место было похоже, на самом деле не имея необходимость возвратиться туда? (И если он не может, почему нет?!) Вы собираетесь искать его, или Вы собираетесь повторно создать всю солнечную систему только для обнаружения информации об этом? (решение PRNG не разрешает Вам получать только часть солнечной системы, необходимо сделать все это.)

, сколько деталь там так или иначе, что необходимо сохранить?

3
ответ дан Loren Pechtel 4 August 2019 в 18:24
поделиться

Я не думаю, что существует действительно все так много информации в "галактике", что Вы не могли сохранить ее на сегодняшних компьютерах. Давайте предположим, что галактика имеет 100 звезд, и что каждая звезда имеет 10 планет, и что каждая планета имеет 3 луны. Это - 100 звезд + 1 000 планет + 3 000 лун, которые необходимо отслеживать, который является 4 100 телами.

Вот вещи, которые мы можем хотеть отслеживать для планеты.

Масса X, Y, Z Продолжительность положения дня (время для вращения на своей собственной оси) Длина Суммы Населения года ресурсов для 50 различных ресурсов

Принятие каждого значения требует, чтобы двойное сохранило его, и у нас есть 57 значений для хранения (позволяет, округляют в большую сторону его и говорят 100), тогда у нас есть 100 значений * 8 байтов * 4 100 тел = 3 280 000 байтов. Теперь, это - 3 megs данных. Это может походить на много, но это действительно не так очень. Кроме того, я не думаю, что Вы действительно хотели бы иметь столько звезд в единственной галактике. Игра действительно была бы просто слишком большой для исследования и вероятно станет неуправляемой большой, чтобы попытаться на самом деле моделировать весь материал, на который это идет в данной галактике.

Взгляд на него этот путь. Если Вы берете игру как SimCity и смотрите на каждый квадрат на городской сетке как потенциальная планета, и затем Вы понимаете, сколько информации может храниться в маленьком файле, так, чтобы Вы ничего случайным образом не генерировали.

3
ответ дан Kibbee 4 August 2019 в 18:24
поделиться

Смотрите на оригинал Черви игра. Я думаю, что это утверждало, что имело приблизительно 4 миллиарда возможных уровней. Каждый уровень был сгенерирован на основе короткой строки семени, возможно, 20 символов. Это определило

  • тема уровня (арктический, лес, и т.д....)
  • форма среды
  • скользкость земли
  • размещение предварительно созданных деталей уровня (снеговики, скалы...)
  • размещение Вашей команды червей, мин и ящиков оружия.

при наслаждении уровнем Вы могли бы записать строку семени и использовать ее для регенерации того же уровня позднее.

Это - пример очень сложной, но детерминированной функции с единственным входным параметром. Я думаю, что это - существенное понятие того, в чем Вы нуждаетесь.

6
ответ дан Liam 4 August 2019 в 18:24
поделиться

Вы могли создать псевдослучайное количество Н цифры от определенного семени ("родительское число"). Затем Вы делите цифры на группы и используете их для ответа на Ваши вопросы.

Пример: N=20

-> одна цифра: сколько пропускает дополнительный переход?
-> три цифры: семя для генерации соответствующих продолжительностей каждого доступного перехода
-> шесть цифр: семя для генерации этой солнечной системы
-> десять цифр: семя для генерации новых 20 семян цифры для каждой связанной солнечной системы

Тогда рекурсивно вызывает. Каждая система (со стабильными орбитами и т.д.) сгенерирована во время 0, и необходимо будет вычислить, как это смотрит теперь .

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

я думаю, что было бы лучше генерировать координаты - используют полярные координаты в плоскости, и возможно эллипсоид в трех измерениях.

0
ответ дан Svante 4 August 2019 в 18:24
поделиться

Вот основная идея насколько я понимаю. Скажите, что Вы прибыли в звездообразную систему № 42, и необходимо узнать то, что находится в нем. Это имеет nplanets планеты - число между 0 и 10, скажите:

>>> star_system = 42
>>> nplanets = hash('nplanets%d' % star_system) % (10 + 1)
>>> nplanets
4

хорошо, таким образом, планетой № 2, сколько космических станций находится в орбите там в начале игры? Найдите число между 0 и 3:

>>> planet = 2
>>> nstations = hash('nstations%d/%d' % (star_system, planet)) % (3 + 1)
>>> nstations
1

И так далее. Числа - каждый хеш-функция индексов (звездообразная система № 42, планета № 2, в этом случае), уменьшенный до соответствующего диапазона. Так как хеш-функции детерминированы, но 'случайны', это - тот же каждый раз, но случайно смотрящий плеер.

, Конечно, хешируя строки с длинными последовательностями как 'nstations' в них не самый быстрый способ пойти об этом, но это показывает идею.

7
ответ дан Darius Bacon 4 August 2019 в 18:24
поделиться

Я могу неопределенно вспомнить то, чтобы это было сделанным прежде. В течение начала фракталов 90-х был весь гнев, и я помню одну компанию, предлагающую миры игровым программистам. Создал целую бесконечную вселенную, полную галактик с солнцами и планетами, событие вниз к долинам и структурам мест на планетах. Они предлагали находить подходящую виртуальную недвижимость разработчикам игр. Разработчики игр заставили бы программное обеспечение представлять и использовать это, вместе с точными координатами к их propery в этой фрактальной вселенной.

я гуглил в течение нескольких минут для "фрактальной игровой вселенной планеты мира" и такого, но не нашел их. Это, возможно, было Pandromeda, но я не могу вполне помнить.

необходимо изучить фракталы для этой идеи. Все, в чем Вы нуждаетесь, является непрерывным полем чисел, которые можно воссоздать от семени и затем представить те числа как звезды, планеты и спутники с различными свойствами.

0
ответ дан Guge 4 August 2019 в 18:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: