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.)
algorithm
javascript
random
jcora
sumber
sumber
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.Jawaban:
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.
Ini adalah contoh otomatisasi seluler dan apa yang dapat mereka hasilkan. Pada dasarnya saya akan membuat aturan untuk berbagai ras. Beberapa contoh aturan adalah:
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:
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.
sumber
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.
sumber
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.
sumber