Gagasan untuk algoritme kerusakan serangan (bahasa tidak relevan)

8

Saya sedang mengerjakan permainan dan saya butuh ide untuk kerusakan yang akan terjadi pada musuh ketika pemain Anda menyerang. Jumlah total kesehatan yang dimiliki musuh disebut enemyHealth, dan memiliki nilai 1000. Anda memulai dengan senjata yang menghasilkan 40 poin kerusakan (dapat diubah). Pemain memiliki stat serangan yang dapat Anda tingkatkan, disebut playerAttack. Nilai ini dimulai pada 1, dan memiliki nilai maks 100 yang mungkin setelah Anda naikkan berkali-kali dan membuatnya semakin jauh ke dalam permainan. Jumlah kerusakan yang dilakukan senjata adalah memotong dan mengeringkan, dan mengurangi 40 poin dari total 1000 poin kesehatan setiap kali musuh terkena. Tapi apa yang playerAttackdilakukan adalah menambah nilai itu dengan persentase. Berikut adalah algoritma yang saya miliki sekarang. (Saya telah menghapus semua gui, kelas, dll. Dan memberikan variabel nama yang sangat maju)

double totalDamage = weaponDamage + (weaponDamage*(playerAttack*.05))
enemyHealth -= (int)totalDamage;

Ini tampaknya bekerja sangat baik untuk sebagian besar. Jadi saya statrted menguji beberapa nilai ...

//enemyHealth ALWAYS starts at 1000
weaponDamage = 50;
playerAttack = 30;

Jika saya menetapkan nilai-nilai ini, jumlah kerusakan yang dilakukan pada musuh adalah 125. Tampak seperti jumlah yang baik, jadi saya ingin melihat apa yang akan terjadi jika serangan pemain dimaksimalkan, tetapi dengan senjata awal terlemah.

weaponDamage = 50;
playerAttack = 100;

totalDamage berakhir menjadi 300, yang akan membunuh musuh hanya dalam beberapa serangan. Bahkan dengan seranganmu setinggi itu, aku tidak ingin senjata terlemah mampu membunuh musuh secepat itu. Saya berpikir untuk menambah pertahanan, tetapi saya merasa permainan akan kehilangan konsistensi dan menjadi tidak seimbang dalam jangka panjang. Mungkin algoritma yang dirancang dengan baik untuk pengubah pengurangan senjata akan bekerja untuk senjata tingkat rendah atau sesuatu seperti itu. Hanya perlu istirahat dari mencoba mencari cara terbaik untuk menyelesaikannya, dan mungkin seseorang yang memiliki pengalaman dengan permainan dan menjaga leveling konsisten dapat memberi saya beberapa ide / petunjuk.

Dillon
sumber
2
Saya pikir kita perlu lebih banyak informasi. Seberapa mudah untuk playerAttackmenaikkan stat ke 100? Mengingat ini adalah nilai maksimal, bukankah membunuh musuh dalam beberapa serangan saja pantas dilakukan? (Apakah musuh 1000-HP sesuatu yang akan Anda lihat di awal permainan? Musuh standar? Bos?)
Lee

Jawaban:

14

Jawaban yang diberikan oleh Grzegorz Sławecki sudah bagus, tetapi saya ingin menjelaskan alasan di balik metodenya dan memberi Anda alat untuk menyesuaikan solusi dengan kebutuhan gameplay Anda.

Parameter dari masalah ini adalah tingkat serangan pemain a , kerusakan senjata w , total kerusakan yang ditimbulkan dalam satu serangan d , kesehatan musuh H dan jumlah minimum serangan yang diperlukan untuk membunuh musuh, sebut saja n .

Jika Anda ingin pemain untuk membunuh dalam n hits, maka total kerusakannya d harus sedemikian rupa sehingga

(n-1) .d <H ≤ nd    atau dengan kata lain, n = ceil (H / d) .

d tergantung pada kerusakan senjata w dan pada tingkat serangan pemain a dan kita dapat mengharapkan senjata menjadi lebih baik ketika tingkat meningkat, jadi mari kita menulis d (a) dan w (a) bukan hanya d dan w . Musuh-musuh yang dihadapi pemain juga diharapkan menjadi lebih tangguh jadi, sekali lagi, H (a) . Ini semua adalah fungsi peningkatan seorang , dan Anda ingin mereka untuk memenuhi inequations di atas. Yang tidak diketahui dari masalahnya adalah fungsi. Anda menetapkan satu sebagai kendala, dan Anda menemukan yang lain. Anda memang memiliki derajat kebebasan, yang merupakan hal yang baik.

Jika saya memahami pertanyaan Anda dengan baik, Anda memiliki gameplay yang tepat dalam pikiran, dan gameplay ini terutama diwakili di sini oleh jumlah hit yang diperlukan untuk membunuh musuh, n (a) . Oleh karena itu, atur n (a) tergantung pada gameplay yang Anda impikan untuk gim dan kemudian temukan sisa variabel masalahnya . Inilah yang harus selalu Anda lakukan karena, seperti yang ditunjukkan pertanyaan Anda, upaya pertama Anda adalah mencoba algoritme yang menurut Anda mungkin dilakukan dan kemudian menyadari bahwa itu menghasilkan gameplay yang tidak diinginkan.

Anggaplah, misalnya, bahwa Anda ingin pemain harus memukul lebih banyak dan lebih banyak saat ia berkembang dalam permainan. Anda juga menginginkan itu, karena jumlah hit yang dibutuhkan meningkat, itu semakin sedikit dan semakin jarang, sehingga pemain menghabiskan bagian yang lebih lama dari permainan memukul 5 kali dari 2 kali. Seperti apa n (a) terlihat:

yang diinginkan n (a)

Fungsi yang digunakan adalah n (a) = ceil (2 / 3.sqrt (a)) .

Kami ingin H (a) / d (a) tetap berada dalam rentang nilai yang membuat n (a) memiliki nilai yang diinginkan dan karena n (a) = ceil (H (a) / d (a)) , rentang ini adalah persegi panjang berikut:

n (a) dan n (a) -1

dan H (a) / d (a) secara alami dapat diatur ke 2 / 3.sqrt (a) sehingga kita mendapatkan grafik berikut, dengan kurva merah menjadi H (a) / d (a) :

n (a), n (a) -1 dan H (a) / d (a)

Catatan: kita dapat dengan mudah menemukan H (a) / d (a) di sini karena kita tahu fungsi yang n (a) adalah langit-langit, tetapi jika spesifikasi kita untuk n kurang bagus, kita harus membuat fitting kita sendiri berfungsi menggunakan berbagai trik. Tidak semua masalah ini bagus!

Jadi kita ingin H (a) / d (a) menyerupai fungsi akar kuadrat yang disesuaikan dan kita tahu bahwa H dan d harus meningkatkan fungsi. Solusi sangat banyak. Sebagai contoh,

H (a) = a. 2 / 3.sqrt (a)    dan    d (a) = a

Solusi pertama untuk H dan d

Tapi kami ingin kerusakan dan HP musuh bertambah banyak sehingga ada angka besar dan mengesankan di akhir permainan, hanya untuk gaya, jadi kami malah mengatur

H (a) = a². 20 / 3.sqrt (a)    dan    d (a) = 10.a²

Solusi yang lebih baik untuk H dan d

Intinya, dan bagian yang terbaik, adalah ini: Anda tahu bahwa solusi Anda untuk masalah ( H (a) dan d (a) ) mematuhi spesifikasi ( n (a) ), sehingga Anda mendapatkan n yang sama (a) , tetapi Anda memiliki kebebasan. Anda tahu persis kebebasan yang Anda miliki, dan Anda bisa menggunakannya untuk menyesuaikan pengalaman. Anda harus selalu berusaha memberi diri Anda kebebasan seperti itu sambil memuaskan kebutuhan terpenting Anda, kapan pun memungkinkan.

Sekarang kita telah memilih kerusakan satu-hit d (a) , dan karena d (a) tergantung pada kerusakan senjata w (a) , kita dapat menggunakan d (a) sebagai spesifikasi kami dan mencoba menemukan w (a) ) yang memberi kita ini d (a) . Prinsipnya sama, masalahnya berbeda: kami ingin pemain menyebabkan lebih banyak kerusakan saat levelnya meningkat, bahkan dengan senjatanya tetap sama, dan kami juga ingin kerusakan meningkat ketika senjata itu sendiri menjadi lebih baik dan levelnya tetap sama.

Tapi apa pentingnya masing-masing faktor? Misalkan kita ingin level lebih penting daripada senjata: bagian yang lebih besar dari variasi d (a) = a² harus independen dari w (a) , misalnya dengan

w (a) = 22.sqrt (a)    dan, karenanya,    d (a) = (22.sqrt (a)). (10 / 22.a.sqrt (a)) = w (a). (10 / 22.a.sqrt (a))

Kami mendapatkan grafik berikut untuk w (a) ...

w (a)

... dan masih sama d (a) , karena kita lagi menemukan solusi yang dipatuhi spesifikasi , di sini d (a) , dan kami memiliki sifat-sifat yang disebutkan di atas dengan w dan sebuah kontribusi untuk kerusakan (kira kita melihat d sebagai fungsi dari a dan w : maka jika a diperbaiki dan kita memiliki variasi w dalam persamaan d (a, w) = a / 30.w , d masih akan menjadi fungsi yang meningkat dari w , dan hal yang sama berlaku juga jika Anda memperbaiki w dan membuat sebuah beragam).

Ini w (a) bisa memberi Anda nilai untuk ditampilkan dalam deskripsi ingame senjata: kita akan mendapatkan "Kerusakan Senjata: 220" dengan senjata terbaik dalam permainan misalnya.

Kami dapat menggunakan spesifikasi yang sama sekali berbeda untuk gameplay kami dan oleh karena itu untuk n (a) , misalnya yang membuat jumlah hit yang dibutuhkan meningkat dengan cepat saat game berkembang dan kemudian dataran tinggi, dan solusi yang dihasilkan akan berbeda.

jrsala
sumber
Ini menggabungkan pemahaman suara dari matematika dengan gameplay sebagai titik awal. Jawaban yang sangat bagus.
Marcks Thomas
1
@MarcksThomas Terima kasih! Saya berharap lebih banyak orang mendefinisikan kebutuhan mereka dengan jelas dan membangun permainan mereka dari sana. Kita akan melihat game yang lebih lengkap dan selesai dengan kualitas seperti itu.
jrsala
Ya, saya setuju bahwa ini adalah jawaban yang sempurna. Saya membaca ini dengan senang hati :)
Grzegorz Sławecki
1
Fantastis! Saya berharap matematika semacam ini adalah bagian yang lebih teratur dari literatur desain sistem. (Mungkin saya harus menulis esai tentang kerusakan vs perisai kadang-kadang ...)
Steven Stadnicki
Jawaban yang bagus, tetapi mengapa Anda harus menggunakan satu variabel karakter dalam persamaan Anda? Berapa kali saya bertanya, "Apa aartinya lagi?" dan gulir ke atas?
Daniel Kaplan
9

Saya akan merekomendasikan Anda untuk mendesain gim Anda dari arah lain: Pertama-tama pikirkan bagaimana Anda ingin gim Anda dimainkan (dalam hal pengalaman gim, bukan dalam hal angka), dan kemudian rancang baik rumus dan rentang angka untuk mendapatkan hasil itu.

Tujuan permainan Anda adalah dibutuhkan sejumlah hit untuk membunuh musuh. Berapa banyak klik tergantung pada tiga variabel:

  • tingkat kekuatan musuh
  • tingkat kekuatan karakter
  • tingkat kekuatan senjata

Pertama-tama Anda harus membuat tabel dari semua kemungkinan kombinasi dari ketiga variabel ini menjadi rendah, menengah atau tinggi (belum ada angka konkret, hanya "rendah", "menengah" atau "tinggi") dan berapa banyak klik yang ingin Anda buat diperlukan untuk kombinasi ini.

Maka Anda harus mencoba menemukan formula dan rentang nilai yang paling mendekati nilai harapan Anda.

Philipp
sumber
7

Cara termudah, adalah meningkatkan kerusakan senjata di antara level senjata secara eksponensial.

Namun, yang penting adalah Anda juga harus mendefinisikan bagaimana HP musuh tumbuh ketika mereka semakin kuat. Jadi, ketika Anda sangat kuat, Anda harus membunuh musuh yang mudah hanya dengan beberapa pukulan, tetapi mereka yang berada di level Anda harus relatif lebih sulit untuk dibunuh daripada musuh yang berada di level Anda di awal. Jadi saya akan mendesainnya agar terlihat seperti di bawah ini:

level   weapon  enemy   attack  total   hits needed
        dmg     hp      factor  dmg     to kill
======================================================
1       1       2       5       1.25    1.6
2       4       16      10      6       2.666666667
3       9       54      15      15.75   3.428571429
4       16      128     20      32      4
5       25      250     25      56.25   4.444444444
6       36      432     30      90      4.8
7       49      686     35      134.75  5.090909091
8       64      1024    40      192     5.333333333
9       81      1458    45      263.25  5.538461538
10      100     2000    50      350     5.714285714
11      121     2662    55      453.75  5.866666667
12      144     3456    60      576     6
13      169     4394    65      718.25  6.117647059
14      196     5488    70      882     6.222222222
15      225     6750    75      1068.75 6.315789474
16      256     8192    80      128     6.4
17      289     9826    85      1517.25 6.476190476
18      324     11664   90      1782    6.545454545
19      361     13718   95      2075.75 6.608695652
20      400     16000   100     2400    6.666666667
Dimana:
1. total dmg dihitung menggunakan rumus Anda
2. senjata dmg = level * level (pertumbuhan eksponensial)
3. hp musuh = 2 * level * level * level (pertumbuhan eksponensial)
4. faktor serangan = 5 * level
5. Hit yang diperlukan menjelaskan berapa banyak hit yang dibutuhkan berada di level x dan menggunakan senjata di level x, untuk membunuh musuh di level x

Saya men-tweak faktor-faktor konstan dalam formula hanya untuk mencapai hasil yang saya pikir dapat diterima, tetapi yang penting adalah di mana Anda ingin pertumbuhan linier dan di mana Anda ingin eksponensial.

Anda juga harus memperhatikan bahwa untuk membunuh musuh lvl 20 yang memiliki 100 serangan dan memiliki senjata lvl1 yang membutuhkan total 6 dmg akan memakan banyak waktu. Jika terlalu banyak menurut Anda, bermainlah dengan konstanta.

Grzegorz Sławecki
sumber
Apa yang dimaksud dengan "faktor serangan"?
Daniel Kaplan
0

Saya pikir metode kerajinan perang dunia adalah salah satu yang terbaik. Statistik pangkalan pemain memiliki dampak rendah pada total kerusakan, dengan sebagian besar pengubah kerusakan berasal dari statistik bonus di gigi. Itu membuatnya lebih mudah untuk memperluas permainan dan menyeimbangkannya seiring berjalannya waktu

ProtoJazz
sumber