Насколько точным ты хочешь быть? Хороший, но сложный выбор будет моделировать всю эту историю:
- Создайте случайный список регионов и смежности между этими регионами.
- Создайте случайные цивилизации с такими характеристиками, как население, воинственность, технологии ... и заселите регионы.
- Смоделируйте столько лет истории, сколько хотите, определяя результаты на основе характеристик цивилизации.
Например: две соседние воюющие цивилизации имеют более высокую вероятность начала войны друг с другом, что приводит к снижению численности населения с течением времени. Торговые цивилизации имеют более высокие ресурсы, но являются отличной целью для вторжений. Густонаселенные будут расти быстрее, но также имеют больше шансов голода. Культурно-неоднородные цивилизации имеют меньшую вероятность внутренних войн (что может привести к распадам). И т. Д. Результаты также изменят характеристики цивилизации: более высокие технологии ведут к лучшей торговле, более сильному оружию и т. Д.
Это позволяет также использовать некоторые процедурные повествования: вы можете выводить не только диаграмму территории, но и текстовые описания истории на протяжении всего времени. Вы можете сделать эту систему настолько сложной, насколько захотите.
РЕДАКТИРОВАТЬ: задача здесь не техническая, а корректировка эвристики для реалистичной и интересной генерации истории. Присмотритесь поближе и подумайте о трех вышеупомянутых моментах ... это в значительной степени ваше техническое объяснение! Переведите это в цикл (каждая итерация может представлять столько времени, сколько вы хотите, 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 ) через время (ось у, цикл моделирования в точке 3 )
Государственные машиныдовольно хорошо имитируют широкие темы (пример кода выше является приближением к жестко запрограммированному конечному автомату), поэтому вы можете начать с реализации простой структуры конечного автомата, которую в целом легко настроить. Каждая цивилизация начиналась с одного из этих конечных автоматов, и симуляция запускала каждый конечный автомат для каждого хода. Каждый конечный автомат должен был бы иметь возможность взаимодействовать с другим конечным автоматом: например, начало войны повлияет на конечный автомат другой цивилизации, возможно, с различными результатами, основанными на их внутреннем состоянии - например, если они находятся в состоянии «голода», они, вероятно, будут Я хочу договориться о мире, но цивилизация, «ищущая проблемы», скорее всего, отомстит. Каждое состояние в машине будет иметь существенное влияние на цивилизацию » s метрики, обозначенные выше в каждом «кадре» (богатство, агрессивность, население и т. д.). Самое главное, что вам не нужно переходить в каждом кадре - именно тогда, когда появляется возможность и / или случайный шанс: это позволяет происходить длительным событиям (таким как война).