Как работают алгоритмы генерации истории?


19

Я слышал об игре Dwarf Fortress, но только теперь один из людей, за которыми я следую на Youtube, сделал комментарий к ней ... Я был более чем удивлен, когда заметил, как Dwarf Fortress действительно создает историю для всего мира!

Теперь, как работают эти алгоритмы? Что они обычно принимают в качестве входных данных, кроме длины симуляции? Насколько они могут быть конкретными?

И что более важно; они могут быть сделаны в Javascript или Javascript слишком медленный? (Полагаю, это зависит от глубины симуляции, но возьмем Dwarf Fortress в качестве примера.)


3
"Могут ли они быть сделаны в Javascript?" Ответ, очевидно, да, но это зависит от того, насколько быстро вы хотите получить результаты и насколько сложными вы хотите, чтобы они были. Dwarf Fortress тоже требует времени - и с возрастом он замедляется! Так что, если вам нужна мелкая история, да, вы можете делать это в Javascript, так что это зависит от того, насколько сложной вы хотите, чтобы история была.
двойник

2
Он означает «на уровне Крепости Гномов», как в масштабе.
MichaelHouse

2
@Bane Да, я имею в виду, вы можете изменить, сколько истории будет в DF. Когда вы начинаете мир, он сначала случайным образом генерирует ландшафт, а затем начинает стареть мир на ваших глазах и генерировать историю по мере ее появления. Вы наблюдаете за тем, как империи расширяются и сжимаются, как меняется местность, как растут и отступают леса, как районы становятся преследуемыми (или перестают посещаться) и так далее. Он прогрессирует из года в год (или несколько лет за раз) на ваших глазах. Это продолжается до тех пор, пока вы не скажете ему остановиться. Чем дальше вы становитесь, тем медленнее становится поколение (из-за использования процессора, а не игровой механики).
двойник

1
Чтобы быть очень ясным: чем старше мир, тем медленнее каждый год рассчитывать. В молодом мире он пройдет через первые несколько лет, в мире, которому сотни лет, в следующем году на его создание может уйти секунда или несколько секунд.
двойник

1
О, это я знаю. Под «глубиной» я не имел в виду количество лет, я имел в виду количество происходящих событий и точность моделирования. Вы можете просто указать количество людей в империи, или у вас может быть класс Person, который будет выполнять обязанности по дому, ходить в армию и т. Д. Мелкий позволял бы размеру империи решать исход сражений, но глубоко бы каждый солдат сражался за своего.
Jcora

Ответы:


27

Прежде всего, есть несколько подсказок для создания истории о Dwarf Fortress. Некоторое время назад кто-то спросил на форумах Bay12 , и была сделана расшифровка стенограммы, и вы можете узнать, где начинается обсуждение, выполнив поиск: «наша тема сегодня - поколение в мире и поколение в истории».


Я не знаю точно, как это делает Dwarf Fortress, но я объясню, как я планирую реализовать очень простой первый черновик в моей игре. Я собираюсь использовать простой клеточный автомат . Если вы посмотрите на эти прототипы Spore , такие как клеточная культура и биом.

введите описание изображения здесь

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

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

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

  • Города с высоким ресурсом, районы с высокой жилой доступностью.
  • Дороги соединяют крупные города.
  • Мосты через реки.
  • Туннели через горы.
  • Крепости возле передовой линии расширения в ответ на сражения.

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

Дороги, мосты и туннели расширяются за счет торговли и транспортировки ресурсов. Каждый из них имеет максимальную пропускную способность, которая может увеличиваться с расходом ресурсов. Строить каменную крепость посреди лугов? Эти дороги будут интенсивно использоваться для транспортировки необходимого камня. Они станут больше и получат имя.

Происходят стихийные бедствия, влияющие на население и ход истории. Землетрясения могут превратить город в руины или разрушить туннель. Наводнение может смыть дорогу или мост.


Это не так глубоко, как Крепость Гномов, но это начало. Теперь, как вы можете себе представить (и как упоминал Джонатан Хоббс), чем больше расширяются эти расы, тем больше ячеек моделируется. Мало того, что моделируется больше ячеек, но и моделирование является более сложным, поскольку теперь есть структуры, которые нужно строить / поддерживать, сражения за зарплату, коммерция ... коммерция и так далее. Это становится тяжелым для любого языка. Javascript может замедлиться раньше. Тем не менее, вы всегда можете пожертвовать сложностью для улучшения скорости.

Это все симуляция (хотя и сложная), вы просто записываете важные события и называете это историей.

Я также только что нашел сообщение на форуме Bay12 для людей, которые проводят мозговой штурм о том, как сделать мир поколения Dwarf Fortress быстрее. Я не читал его, но он может дать некоторые подсказки, если у вас возникнут проблемы с слишком медленной реализацией.


Великолепно и информативно, как всегда, @ Byte56. :)
Jcora

1
Спасибо, Бэйн. Может быть, не всегда, просто случается так, что люди задают вопросы, я думаю, что я кое-что знаю Спасибо за предоставленную мне возможность больше думать об этом и записать что-то :)
MichaelHouse

4

С другой стороны, JavaScript не такой медленный, как вы думаете .

Разработчики браузеров потратили много времени и сил на оптимизацию своих движков JavaScript . Тест, с которым я связался, показывает, что из медианных задач в среднем для JavaScript JavaScript был всего в 5 раз медленнее, чем C , чего нельзя сказать о некоторых других интерпретируемых языках. А нижняя граница является еще более впечатляющим: на одном уровне с C .

Конечно, языковые тесты мало что значат - вы можете найти контрпримеры, используя другой тест. Но дело в том, что JavaScript довольно быстрый . Нет, это не C или C ++, и это не так. Но хорошо не зацикливаться на «интерпретируемом языке == медленном» мышлении, потому что для любой задачи нетривиальной сложности производительность будет иметь большее значение при разработке алгоритма, а не при выборе языка.

На самом деле я собирался написать все это в комментарии, но мне не хватило места.


1

Да, он может быть построен на javascript, проверьте такие проекты, как ASM.js, которые работают почти в 2 раза медленнее, чем C. Если вы позаботитесь о нескольких ядрах (используя веб-работников), это может быть даже быстрее, чем DF (с точки зрения ресурсов) , который является монокорным прямо сейчас.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.