Seberapa akurat yang Anda inginkan? Pilihan yang baik tetapi kompleks akan mensimulasikan semua sejarah itu:
- Buat daftar wilayah acak dan kedekatan antara wilayah ini.
- Hasilkan peradaban acak dengan karakteristik seperti populasi, pertikaian, teknologi ... dan isi daerah.
- Simulasikan sebanyak mungkin sejarah yang Anda inginkan, tentukan hasil berdasarkan karakteristik peradaban.
Misalnya: dua peradaban berperang yang berdekatan memiliki kemungkinan yang lebih tinggi untuk memulai perang satu sama lain, yang mengarah ke populasi yang lebih rendah seiring waktu. Peradaban pedagang memiliki sumber daya yang lebih tinggi, tetapi merupakan target yang bagus untuk invasi. Penduduk yang padat akan tumbuh lebih cepat tetapi juga memiliki lebih banyak peluang kelaparan. Kaum sipil yang heterogen secara budaya memiliki kemungkinan perang internal yang lebih rendah (yang dapat menyebabkan perpecahan.) Dan seterusnya ... Hasil juga akan memodifikasi karakteristik peradaban: teknologi yang lebih tinggi mengarah pada perdagangan yang lebih baik, senjata yang lebih kuat, dll.
Hal ini memungkinkan untuk beberapa penceritaan prosedural juga: Anda dapat menghasilkan tidak hanya diagram wilayah, tetapi juga deskripsi tekstual sejarah selama ini. Anda dapat membuat sistem ini serumit yang Anda inginkan.
EDIT: tantangan di sini bukan tantangan teknis, tetapi menyesuaikan heuristik untuk generasi sejarah yang realistis dan menarik. Lihatlah lebih dekat dan pikirkan 3 poin yang disebutkan di atas ... itulah penjelasan teknis Anda! Terjemahkan ke dalam satu lingkaran (setiap iterasi dapat mewakili waktu sebanyak yang Anda inginkan, 1 tahun, setengah tahun, 1 bulan ...) dan hanya itu. Anda harus mengerjakan inner (struktur data, heuristik) dan menyesuaikannya dengan masalah dan kebutuhan spesifik Anda. Itu bagian yang sulit di sini dan tidak ada yang bisa membantu Anda, karena ini tentang imajinasi, coba-coba.
Tidak ada struktur data umum untuk masalah ini selain yang akan Anda gunakan untuk hampir semua masalah: daftar, antrian, pohon ... dan ini akan terikat untuk implementasi spesifik Anda (apakah saya memerlukan pohon silsilah? Daftar peradaban berperang? antrian tugas untuk setiap warga sipil?) Tentu saja Anda memerlukan daftar peradaban juga. Pilihannya jelas dan cukup masuk akal.
Simulasi adalah masalah kebetulan / probabilitas dan Anda dapat membuatnya seribu cara berbeda dengan angka acak. Pikirkan permainan lain yang melibatkan simulasi seperti manajer sepak bola, RPG (lagipula, hitpoint / statistik hanyalah simulasi pertempuran ), permainan strategi ... Itu hanya karakteristik (jadi Anda akan memerlukan cara untuk menyimpan karakteristik dan data peradaban) dan hasil acak berdasarkan statistik mereka (jadi Anda harus mengubah keadaan simulasi secara acak berdasarkan karakteristik ini.)
Itulah inti dari algoritme Anda: heuristik yang sulit disesuaikan: cara mendistribusikan karakteristik pada awal simulasi untuk setiap peradaban dan cara mengubah keadaan simulasi secara statistik berdasarkan pada mereka.
Singkatnya: algoritma Anda hanya satu putaran mulai waktu yang disimulasikan dengan kenaikan yang diinginkan. Peningkatan yang lebih pendek menyebabkan simulasi historis yang lebih baik, tetapi jelas akan memakan waktu lebih lama. Di dalam lingkaran Anda akan ada banyak heuristik seperti (kira-kira):
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()
Setelah semua pekerjaan ini (atau selama jika Anda tidak ingin menyimpan data), Anda harus menafsirkan semua keadaan simulasi ke dalam format yang dapat dibaca manusia seperti teks, gambar atau apa pun yang Anda inginkan. Ini juga trial and error dan sangat spesifik untuk implementasi Anda.
Khusus untuk pertanyaan Anda: untuk menghasilkan diagram seperti yang ada di pertanyaan Anda, Anda harus melacak wilayah dunia (di atas diagram, sumbu x, itulah poin 1: menghasilkan daftar wilayah dalam jawaban saya) dan peradaban mereka (warna dalam diagram, titik 2 ) melalui waktu (sumbu y, loop simulasi di titik 3. )
Mesin negaracukup pandai mensimulasikan topik luas (contoh kode di atas adalah perkiraan mesin negara yang dikodekan) - jadi Anda bisa mulai dengan menerapkan kerangka kerja mesin keadaan sederhana yang secara keseluruhan mudah untuk di-tweak. Setiap peradaban akan memulai dengan salah satu mesin negara ini dan simulasi akan menjalankan setiap mesin negara untuk setiap belokan. Setiap mesin negara harus dapat berinteraksi dengan mesin negara lain: misalnya memulai perang akan mempengaruhi mesin negara peradaban lain, mungkin dengan hasil yang berbeda berdasarkan keadaan internal mereka - misalnya jika mereka berada dalam keadaan 'kelaparan' mereka kemungkinan akan ingin menegosiasikan perdamaian, tetapi sebuah peradaban 'mencari masalah' kemungkinan akan membalas. Setiap negara di mesin akan memiliki efek yang berarti pada peradaban ' metrik yang diuraikan di atas selama setiap 'bingkai' (kekayaan, pertikaian, populasi, dll.). Yang paling penting Anda tidak perlu mengubah keadaan pada setiap frame - hanya ketika kesempatan dan / atau kesempatan acak muncul: ini memungkinkan peristiwa yang berkepanjangan (seperti perang) terjadi.