Menghitung hasil pertempuran dua pasukan

20

Saya memprogram permainan strategis menggunakan Flash. Gimnya bekerja sangat mirip dengan gim terkenal "Travian".

Masalah saya adalah sebagai berikut: Saya mencoba untuk membuat perhitungan pasukan yang hilang sebagai akibat dari pertarungan antara dua pasukan. Kedua pasukan memiliki tipe unit yang berbeda. Beberapa dari mereka lebih kuat terhadap beberapa unit lain dan lebih lemah terhadap tipe lainnya.

Bagaimana saya bisa menempatkan efek dari perbedaan ini dalam persamaan pertarungan?

Tampaknya mudah jika mereka hanya memiliki poin att dan def saja, tetapi ketika itu tergantung pada tipe ketergantungan unit, saya tersesat.

Ali Albahrani
sumber
6
Haruskah hasil pertempuran Anda murni deterministik atau Anda ingin menggunakan semacam keacakan?
sum1stolemyname
4
Saya tidak berpikir itu harus ditandai sebagai permainan multi-pemain karena itu tidak diberikan oleh OP-itu bisa menjadi manusia vs AI. Dan dengan 'type dependency', apakah kita berbicara tentang rock-> scissors-> paper-> rock type yang klasik?
Bebek Komunis

Jawaban:

10

Selain mendukung saran Amit untuk melihat persamaan Lanchester, saya hanya ingin menambahkan bahwa ini adalah keputusan desain game, bukan fakta empiris yang dapat kami berikan kepada Anda. Jika Anda ingin mempertimbangkan tipe unit, Anda harus memutuskan apa artinya itu. Ini berarti memilih persamaan yang mencakup semua faktor yang Anda ingin gameplay Anda sertakan. Jika Anda ingin infanteri lebih baik daripada kavaleri, maka Anda harus memutuskan apa artinya - mis. Berapa banyak kavaleri yang Anda butuhkan untuk menyamai 100 infantri? Dan apakah penting siapa yang menyerang siapa? Anda tampaknya menyiratkan bahwa hanya memberikan nilai serangan dan pertahanan yang berbeda pada infantri dan kavaleri tidak cukup baik - mengapa demikian? Apa lagi yang ingin Anda wakili yang tidak bisa ditangkap hanya dengan nilai-nilai itu?

Anda harus memutuskan faktor mana yang ingin Anda modelkan dalam gim Anda, karena mereka memengaruhi cara pemain akan mendekatinya. Ini mungkin termasuk ukuran unit / kuantitas, tipe unit, pengalaman unit (mis. Status veteran), medan dan efek lingkungan, perbedaan antara menyerang dan bertahan jika ada, apakah memodelkan kerusakan dan gesekan atau tidak, apakah memodelkan berlalunya waktu selama pertempuran, kemampuan untuk menarik atau melarikan diri (mungkin termasuk pemodelan moral), seberapa banyak keacakan yang Anda inginkan dalam persamaan, dan sebagainya.

Setelah Anda mengetahui semua ini, ada beberapa pendekatan matematika dasar yang dapat Anda ambil. Anda dapat melakukan sistem "kesempatan untuk memukul" satu demi satu seperti yang dimiliki banyak RPG, misalnya. sistem pertempuran d20. Anda bisa melakukan sistem undian koin berbobot "serang vs pertahanan" satu putaran seperti permainan Peradaban asli. Anda bisa meminta masing-masing pihak membuat skor dengan menambahkan atribut ke nomor acak dan siapa pun yang mendapat nilai tertinggi akan menang. Dan Anda dapat mengubah sistem ini untuk bekerja pada basis per putaran, atau untuk mengurangi poin hit atau poin moral, atau apa pun. Sistem apa pun bisa berfungsi, tetapi Anda harus menyeimbangkannya seperti yang Anda inginkan. Karena pada akhirnya pilihan bagaimana membuat model pertempuran adalah bagian kunci dari desain gim, dan bukan sesuatu yang bisa diberikan orang lain kepada Anda.

Kylotan
sumber
Anda benar-benar Kylotan. Saya punya beberapa ide tentang pertarungan sebelum memulai desain game. Namun, saya memposting pertanyaan ini menanyakan apakah ada cara yang lebih baik untuk mendesainnya dan mencari tahu apa cara terbaik untuk mengimplementasikannya. Saya menang pada kedua tujuan, saya kira :) Teman saya, bisakah Anda memberi tahu saya di mana saya dapat menemukan informasi lebih lanjut tentang pendekatan matematika itu? Juga, jika saya menjawab semua pertanyaan yang Anda tanyakan tentang memilih sistem, dapatkah Anda memberi tahu saya mana yang paling cocok untuk kasus saya? Terima kasih banyak atas waktu Anda :)
Ali Albahrani
Saya tidak bisa memberi tahu Anda mana yang terbaik, tetapi Anda mungkin harus mulai dengan yang sederhana dan memperbaikinya jika perlu. Travian tampaknya memiliki serangan sederhana vs. sistem pertahanan, dengan 2 tipe unit (infantri dan kavaleri) dan 2 skor pertahanan per unit yang sesuai. Cara mudah untuk menyelesaikan pertempuran, seperti yang digunakan dalam Civilization 1, adalah dengan membagi skor serangan penyerang dengan totalnya ditambah skor pertahanan bek. Ini memberi Anda persentase. Sekarang pilih angka acak antara 0 dan 100 persen. Jika lebih rendah dari skor serangan penyerang, penyerang menang. Kalau tidak, para pembela akan menang.
Kylotan
15

Untuk Solar Realms Elite, saya terinspirasi oleh Lanchester's Equations untuk memodelkan peperangan . Saya memiliki beberapa perkelahian simultan di setiap putaran pertempuran.

Dalam pertarungan pertama, semua orang menyerang tentara. Di SRE tentara paling baik melawan tentara (itu bukan gunting kertas batu, tetapi infanteri, serangan udara, dan ruang angkasa). Saya membuat serangan dan kekuatan pertahanan di mana tentara memiliki serangan terbaik:

attack_strength = 3*soldiers + 1*fighters + 2*cruisers
defense_strength = 10*soldiers

Dalam pertarungan kedua, semua orang menyerang stasiun pertahanan. Di SRE, pejuang (udara) paling baik melawan stasiun pertahanan (mis. Anti-pesawat):

attack_strength = 1*soldiers + 4*fighters + 2*cruisers
defense_strength = 25*defense_stations

Di pertarungan ketiga, semua orang menyerang kapal penjelajah berat. Di SRE, penjelajah berat ada di luar angkasa dan paling baik melawan penjelajah berat lainnya:

attack_strength = 1*soldiers + 1*fighters + 10*cruisers
defense_strength = 15*cruisers

(Saya tidak ingat konstanta apa yang saya gunakan; itu hanya contoh.) Dalam setiap putaran pertempuran, penyerang akan kehilangan sebagian kecil dari kekuatan pertahanan dan para pembela akan kehilangan sebagian kecil dari kekuatan serangan. Saya percaya ini sesuai dengan Hukum Lapangan Lanchester (persamaan di sini ). Saya telah menambahkan keacakan tetapi saya tidak ingat persis di mana. Setelah setiap putaran pertempuran, pasukan akan lebih kecil. Saya memberi batas maksimum pada jumlah putaran; setelah itu, pihak yang kalah akan mundur.

Itu tidak realistis untuk memiliki infanteri di lapangan menembakkan ke ruang angkasa, tetapi itu bekerja lebih baik untuk alasan gameplay untuk memiliki semua unit dapat melawan semua unit lainnya (dengan mengurangi efektivitas).

amitp
sumber
12

Saya cenderung mengatakan 'jika Anda tidak dapat menemukan solusi eksplisit, carilah solusi implisit'. Anda bisa mensimulasikan pertempuran secara internal sampai satu pasukan dihancurkan atau mundur (tergantung pada hasil permainan Anda).

Saya akan menggunakan sesuatu seperti ini:

Untuk setiap iterasi pertempuran, semua unit bersifat oportunistik, sehingga mereka mencoba melakukan kerusakan paling besar yang mereka bisa. Setiap unit memilih unit musuh yang akan diserang di babak ini, berdasarkan kelebihan / kekurangan yang diketahui.

Kemudian, semua subfight dilakukan. Sebuah contoh:

Biarkan spearman menjadi efektif melawan kavaleri, cavalaray efektif melawan pemanah dan pemanah efektif melawan spearman.

Dalam pertarungan antara dua pasukan yang terdiri dari kedua jenis unit dasar ini, semua spearman akan menyerang kavaleri, semua unit kavaleri akan menyerang pemanah dan semua pemanah akan menyerang spearman. Jika misalnya satu sisi tidak memiliki pemanah, sisi kavaleri yang lain akan memilih jenis target terbaik berikutnya (menjadi unit kavaleri musuh)

Setiap unit unit-serangan-unit diselesaikan secara terpisah, dengan unit yang kalah rusak atau ditandai sebagai dihancurkan.

Setelah semua perkelahian individu terselesaikan, pindahkan semua unit yang telah secara kritis dihancurkan atau dihancurkan.

Iterasi berikutnya mulai menggunakan tentara yang sekarang berkurang.

sum1stolemyname
sumber
Sangat setuju dengan postingan ini. Lebih baik untuk beralih melalui pertempuran daripada menguranginya menjadi satu persamaan. Dan saya pasti akan menambahkan sedikit keacakan untuk itu. Seharusnya ada peluang yang sangat kecil sehingga bek lemah menggulung tinggi dan skor kritis. Keuntungan lain dari iteratif adalah Anda dapat membuat narasi acara untuk menunjukkan kepada pemain. "Para pendekar pedang menyerang dan segera membinasakan para bujang, tetapi kemudian petugas pengadilan tiba dan ..."
Tim Holt
Saya sangat menyukai jawaban Anda, dan saya pikir saya akan menerapkannya dengan acak :)
Ali Albahrani
3

Saya sedang menguji coba gim yang saat ini merupakan versi sederhana dari Solar Realms ( Star Empire Elite ), dan saya mulai dengan menggunakan sesuatu yang mirip dengan persamaan Amit (di atas). Secara khusus, saya menyukai gagasan memiliki tiga fase untuk pertempuran, di mana Anda harus memenangkan dua dari tiga. Tetapi saya juga ingin memperkenalkan unsur keacakan dalam pertempuran, dan untuk itu saya dipengaruhi oleh beberapa permainan meja.

Pemrosesan adalah masalah jika gim ini ingin berkembang, jadi saya tidak ingin mengikuti metode yang disarankan oleh sum1stolemyname di atas, meskipun jika gim Anda menggunakan klien untuk memproses hasilnya, sebagai lawan dari server, ini tampaknya menjadi pendekatan yang bagus.

Saya memutuskan untuk memecah pertempuran menjadi dua fase (analog dengan tiga dalam model Amit): udara dan darat. Saya menghitung serangan dan mempertahankan kekuatan, dan menyesuaikan kekuatan serangan ke bawah dengan pecahan (untuk memberi bek keuntungan). Pada saat itu, jika kekuatan serangan dan kekuatan pertahanan sama, serangan itu memiliki peluang kemenangan 50%. Dari sana, saya menyesuaikan persentase peluang kemenangan naik atau turun berdasarkan pada seberapa banyak (atau kurang) kekuatan penyerang telah dibandingkan dengan bek. Berikut ini beberapa persamaan sederhana untuk udara:

air_attack_strength = 1 * soldiers + 10 * fighters
air_defence_strength = 2 * soldiers + 25 * stations

differential = (air_attack_strength - air_defence_strength) * constant

chance_of_victory = 50 - differential

Saya menetapkan bahwa chance_of_victory tidak akan pernah lebih besar dari 80 atau kurang dari 5. Dari sana, saya hanya menghasilkan angka acak dari 100, dan kemudian meneruskan hasil itu ke pertempuran darat.

Satu hal yang belum saya selesaikan untuk kepuasan saya adalah tingkat korban. Tapi saya berpikir bahwa cara yang baik untuk mencari tahu ini adalah dengan membandingkan chance_of_victory dengan angka acak yang dihasilkan, dan menggunakannya untuk mengambil sebagian kecil dari pasukan yang menyerang-menyerang sebagai korban.

Robert Yogurt
sumber