Як працюють алгоритми генерації історії?


19

Я чув про гру «Карликова фортеця», але лише зараз хтось із людей, за якими я слідкую на Youtube, прокоментував це… Я був більш ніж здивований, коли помітив, як Dwarf Fortress насправді генерує історію для світу!

Тепер, як працюють ці алгоритми? Що вони зазвичай приймають за вхід, крім тривалості моделювання? Наскільки вони можуть бути конкретними?

І ще важливіше; вони можуть бути зроблені в Javascript, або Javascript занадто повільний? (Я думаю, це залежить від глибини моделювання, але візьміть як приклад Гном-фортецю.)


3
"Чи можна їх зробити у Javascript?" Відповідь, очевидно, так, але це залежить від того, наскільки швидко ви хочете отримати результати та наскільки складними ви хочете їх мати. Карликова фортеця теж проходить певний час - і вона сповільнюється у міру старіння світу! Отже, поки ви хочете дрібної історії, так, ви можете це робити в Javascript, тому це залежить від того, наскільки складною ви хочете історію.
doppelgreener

2
Він означає «на рівні карликової фортеці», як у масштабі.
MichaelHouse

2
@Bane Так, я маю на увазі, що ви можете змінити, скільки історії буде у DF. Коли ви запускаєте світ, він спочатку випадковим чином генерує місцевість, а потім починає старіти світ перед вашими очима та генерувати історію, як йде. Ви спостерігаєте, як імперії розширюються і скорочуються, як місцевість змінюється, коли ліси ростуть і відступають, коли ділянки переслідують (або більше не переслідують) тощо. Він прогресує рік за роком (або кілька років справді) перед вашими очима. Це триває, поки ви не скажете йому зупинитися. Чим далі ви отримуєте повільніше покоління (завдяки використанню процесора, а не ігрової механіки).
doppelgreener

1
Щоб бути дуже зрозумілим: чим старший світ, тим повільніше обчислювати з кожним роком. У молодому світі він буде пролітати протягом перших кількох років, у світі сотні років, наступний рік може зайняти секунду або кілька секунд для створення.
doppelgreener

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

Відповіді:


27

По-перше, є кілька підказок для покоління історії про фортецю карликів. Хтось запитував на форумах Bay12 деякий час назад, і стенограма поділилася, і ви можете знайти, з чого починається обговорення, шукаючи: "Наша сьогодні тема - це покоління світу та покоління історії".


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

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

Це приклади стільникових автоматизацій і що вони можуть виробляти. По суті, я буду створювати правила для різних рас. Деякі приклади правил:

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

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

  • Міста в районах з високим рівнем ресурсів, з високою привабливістю.
  • Дороги з'єднують більші міста.
  • Мости через річки.
  • Тунелі через гори.
  • Фортеці біля передових ліній розширення у відповідь на бої.

Будь-яка структура може бути набіжена / завойована іншими расами. Чим довше така структура (як місто чи фортеця) існує в історії, тим вона захисніша, тим важче її перейняти. І тим більш бажаним є перегони, які хочуть контролювати. Бійки ведуться там, де зустрічаються перегони (принаймні одна ворожа). Битви названі на честь визначних пам'яток або споруд, що знаходяться поблизу, або якщо битва значна, або орієнтири не названі, орієнтири називають іменем битви.

Дороги, мости та тунелі розширюються за рахунок торгівлі та транспортування ресурсів. Кожен має максимальну пропускну здатність, яка може збільшуватися за рахунок витрат ресурсів. Побудова кам’яної фортеці посеред лугів? Ці дороги отримають велике використання, транспортуючи потрібний камінь. Вони стануть більшими і отримають ім’я.

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


Це не так поглиблено, як фортеця-карлик, але це початок. Тепер, як ви можете собі уявити, (і як згадував Джоннатан Гоббс), чим більше ці раси розширюються, тим більше моделюють клітини. Мало того, що моделюється більше клітин, але моделювання є складнішим, оскільки зараз існують структури для побудови / підтримки, ведення битв за ведення заробітків, комерція з ... комерцією тощо. Це стає важким для будь-якої мови. Javascript може сповільнитися раніше. Однак завжди можна пожертвувати складністю для покращення швидкості.

Це все симуляція (хоч і складна), ви просто записуєте важливі події по дорозі і називаєте це історією.

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


Чудово та інформативно, як завжди, @ Byte56. :)
jcora

1
Дякую Бейн Можливо, не завжди, просто буває, що люди задають питання, я думаю, я про щось знаю. Дякуємо, що надали мені можливість подумати над цим більше і записати щось :)
MichaelHouse

4

Як бічна точка, JavaScript не такий повільний, як ви могли подумати .

Розробники браузерів витратили багато часу та енергії на оптимізацію своїх двигунів JavaScript . Базовий показник, з яким я пов'язував, показує, що серед задач, орієнтованих на медіану, JavaScript був лише у 5 разів повільніше, ніж C , чого не можна сказати для деяких інших інтерпретованих мов. А нижня межа ще більш вражає: нарівні з С .

Звичайно, мовні орієнтири насправді не означають багато - ви, мабуть, могли знайти контрприклади, використовуючи інший орієнтир. Але справа в тому, що JavaScript відбувається досить швидко . Ні, це не C або C ++, і це не намагається бути. Але добре не зациклюватися на ментальному розумінні "інтерпретована мова == повільний", оскільки для будь-якого завдання нетривіальної складності продуктивність буде мати значення більше щодо розробки алгоритму і менше до вибору мови.

Я насправді збирався написати все це в коментарі, але мені не вистачило місця.


1

Так, це може бути побудовано на javascript, перевірте такі проекти, як ASM.js, які отримують майже вдвічі меншу швидкість, ніж C. Якщо ви подбаєте про декілька ядер (за допомогою веб-службовців), це може бути навіть швидше, ніж DF (з точки зору ресурсів) , який зараз є монокор.

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