Наскільки точним ви хочете бути? Хорошим, але складним вибором було б імітувати всю цю історію:
- Створіть випадковий список регіонів та суміжності між цими регіонами.
- Породжуйте випадкові цивілізації з такими характеристиками, як населення, войовничість, технології ... та заселяйте регіони.
- Моделюйте стільки років історії, скільки хочете, визначаючи результати, виходячи з цивілізаційних особливостей.
Наприклад: дві сусідні войовничі цивілізації мають більшу ймовірність розпочати війну одна з одною, що призводить до зменшення кількості населення з часом. Торговельні цивілізації мають більший ресурс, але є чудовою ціллю для вторгнень. Сильно заселені люди будуть рости швидше, але також мають більше шансів на голод. Культурно-неоднорідні громадяни мають менший шанс внутрішніх воєн (що може призвести до зривів.) І так далі ... Результати також змінять цивілізаційні характеристики: вища технологія призводить до кращої торгівлі, міцнішої зброї тощо.
Це дозволяє і деякі процедурні розповіді: ви можете виводити не лише територіальну діаграму, а й текстові описи історії, що минули. Ви можете зробити цю систему такою складною, як вам захочеться.
EDIT: виклик тут не технічний, а коригування евристики для створення реалістичної та цікавої історії. Погляньте уважніше і подумайте про 3 вищезгадані моменти ... це вже майже ваше технічне пояснення! Перекладіть його на цикл (кожна ітерація може представляти стільки часу, скільки вам потрібно, 1 рік, півроку, 1 місяць ...) і все. Вам доведеться попрацювати з внутрішніми (структурами даних, евристикою) та адаптувати їх до вашої конкретної проблеми та потреб. Тут важка частина, і ніхто не може вам допомогти, адже мова йде про уяву, пробу та помилки.
Немає загальних структур даних для цієї проблеми, окрім тих, які ви будете використовувати майже для будь-якої проблеми: списки, черги, дерева ... і вони будуть прив'язані для вашої конкретної реалізації (мені потрібен генеалогічний дерево? Список цивілізацій на війні - черга завдань для кожного громадянина?) Звичайно, вам потрібен і список цивілізацій. Вибір очевидний і в значній мірі здоровий глузд.
Моделювання - це питання випадковості / ймовірності, і ви можете зробити це тисячею різних способів із випадковими числами. Подумайте про будь-яку іншу гру, в якій беруть участь симулятори, наприклад футбольні менеджери, RPG (зрештою, точки удару / статистика - це лише бойове моделювання ), стратегічні ігри ... Це просто характеристики (тому вам знадобиться спосіб зберігання цивілізаційних характеристик та даних) і випадкові результати статистично засновані на них (тому вам доведеться випадково змінювати стан моделювання на основі цих характеристик.)
У цьому суть вашого алгоритму: важко відрегулювати евристику: як розподілити характеристики на початку моделювання для кожної цивілізації та як статистично змінити стан імітації на їх основі.
Коротше кажучи: ваш алгоритм - це лише цикл, що змінює модельований час з будь-яким потрібним збільшенням. Коротші прирости призводять до більш точного історичного моделювання, але, очевидно, триватиме більше часу. Всередині вашого циклу буде купа евристики на кшталт (приблизно):
for each civilization
if civ.isAtWar
civ.population -= civ.population * 0.05;
civ.wealth -= 1000.0;
civ.belligerence += 1.0;
if civ.population < 100
civ.negotiatePeace()
Після всієї цієї роботи (або під час, якщо ви не хочете зберігати дані), ви повинні інтерпретувати все стан імітації у форматі, прочитаному людиною, як текст, зображення чи все, що завгодно. Це також проба та помилка і дуже специфічні для вашої реалізації.
Характерне для вашого питання: щоб створити діаграму, подібну до тієї, у вашому питанні, вам доведеться відслідковувати регіони світу (вгорі діаграми, вісь x, це точка 1: генеруйте список регіонів у моїй відповіді) та їх цивілізації (кольори в діаграма, точка 2 ) через час (вісь y, цикл моделювання в точці 3 ).
Державні машинидуже добре моделюють широкі теми (приклад коду вище - це наближення жорстко закодованої машини) - тому можна почати з впровадження простої рамки державної машини, яку загалом легко налаштувати. Кожна цивілізація починалася б з однієї з цих державних машин, і симуляція запускала б кожну державну машину на кожен крок. Кожна державна машина повинна мати можливість взаємодіяти з іншою державною машиною: наприклад, ініціювання війни вплине на іншу цивілізаційну державну машину, можливо, з різними результатами залежно від їх внутрішнього стану - наприклад, якщо вони перебувають у стані "голоду", вони, ймовірно, хочу домовитись про мир, але цивілізація, яка "шукає неприємностей", швидше за все, помститься. Кожна держава в машині мала б значущий вплив на цивілізацію " s викладені вище показники під час кожного "кадру" (багатство, войовничість, кількість населення тощо). Найголовніше, що вам не потрібно перехідних станів на кожному кадрі - саме тоді, коли виникає можливість та / або випадковий шанс: це дозволяє тривати подовжені події (як війна).