Bagaimana cara kerja algoritma pembuatan riwayat?

19

Saya mendengar tentang game Dwarf Fortress, tetapi hanya sekarang salah satu dari orang yang saya ikuti di Youtube membuat komentar tentang itu ... Saya sangat terkejut ketika saya melihat bagaimana Dwarf Fortress sebenarnya menghasilkan sejarah bagi dunia!

Sekarang, bagaimana cara kerja algoritma ini? Apa yang biasanya mereka ambil sebagai input, kecuali panjang simulasi? Seberapa spesifik mereka?

Dan yang lebih penting; dapatkah ini dibuat dalam Javascript, atau apakah Javascript terlalu lambat? (Saya kira ini tergantung pada kedalaman simulasi, tetapi ambil Dwarf Fortress sebagai contoh.)

jcora
sumber
3
"Bisakah mereka dibuat dalam Javascript?" Jawabannya jelas ya, tetapi itu tergantung pada seberapa cepat Anda menginginkan hasilnya dan seberapa rumit Anda ingin hasilnya. Dwarf Fortress juga memakan waktu cukup lama - dan melambat seiring dengan berlalunya usia dunia! Jadi, selama Anda menginginkan riwayat yang dangkal, ya Anda bisa melakukannya dalam Javascript, jadi itu tergantung pada seberapa kompleks Anda ingin sejarah itu.
doppelgreener
2
Maksudnya "pada tingkat Benteng Dwarf", seperti dalam skala.
MichaelHouse
2
@Bane Ya, maksud saya Anda dapat mengubah berapa banyak riwayat di DF. Ketika Anda memulai sebuah dunia, pertama-tama ia secara acak menghasilkan medan dan kemudian mulai menua dunia di depan mata Anda dan menghasilkan sejarah saat berjalan. Anda menyaksikannya ketika kekaisaran meluas dan menyusut, ketika medan berubah, ketika hutan tumbuh dan surut, ketika daerah menjadi berhantu (atau tidak lagi berhantu), dan sebagainya. Ini berkembang dari tahun ke tahun (atau beberapa tahun pada suatu waktu) di depan mata Anda. Ini terus berlangsung sampai Anda menyuruhnya berhenti. Semakin jauh Anda semakin lambat mendapatkan generasi (karena penggunaan CPU, bukan mekanik game).
doppelgreener
1
Untuk menjadi sangat jelas: semakin tua dunia, semakin lambat setiap tahun untuk menghitung. Di dunia muda, ia akan tergesa-gesa selama beberapa tahun pertama, di dunia yang berusia ratusan tahun, tahun berikutnya bisa membutuhkan satu detik atau beberapa detik untuk menghasilkan.
doppelgreener
1
Oh, itu, saya tahu. Dengan "mendalam", saya tidak bermaksud jumlah tahun, maksud saya jumlah peristiwa yang terjadi, dan ketepatan simulasi. Anda hanya dapat menyimpan sejumlah orang yang dimiliki kerajaan, atau Anda dapat benar-benar memiliki kelas yang disebut Person, yang melakukan tugas, pergi ke tentara, dll. Dangkal akan membiarkan ukuran kerajaan menentukan hasil pertempuran, tetapi yang dalam akan membuat setiap prajurit bertarung demi dirinya sendiri.
jcora

Jawaban:

27

Pertama, ada beberapa petunjuk bagi generasi sejarah tentang Dwarf Fortress. Seseorang bertanya di forum Bay12 beberapa waktu lalu, dan transkrip dibagikan dan Anda dapat menemukan di mana diskusi dimulai dengan mencari: "topik kita hari ini adalah generasi dunia dan generasi sejarah".


Saya tidak tahu persis bagaimana Dwarf Fortress melakukannya, tetapi saya akan menjelaskan bagaimana saya berencana menerapkan konsep pertama yang sangat mendasar dalam permainan saya. Saya akan menggunakan automata seluler sederhana . Jika Anda melihat melalui prototipe Spore ini , seperti kultur sel dan bioma.

masukkan deskripsi gambar di sini

Ini adalah contoh otomatisasi seluler dan apa yang dapat mereka hasilkan. Pada dasarnya saya akan membuat aturan untuk berbagai ras. Beberapa contoh aturan adalah:

  • Permusuhan mereka terhadap ras lain
  • Preferensi iklim mereka
  • Persyaratan sumber daya mereka
  • Tingkat kelahiran dan masa hidup mereka
  • Keinginan mereka (penelitian teknologi, perdagangan, keberadaan yang damai, dominasi dunia)
  • Kemampuan mereka (pembangunan struktur, pengumpulan sumber daya, pembuatan perang, dll.)
  • Dan seterusnya...

Jadi, input yang paling penting untuk semua ini untuk bekerja adalah dunia untuk menjatuhkan ras ini. Medan akan menentukan preferensi dan perluasannya. Jadi, begitu Anda telah menghasilkan dunia, pilih lokasi acak di dunia tempat ras ini akan hidup dan biarkan longgar. Sekarang hal-hal menarik mulai terjadi. Sekarang Anda memiliki tanah dan ras dengan keinginan dan kemampuan, Anda dapat mulai membangun sejarah. Ras-ras ini mengumpulkan sumber daya, lalu struktur dibangun:

  • Kota-kota di daerah dengan sumber daya tinggi, dan layak huni
  • Jalan menghubungkan kota-kota besar.
  • Jembatan melintasi sungai.
  • Terowongan melalui gunung.
  • Benteng di dekat garis depan ekspansi dalam menanggapi pertempuran.

Setiap struktur dapat diserbu / ditaklukkan oleh ras lain. Semakin lama sebuah struktur (seperti kota atau benteng) ada dalam sejarah, semakin dapat dipertahankan, semakin sulit untuk mengambil alih. Dan yang lebih diinginkan adalah untuk ras yang menginginkan kontrol. Pertempuran dilancarkan di mana ras bertemu (setidaknya satu bermusuhan). Pertempuran dinamai berdasarkan landmark atau struktur di dekatnya, atau jika pertempuran itu signifikan atau landmark tidak bernama, landmark tersebut dinamai setelah pertempuran.

Jalan, jembatan dan terowongan diperluas melalui perdagangan dan transportasi sumber daya. Masing-masing memiliki throughput maksimum yang dapat meningkat dengan pengeluaran sumber daya. Membangun benteng batu di tengah padang rumput? Jalan-jalan itu akan digunakan untuk mengangkut batu yang dibutuhkan. Mereka akan menjadi lebih besar dan mendapatkan nama.

Bencana alam terjadi, mempengaruhi populasi dan perjalanan sejarah. Gempa bumi mungkin mengurangi kota menjadi reruntuhan atau runtuh terowongan. Banjir mungkin menghanyutkan jalan atau jembatan.


Ini tidak sedalam Dwarf Fortress, tapi ini awal. Sekarang seperti yang dapat Anda bayangkan, (dan seperti yang dikatakan Johnathan Hobbs), semakin banyak ras ini berkembang, semakin banyak sel yang disimulasikan. Tidak hanya lebih banyak sel yang disimulasikan, tetapi simulasi lebih kompleks karena sekarang ada struktur untuk membangun / mempertahankan, pertempuran untuk mendapatkan upah, perdagangan untuk ... perdagangan, dan sebagainya. Ini menjadi berat untuk bahasa apa pun. Javascript mungkin melambat lebih cepat. Namun, Anda selalu dapat mengorbankan kompleksitas untuk meningkatkan kecepatan.

Ini semua simulasi (walaupun rumit), Anda hanya merekam peristiwa penting di sepanjang jalan dan menyebutnya sejarah.

Saya juga baru saja menemukan posting forum Bay12 untuk orang-orang yang melakukan brainstorming bagaimana membuat generasi dunia Benteng Dwarf lebih cepat. Saya belum membacanya, tetapi mungkin memberikan beberapa petunjuk jika Anda pernah mengalami masalah dengan implementasi Anda terlalu lambat.

MichaelHouse
sumber
Luar biasa dan informatif seperti biasa, @ Byte56. :)
jcora
1
Terima kasih Bane. Mungkin tidak selalu, kebetulan saja orang bertanya, saya rasa saya tahu sesuatu. Terima kasih telah memberi saya kesempatan untuk memikirkannya lebih lanjut dan menulis sesuatu :)
MichaelHouse
4

Sama seperti titik samping, JavaScript tidak selambat yang Anda kira .

Pengembang peramban telah menghabiskan banyak waktu dan energi dalam mengoptimalkan mesin JavaScript mereka . Benchmark yang saya tautkan menunjukkan bahwa, di luar tugas yang dibandingan, di median, JavaScript hanya 5 kali lebih lambat daripada C , yang tidak bisa dikatakan untuk beberapa bahasa yang ditafsirkan lainnya. Dan batas bawah bahkan lebih mengesankan: setara dengan C .

Tentu saja, tolok ukur bahasa tidak terlalu berarti - Anda mungkin dapat menemukan contoh tandingan menggunakan tolok ukur yang berbeda. Tetapi intinya adalah bahwa JavaScript cukup cepat . Tidak, ini bukan C atau C ++, dan tidak mencoba untuk menjadi. Tetapi ada baiknya untuk tidak terjebak dalam pola pikir "interpreted language == slow", karena untuk tugas dengan kompleksitas nontrivial, kinerjanya akan lebih penting pada desain algoritma dan lebih sedikit pada pilihan bahasa.

Saya sebenarnya akan menulis semua ini dalam komentar, tetapi saya kehabisan ruang.

voithos
sumber
1

Ya, itu bisa dibangun di javascript, periksa proyek seperti ASM.js, yang mendapatkan kecepatan hampir 2x lebih lambat dari C. Jika Anda menangani beberapa inti (menggunakan pekerja web) itu bisa lebih cepat daripada DF (dalam hal sumber daya) , yang merupakan monocore sekarang.

pengguna29687
sumber