Masalah
Pemain memperoleh 5 poin per level hingga level 80 dengan maksimum 400. Ada 5 statistik untuk dibagikan dan tidak ada batas maksimum berapa banyak yang dapat Anda tambahkan ke stat.
- Kekuatan
- Daya tahan
- Intelijen
- Kelincahan
- Keberuntungan - Memberikan peluang kritis dan kerusakan kritis
Saya ingin menerapkan persamaan pengembalian yang semakin berkurang pada katakanlah Keberuntungan. Untuk kesempatan kritis, saya tidak berharap pemain dapat mencapai peluang kritis 100%.
Akan ada langit-langit di mana ia akan mencapai sebagai pertumbuhan semakin menurun mencapai menuju 0 per poin ditambahkan.
Contoh jika peluang kritis maksimum yang saya inginkan dimiliki pemain adalah 40%, Setiap poin keberuntungan akan meningkatkan peluang kritis semakin sedikit, sampai peluang kritis mencapai sekitar 40%. Dengan mana 1 keberuntungan akan memberikan jumlah yang sangat sangat kecil.
Ada solusi? Terima kasih dan bantuan Anda sangat dihargai!
Jawaban:
Anda ingin memulai dengan fungsi asimptotik. Yaitu, angka yang dimulai dari angka
a
dan mendekati angka lainnyab
, tetapi tidak pernah benar-benar mencapainya. Mungkin akan lebih mudah jikaa = 0
danb = 1
. Anda akan mengambil persamaan ini, memasukkan jumlah poin stat (poin Keberuntungan) yang dimiliki karakter, dan mendapatkan nilai stat aktual (Crit Chance) sebagai output.Contoh yang sangat sederhana adalah di
y = x / (x + n)
manan
beberapa konstanta positif. Di sinix
adalah input Anda, tempat Anda memberi makan dalam jumlah poin stat, dany
output Anda, di mana Anda mendapatkan nilai stat akhir.Untuk
n = 5
memeriksa seperti apa tampilannya:Ketika Anda memberi makan,
x = 0
Anda mendapatkany = 0
, tetapi tidak peduli seberapa besarx
Anda memasukkan,y
tidak pernah mencapai 1. Sempurna.Sekarang, Anda dapat menyesuaikan ini dengan keinginan hati Anda. Anda dapat mengalikan dengan faktor skala untuk mengatur 'batas' ke apa pun yang Anda inginkan.
y = a * x / (x + 5)
. Jika Anda ingin batasnya menjadi 40%, kalikan dengan ,4.y = .4 * x / (x + n)
. Sekarang ketika Anda memberi makanx
,y
akan meningkat tetapi tidak akan pernah mencapai .4.Sesuaikan
n
untuk mengatur seberapa cepat atau lambat persamaan landai.n = 100
akan meningkat jauh lebih lambat daripadan = 5
:Anda bisa menyelesaikan persamaan ini karena
n
jika Anda tahu Anda ingin nilai stat yang ingin Anda capai pada titik-titik stat angka tertentu. Katakanlah karakter harus memiliki 35% Crit Chance di 100 poin of Luck. Memecahkan.35 = .4 * 100 / (100 + n)
untukn
hasiln = 14.29
.Angka-angka ini tidak harus konstanta mentah juga. Mungkin statistik lain masuk ke menghitung nilai
n
. Mungkin beberapa karakter memiliki angka yang berbedan
sehingga skala mereka lebih baik dalam stat 'pilihan' mereka.Jika Anda menginginkan kurva yang bentuknya berbeda atau lebih kompleks, ada banyak contoh fungsi asimptotik yang bisa Anda gunakan juga. Saya akan meninggalkan Anda untuk menjelajahinya sesuai keinginan.
sumber
P = x/(x+n)
adalah probabilitas, mengingat tas dengan n batu hitam dan x batu putih, bahwa Anda mengeluarkan batu putih dari kantung buta. Salah satu pendekatan yang dapat Anda lakukan adalah membuat crits set X = keberuntungan Anda, dan N = keberuntungan mereka. Kesempatan Anda untuk kritik adalah 50% jika Anda memiliki keberuntungan yang sama dengan musuh Anda. Jika Anda ingin peluang dasar menjadi 10%, maka kami X = keberuntungan Anda, N = 9x keberuntungan mereka.Basis yang baik akan menjadi fungsi seperti
arctan
, karena melewati asal dan menunjukkan asimtot horisontal.Skala oleh
40 / (pi/2)
, atau80/pi
untuk batas yang Anda inginkan. Kemudian ubahluck
untuk mendapatkan kurva kecuraman yang Anda inginkan.sumber
Saya sangat suka cara game Souls mengatasi masalah ini. Alih-alih membuat setiap stat memberikan bonus berdasarkan fungsi kontinu seperti yang disarankan, ini memberikan bonus dalam fungsi linier satu demi satu.
Saya tidak dapat mengingat angka pastinya dari atas kepala saya, tetapi fungsinya ada di sepanjang baris berikut ini (setiap stat memiliki konstanta sendiri)
Metode ini memberikan banyak manfaat bagi perancang dan pemain. Perancang mendapat manfaat karena Anda dapat menyetel manfaat tepat per poin dalam suatu keterampilan yang cukup sepele, dan pemain mendapat manfaat karena mereka tahu persis berapa banyak manfaat yang akan mereka lihat dari level ke level.
Dalam kasus fungsi kontinu, beberapa level mungkin memberikan manfaat yang tidak tercermin dalam angka karena pengukuran alias. Yakin bahwa level terakhir memberi Anda peningkatan 0,9 dalam bonus XYZ, tetapi karena nilai aktual berubah dari 23,52 menjadi 24,42, dan Anda membulatkan angka sebelum menampilkannya, pemain tidak menyadari bahwa ada sesuatu yang berubah.
Dari perspektif UX, saya pasti akan menyarankan pergi dengan fungsi linear piecewise. Namun, menggunakan fungsi kontinu dapat lebih mudah untuk dilakukan di kemudian hari, karena pemain tidak akan terikat pada konstanta bulat.
sumber
ceil
yang jumlah kenaikan sebelum menambahkan, dan hanya memungkinkan bilangan bulat tingkat stat. ataufloor
kemudianx <= 0: x = 1
untuk menghindari secara tidak sengaja melewati tutup lunak.Jan Dvorak menunjukkan fungsi eksponensial dalam komentar. Saya akan jelaskan di sini.
Perhatikan bahwa operasi eksponensial (dan trigonometri) jauh lebih mahal secara komputasi daripada operasi akar kuadrat, yang itu sendiri jauh lebih buruk daripada matematika dasar, jadi Anda mungkin lebih baik dengan pendekatan Adam jika Anda akan melakukan perhitungan ini berkali-kali per detik . Jika Anda hanya menghitung nilai saat level pemain, mengganti peralatan, dll., Kecepatan tidak penting, jadi gunakan apa pun yang memberi Anda kurva terbaik.
Fungsi eksponensial adalah beberapa dasar, B , untuk beberapa kekuatan, x ,
y=B^x
. Matematikawan biasanya menggunakan basis e , (~ = 2.718), tetapi tidak ada alasan Anda tidak dapat menggunakan 2 atau 10 jika Anda mau.y=e^x
terlihat seperti ini:Perhatikan sisi kiri bergerak secara asimpot ke 0. Jadi kita dapat membalik sumbu x dengan melakukan
y=e^(
-x)
, tetapi masih turun dari 1 ke 0 dan kami ingin naik. Jadi kita bisa membalikkan sumbu y dengany=
-e^(-x)
. Sekarang naik dari -1 ke 0. Kita bisa menambahkan 1 untuk mendapatkany=
1- e^(-x)
dan naik dari 0 ke 1.Dari sini, itu hanya masalah penskalaan secara vertikal dan horizontal. Kita dapat mengalikan semuanya dengan beberapa nilai, sebut saja A , yang menetapkan batas asimptotik. Kemudian kita dapat mengalikan x dengan nilai laju perubahan, k , untuk menyesuaikan seberapa cepat itu mendekati batas.
Ini memberi kita persamaan akhir dari
y=A*(1 - e^(-k*x))
. Dengan menggunakan nilaik=0.012
danA=0.5
, kita dapat menetapkan batas menjadi 50% dan membiarkannya mendekati batas sekitar itux=400
.Sekarang, Anda dapat membuat beberapa penyesuaian untuk ini. Satu tweak yang saya buat berubah menjadi
A=0.5041
, jadi jika kita membulatkan persentase dengan 2 desimal (seperti 32,23%), y (399) = 49,99% dan y (400) = 50,00%. Dari y (347) dan seterusnya, ada beberapa tempat di mana dibutuhkan dua poin untuk mendapatkan perubahan 0,01%. Tetapi poin terakhir yang mungkin masih memberikan (hampir) manfaat nyata, dan membawanya ke bahkan 50%.Sebagai alternatif, kita dapat mengubah
k
nilai untuk memiliki efek yang serupa. Padak=0.02305
, putaran nilainya menjadi 49,99% paday=399
dan 50,00% paday=400
. Namun, ini memiliki masalah bahwa grafiknya sangat dangkal di akhir - dibutuhkan 48 poin untuk mendapatkan seperseratus persen terakhir (dariy(352)=49.99%
key(399)=49.99%
key(400)=50.00%
) dan peluang krit 1% terakhir membutuhkan 230 poin (dariy(170)=49.01%
key(400)=50.00%
) yang mungkin agak terlalu berkurang pada pengembalian.Jika Anda mau, Anda bisa menyesuaikan A dan k sehingga berkurang ke batas yang agak lebih tinggi pada laju yang lebih lambat, untuk memberikan sesuatu antara peluruhan linier dan eksponensial. Melakukan
y=0.6*(1-e^(-0.00447*x))
, Anda berakhir dengan ini:Perhatikan bahwa kurva terus melewati 50%, tetapi karena ada batas keras peringkat 400, pemain tidak bisa melewati titik itu (dan jika mereka berhasil melewatinya, masih ada batas keras 60% krit). Dengan persamaan ini, Anda dapat menggunakan 1 tempat desimal dan masih melihat keuntungan setiap 2 hingga 3 poin, dengan centang terakhir dari
y(399)=49.9%
hinggay(400)=50.0%
.Secara matematis, persamaan sebelumnya mungkin tampak lebih baik, karena mereka sebenarnya mendekati 50%, tetapi saya pribadi berpikir kenaikan 0,1% setiap pasangan poin terasa lebih baik daripada kenaikan 0,01%. Bahkan dengan
A=0.05041
dank=0.012
, dibutuhkan 102 poin untuk beralih dariy(298)=49.00%
menjadiy(400)=50.00%
. 25% dari poin Anda menghabiskan 2% dari kritik Anda mungkin terlalu berkurang. Persamaan 60% hanya membutuhkan 20 poin untuk persen terakhir (yang masih 5 kali lebih tinggi dari 4 poin yang dibutuhkan untuk persen pertama).Dengan beberapa persamaan terakhir ini, saya hanya menyambungkan persamaan ke dalam spreadsheet dan nilai tweak secara manual hingga terlihat bagus. Anda harus melakukan hal serupa jika menginginkan topi yang berbeda.
sumber
Untuk solusi yang sangat sederhana, bagaimana dengan root kuadrat x 2
Akar kuadrat dari 400 (maksimum yang mungkin) adalah 20, 20 * 2 = 40.
sumber
1/2
) dan Anda tidak menjelaskan alasan mengapa ini bisa bermanfaat.