Jak dokładny chcesz być? Dobrym, ale złożonym wyborem byłaby symulacja całej tej historii:
- Wygeneruj losową listę regionów i przylegania między tymi regionami.
- Generuj losowe cywilizacje o cechach takich jak populacja, wojowniczość, technologia ... i zaludnij regiony.
- Symuluj tyle lat historii, ile chcesz, określając wyniki na podstawie cech cywilizacji.
Np .: dwie sąsiadujące ze sobą wojujące cywilizacje mają większe prawdopodobieństwo rozpoczęcia wojny między sobą, co z czasem prowadzi do zmniejszenia populacji. Cywilizacje kupieckie mają większe zasoby, ale są doskonałym celem inwazji. Te bardzo zaludnione będą rosły szybciej, ale także będą miały większe szanse na głód. Kulturowo heterogeniczne cywilizacje mają mniejszą szansę na wojny wewnętrzne (co może prowadzić do rozpadu). I tak dalej ... Wyniki zmodyfikowałyby również cechy cywilizacyjne: wyższa technologia prowadzi do lepszego handlu, silniejszej broni itp.
Pozwala to również na pewne proceduralne opowiadanie historii: możesz wygenerować nie tylko schemat terytorium, ale także tekstowe opisy historii w czasie. Możesz uczynić ten system tak złożonym, jak chcesz.
EDYCJA: wyzwanie nie jest techniczne, ale dostosowuje heurystykę do generowania realistycznej i interesującej historii. Przyjrzyj się bliżej i pomyśl o 3 wyżej wymienionych punktach ... to właściwie twoje techniczne wyjaśnienie! Przetłumacz go na pętlę (każda iteracja może reprezentować tyle czasu, ile chcesz, 1 rok, pół roku, 1 miesiąc ...) i to wszystko. Będziesz musiał pracować wewnątrz (struktury danych, heurystyka) i dostosować go do konkretnego problemu i potrzeb. To jest trudna część i nikt nie może ci pomóc, ponieważ dotyczy wyobraźni, próby i błędu.
Nie ma wspólnych struktur danych dla tego problemu poza tymi, których będziesz używać do prawie każdego problemu: listy, kolejki, drzewa ... i będą one powiązane dla twojej konkretnej implementacji (czy potrzebuję drzewa genealogicznego? Listy cywilizacji na wojnie - kolejka zadań dla każdego miasta?) Oczywiście potrzebujesz również listy cywilizacji. Wybory są oczywiste i mają zdrowy rozsądek.
Symulacja jest kwestią przypadku / prawdopodobieństwa i można ją robić na tysiąc różnych sposobów z liczbami losowymi. Pomyśl o każdej innej grze, w której bierze udział symulacja, takiej jak menedżerowie futbolu, gry RPG (w końcu punkty wytrzymałości / statystyki to tylko symulacja walki ), gry strategiczne ... To tylko cechy (więc potrzebujesz sposobu na przechowywanie cech i danych cywilizacyjnych) i losowe wyniki na ich podstawie statystycznie (więc będziesz musiał losowo zmienić stan symulacji w oparciu o te cechy).
To jest istota twojego algorytmu: trudna do dostosowania heurystyka: jak rozdzielić cechy na początku symulacji dla każdej cywilizacji i jak statystycznie zmienić stan symulacji na ich podstawie.
W skrócie: twój algorytm jest po prostu pętlą obejmującą symulowany czas z dowolnym pożądanym przyrostem. Krótsze przyrosty prowadzą do dokładniejszej symulacji historycznej, ale oczywiście potrwają dłużej. Wewnątrz twojej pętli będzie kilka heurystyk takich jak (z grubsza):
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()
Po całej tej pracy (lub podczas, gdy nie chcesz przechowywać danych) musisz zinterpretować cały stan symulacji w formacie czytelnym dla człowieka, takim jak tekst, obrazy lub cokolwiek chcesz. Jest to również próba i błąd, bardzo specyficzna dla twojej implementacji.
Specyficzne dla twojego pytania: aby wygenerować diagram podobny do tego w swoim pytaniu, musisz śledzić regiony świata (góra diagramu, oś x, to jest punkt 1: wygeneruj listę regionów w mojej odpowiedzi) i ich cywilizacje (kolory w wykres, punkt 2 ) w czasie (oś y, pętla symulacyjna w punkcie 3 ).
Maszyny stanowesą całkiem dobre w symulowaniu szerokich tematów (powyższy przykład kodu jest przybliżeniem zakodowanej na stałe maszyny stanów) - więc możesz zacząć od wdrożenia prostej struktury maszyny stanów, która jest ogólnie łatwa do poprawienia. Każda cywilizacja zaczynałaby się od jednej z tych maszyn stanowych, a symulacja prowadziłaby każdą maszynę stanową dla każdej tury. Każda machina stanu musiałaby być w stanie współdziałać z inną machiną stanu: na przykład zainicjowanie wojny wpłynęłoby na machinę stanu innej cywilizacji, prawdopodobnie z różnymi skutkami opartymi na ich stanie wewnętrznym - np. Gdyby były w stanie „głodu”, prawdopodobnie chcą negocjować pokój, ale cywilizacja „szukająca kłopotów” prawdopodobnie zemściłaby się. Każdy stan w maszynie miałby znaczący wpływ na cywilizację ” wskaźniki przedstawione powyżej podczas każdej „ramki” (bogactwo, wojowniczość, ludność itp.). Co najważniejsze, nie musisz zmieniać stanów na każdej klatce - tylko wtedy, gdy pojawi się okazja i / lub przypadkowa szansa: pozwala to na wystąpienie długich wydarzeń (takich jak wojna).