À quel point voulez-vous être précis? Un bon choix mais complexe serait de simuler toute cette histoire:
- Générez une liste de régions aléatoires et des contiguïtés entre ces régions.
- Générez des civilisations aléatoires avec des caractéristiques telles que la population, la belligérance, la technologie ... et peuplez les régions.
- Simulez autant d'années d'histoire que vous le souhaitez, en déterminant les résultats en fonction des caractéristiques de la civilisation.
Par exemple: deux civilisations belligérantes adjacentes ont une probabilité plus élevée de déclencher une guerre l'une contre l'autre, ce qui entraîne une diminution de la population au fil du temps. Les civilisations marchandes ont des ressources plus élevées, mais sont une grande cible pour les invasions. Les populations très peuplées croîtront plus rapidement mais auront également plus de risques de faim. Les civs culturellement hétérogènes ont moins de risques de guerres internes (ce qui pourrait conduire à des ruptures.) Et ainsi de suite ... Les résultats modifieraient également les caractéristiques de la civilisation: une technologie plus élevée conduit à un meilleur commerce, à des armes plus fortes, etc.
Cela permet également une narration procédurale: vous pouvez générer non seulement un diagramme de territoire, mais également des descriptions textuelles de l'histoire à travers le temps. Vous pouvez rendre ce système aussi complexe que vous le souhaitez.
EDIT: le défi ici n'est pas d'ordre technique, mais d'ajuster l'heuristique pour une génération d'histoire réaliste et intéressante. Regardez de plus près et pensez aux 3 points susmentionnés ... c'est à peu près votre explication technique! Traduisez-le en boucle (chaque itération peut représenter autant de temps que vous le souhaitez, 1 an, 6 mois, 1 mois ...) et c'est tout. Vous devrez travailler les éléments internes (structures de données, heuristiques) et l'adapter à votre problème et à vos besoins spécifiques. C'est la partie difficile ici et personne ne peut vous aider, car il s'agit d'imagination, d'essais et d'erreurs.
Il n'y a pas de structures de données communes pour ce problème en dehors de celles que vous utiliserez pour presque tous les problèmes: listes, files d'attente, arbres ... et ceux-ci seront liés pour votre implémentation spécifique (ai-je besoin d'un arbre généalogique? Une liste des civilisations à la guerre? une file de tâches pour chaque civ??) Bien sûr, vous avez besoin d'une liste de civilisations aussi. Les choix sont évidents et relèvent à peu près du bon sens.
La simulation est une question de hasard / probabilité et vous pouvez la réaliser de mille manières différentes avec des nombres aléatoires. Pensez à tout autre jeu où la simulation est impliquée, comme les managers de football, les RPG (après tout, les points de vie / statistiques ne sont que de la simulation de combat ), des jeux de stratégie ... Ce ne sont que des caractéristiques (vous aurez donc besoin d'un moyen de stocker les caractéristiques et les données de la civilisation) et des résultats aléatoires statistiquement basés sur eux (vous devrez donc changer aléatoirement l'état de simulation en fonction de ces caractéristiques.)
C'est l'essence de votre algorithme: l'heuristique difficile à ajuster: comment répartir les caractéristiques au début de la simulation pour chaque civilisation et comment changer statistiquement l'état de simulation en fonction de celles-ci.
En bref: votre algorithme est juste une boucle allant du temps simulé avec tout incrément souhaité. Des incréments plus courts conduisent à une simulation historique plus fine, mais prendront évidemment plus de temps. Dans votre boucle, il y aura un tas d'heuristiques comme (à peu près):
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()
Après tout ce travail (ou pendant si vous ne voulez pas stocker les données), vous devez interpréter tout l'état de simulation dans un format lisible par l'homme comme du texte, des images ou tout ce que vous désirez. Il s'agit également d'essais et d'erreurs et très spécifique pour votre implémentation.
Spécifique à votre question: pour générer un diagramme comme celui de votre question, vous devrez suivre les régions du monde (haut du diagramme, axe x, c'est le point 1: générer la liste des régions dans ma réponse) et leurs civilisations (couleurs dans le diagramme, point 2 ) à travers le temps (axe y, la boucle de simulation au point 3. )
Machines d'étatsont assez bons pour simuler des sujets généraux (l'exemple de code ci-dessus est une approximation d'une machine d'état codée en dur) - vous pouvez donc commencer par implémenter un cadre de machine d'état simple qui est globalement facile à modifier. Chaque civilisation commencerait avec une de ces machines d'état et la simulation exécuterait chaque machine d'état pour chaque tour. Chaque machine d'État devrait pouvoir interagir avec une autre machine d'État: par exemple, le déclenchement d'une guerre affecterait la machine d'État d'une autre civilisation, avec éventuellement des résultats différents en fonction de leur état interne - par exemple, s'ils sont dans un état de «famine», ils seraient probablement veulent négocier la paix, mais une civilisation «à la recherche de problèmes» riposterait probablement. Chaque état de la machine aurait des effets significatifs sur la civilisation » s les paramètres décrits ci-dessus au cours de chaque «cadre» (richesse, belligérance, population, etc.). Plus important encore, vous n'avez pas besoin de transitionner les états sur chaque image - juste au moment où l'opportunité et / ou le hasard se présentent: cela permet à des événements prolongés (comme la guerre) de se produire.