Bagaimana saya bisa menghitung level saat ini dari total XP, ketika setiap level membutuhkan lebih banyak XP secara proporsional?

33

Dalam game saya, XP yang diperlukan untuk mencapai level berikutnya adalah Level Level × Level Threshold . Mengingat itu, bagaimana saya bisa mendapatkan level saya saat ini dari total XP yang pernah saya dapatkan?


Sebagai contoh:

Level Threshold = 50
Current Level = 1

Mulai dari level 1, saya perlu (1 × 50) = 50 XP untuk sampai ke level 2, dan seterusnya.

Level 1: 50 XP needed to reach level 2
Level 2: 100 more XP needed to reach level 3
Level 3: 150 more XP needed to reach level 4

Dengan kata lain, tabel perkembangan adalah sebagai berikut:

Level 1: 0 XP to 49 XP
Level 2: 50 XP to 149 XP 
Level 3: 150 XP to 299 XP
Level 4: 300 XP to 499 XP

Jika saya memiliki 300 XP, saya hanya akan mencapai level 4. Bagaimana saya bisa menghitungnya secara umum?

Jay van Diyk
sumber
Terkait dengan Stack Overflow: Menghitung akar segitiga tanpa sqrt
Damian Yerrick
Jumlah XP yang diperlukan untuk level berikutnya tidak bertambah semakin tinggi level saat ini?
Tiang
Nah, pertanyaan pertama yang perlu Anda jawab adalah: Apa nilai "ambang" untuk setiap level? Berdasarkan contoh Anda, jika kami berasumsi bahwa 300 XP adalah minimum untuk mencapai level 4, maka ambang Anda meningkat menjadi 75 setelah level 3. Setelah Anda menentukan frekuensi ambang meningkat, maka Anda dapat membuat algoritma untuk menghitungnya , seperti yang orang lain coba lakukan dalam jawaban mereka
Taegost
3
Majte memberikan jawaban yang baik untuk bagaimana menghitungnya, tetapi jawaban "terbaik" tidak menghitungnya ... menyimpan exp keseluruhan, tetapi juga menyimpan level saat ini dan delta XP. Setel ulang delta setiap kali Anda naik level dan Anda memiliki semua informasi yang Anda butuhkan (level, level + 1, total xp, delta xp) untuk dengan mudah menghitung apa pun yang perlu Anda gunakan / tampilkan
Jon Story
@JonStory Memang. Saya menguraikan ini sedikit dalam jawaban saya karena, yah, siapa yang sebenarnya menghitung level secara dinamis sepanjang waktu? Pertanyaan ini, pada dasarnya, hanyalah pertanyaan matematika, karena tidak mempertimbangkan peran level dalam sistem permainan sama sekali.
zxq9

Jawaban:

33

Saat mengerjakan matematika dan menyelesaikan dengan Levelpersyaratan pengalaman XP, kami memperoleh:

Level=1+1+8×XP÷502

Misalnya, berapa level pemain untuk ?XP=300

1+1+8×300÷502=4

Seperti yang diminta.

Atau, untuk level apa XP = 100000?

1+1+8×100000÷502=63

Lebih umum diungkapkan, untuk ambang awal yang sewenang - wenang di Level 1:

Level=1+1+8×threshold÷502

Anda juga dapat melakukan kebalikannya dan menghitung yang XPdibutuhkan untuk setiap level dengan menyelesaikan rumus di atas untuk XP.

XP=(Level2Level)×threshold2

Perhatikan bahwa rumus di atas berfungsi dengan pecahan tetapi Anda harus membulatkan ke nilai integer berikutnya. Misalnya di C ++ / C # Anda bisa menggunakan Level (int).

Untuk mendapatkan rumus bentuk tertutup di atas, saya menggunakan persamaan perbedaan, penjumlahan Gauss dan rumus kuadratik.

Jika Anda tertarik dengan solusi formula ini langkah demi langkah ...

Kami melakukan algoritma rekursif dengan memulai pertimbangan kami yang pada akhirnya Experience(next_level) = Experience(current_level) + current_level*50.

Sebagai contoh, untuk mendapatkan kita memiliki:XPLevel3

XPLevel3=XPLevel2+2×50

Di mana, 2*50berasal dari permintaan OP bahwa pengalaman yang diperlukan untuk mencapai level berikutnya adalah level saat ini * 50.

Sekarang, kita mengganti dengan logika yang sama ke dalam rumus. Itu adalah:XpLevel2

Pengganti ke dalam rumus di atas:XPLevel2=XPLevel1+2×50

XpLevel3=XpLevel1+1×50+2×50

dan hanya 50, yang merupakan titik kita mulai. KarenanyaXpLevel1

XpLevel3=50+2×50=150

Kita dapat mengenali pola untuk secara rekursif menghitung level yang lebih tinggi dan rantai penjumlahan yang terbatas.

XpLevelN=50+2×50+3×50+...+(N1)×50=i=0n1i×50

Di mana N adalah level yang ingin dicapai. Untuk mendapatkan XP untuk level N, kita harus menyelesaikannya untuk N.

XpLevelN÷50=i=0n1i

Sekarang sisi kanan hanya penjumlahan dari 1 sampai N-1, yang dapat dinyatakan dengan terkenal Gaussian penjumlahan . KarenanyaN×(N+1)÷2N

XpLevelN÷50=N(N+1)÷2N

atau hanya

2(XpLevelN50)÷50=N(N+1)2N

Akhirnya, meletakkan segala sesuatu di satu sisi:

0=N2N2×XpLevelN÷50

Ini sekarang merupakan formula kuadratik yang menghasilkan solusi negatif dan positif, yang hanya positif yang relevan karena tidak ada level negatif. Kami sekarang memperoleh:

N=1+1+4×2×XpLevelN502

Karenanya, level saat ini pada XP dan ambang linear adalah:

Level=1+1+8×XP÷threshold2

Level=XP5.0XPLevel 100

Sunting : Formula ini berfungsi penuh sebagaimana mestinya dan menghasilkan dengan benar levelkondisi saat ini XP dengan perkembangan ambang linier seperti yang diminta oleh OP. (Formula sebelumnya menampilkan "level + 1" dengan mengasumsikan pemain mulai dari Level 0, yang merupakan kesalahan saya - saya telah menyelesaikannya saat istirahat makan siang dengan menulis di tisu kecil! :)

Majte
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Josh
@JoshPetrie Masalahnya bagi kami yang baru saja melihat pertanyaan ini, adalah bahwa tautan obrolan rusak. Adakah cara untuk memulihkannya?
Mand
@Dan aku membatalkan penghapusan, tapi akan hilang sendiri dalam delapan hari atau lebih.
Josh
25

Solusi sederhana dan generik , jika Anda tidak perlu mengulangi perhitungan ini jutaan kali per detik (dan jika Anda melakukannya, Anda mungkin melakukan sesuatu yang salah), hanya menggunakan loop:

expLeft = playerExp
level = 1
while level < levelCap and expLeft >= 0:
    expLeft = expLeft - expToAdvanceFrom(level)
    level = level + 1

if expLeft < 0: level = level - 1     # correct overshoot

Keuntungan yang besar dari metode ini, selain tidak memerlukan matematika yang rumit, adalah bahwa ia bekerja untuk setiap fungsi exp per tingkat sewenang-wenang. Jika Anda suka, Anda bahkan bisa membuat nilai exp sembarang per level, dan menyimpannya dalam tabel.

Jika Anda (karena alasan aneh) membutuhkan solusi yang bahkan lebih cepat, Anda juga dapat menghitung ulang jumlah total exp yang diperlukan untuk mencapai setiap level, menyimpannya dalam sebuah tabel, dan menggunakan pencarian biner untuk menemukan level pemain. Pra-perhitungan masih membutuhkan waktu yang proporsional dengan jumlah total level, tetapi pencarian kemudian hanya membutuhkan waktu yang sebanding dengan logaritma jumlah level.

Ilmari Karonen
sumber
4
Solusi paling fleksibel. Dan karena kecepatan tidak masalah untuk perhitungan satu kali, yang terbaik kurasa.
GameAlchemist
4
@Majte: Mungkin saya tidak cukup jelas. Saya tidak menyarankan bahwa salah satu solusi yang diposting akan membutuhkan "jutaan iterasi". Yang ingin saya katakan adalah bahwa, kecuali jika Anda entah bagaimana perlu menghitung tingkat pemain jutaan kali per detik, solusi (kekuatan kasar) saya lebih dari cukup cepat. Solusi lain, berdasarkan secara aljabar menurunkan rumus bentuk tertutup untuk level sebagai fungsi exp, mungkin bahkan lebih cepat - tetapi untuk kode yang jarang disebut (dan apa pun yang kurang dari, katakanlah, 1.000 kali per detik pasti dihitung sebagai "jarang" di sini), itu tidak akan membuat perbedaan yang nyata.
Ilmari Karonen
2
Ohh, aku mengerti sekarang, maaf. Saya sepenuhnya setuju dengan Anda dan Anda menawarkan alternatif yang bagus untuk langkah-langkah kemajuan yang ditentukan pengguna per level. Tapi kemudian, mungkin menggunakan tabel preprocessed setelah semua.
Majte
2
Kesederhanaan solusi ini membuatnya menjadi pemenang yang jelas. Jangan mengabaikan nilai keterbacaan dan pemeliharaan.
Mauser
1
Komputer pandai melakukan tugas-tugas kasar, bukan orang. Anda ingin menyederhanakan kehidupan orang, programmer, dengan mengorbankan komputer jika perlu. Dengan menggunakan solusi ini, Anda hanya perlu menulis satu metode, maju, bukan maju dan mundur. Solusi paling sederhana bukanlah yang dia miliki dalam kode, tetapi membangun tabel pencarian itu. Ram murah, gunakan saja.
Mauser
11

Pertanyaan telah dijawab dengan kode, tetapi saya pikir itu harus dijawab dengan matematika. Seseorang mungkin ingin memahami alih-alih hanya menyalin dan menempel.

Sistem Anda mudah dijelaskan oleh relasi berulang:

XPTingkat+1=XPTingkat+TingkatAmbang

Yang menawarkan solusi bentuk tertutup sederhana yang bagus untuk XP:

XPTingkat=(Tingkat-1)TingkatAmbang2

Yang bisa kita pecahkan Tingkat:

Tingkat=Ambang2+8XPAmbang2Ambang+12

(truncate ke integer, karena pemain membutuhkan semua XP yang diperlukan untuk mendapatkan salah satu bonus level-up)

MickLH
sumber
2
Saya suka jawaban ini. Jelas dan ringkas.
Almo
Hai, Mick; sudah lama sejak saya melakukan hubungan berulang. Tidak bisakah kita juga menentukan kasus dasar XP_Level(0) = 50dan kemudian kita bisa menghindari penyelesaian? Adakah manfaat, pro, kontra? Saya pikir akan lebih baik untuk menyentuh jawaban ini. +1
Vaughan Hilts
@VaughanHilts Saya tidak yakin bagaimana notasi Anda bekerja atau apa yang Anda minta, jangan ragu untuk ping saya di obrolan gamedev?
MickLH
Saya mengerti jawaban kode lebih mudah dari ini.
Pharap
Terus bekerja di sana @Pharap. Ketika saya remaja, saya juga memahami kode lebih mudah daripada matematika, tetapi dengan pengalaman dan pengetahuan, matematika akan menjadi jelas di mana-mana dalam kehidupan.
MickLH
10

Inilah salah satu pendekatan untuk memecahkan masalah menggunakan aljabar dasar. Jika Anda tidak peduli dengan langkah-langkahnya, lompat ke bawah.

Suatu hal yang mudah untuk muncul adalah, mengingat satu level n, total pengalaman yang ediperlukan untuk memperoleh level itu:

e = sum from k=1 to n of (t(k-1))

The tIstilah singkatan peningkatan XP dibutuhkan per tingkat - 50, dalam contoh.

Kita dapat menyelesaikan hal di atas menggunakan rumus untuk urutan aritmatika ( jumlah identitas ):

e = t/2 * n(n-1)

Namun, kami menginginkan formula yang berlawanan - level pemain memberikan pengalaman total. Apa yang benar-benar ingin kami lakukan adalah menyelesaikan untuk level n,. Pertama, mari kita kelompokkan persyaratan:

n^2 - n - 2e/t = 0

Sekarang kita bisa menggunakan rumus kuadratik:

n = (1 + sqrt(1+8e/t))/2

Persamaan terakhir:

level = 0.5 + sqrt(1 + 8*(total experience)/(threshold)) / 2
Kacau0
sumber
1
Terima kasih atas jawabannya. Tetapi bagaimana jika saya ingin mengubah Threshold ke variabel lain? Alih-alih 50 saya ingin menggunakan 50000 atau 1000 0 untuk masalah ini. Bagaimana saya harus memodifikasi persamaan?
JayVDiyk
2
Ya, solusinya harus sama. Saya ingin menjelaskan langkah-langkah untuk solusi jika ada yang tertarik. @JayVDiyk - akan mengedit posting.
Chaosed0
Itu agak kurang ajar dari Anda, ketika saya berkomentar bahwa saya akan memposting solusi lengkap setelah bekerja;) tidak apa-apa, saya tidak keberatan. Hal yang biasa adalah menjawab dengan referensi ke jawaban yang benar dan catat ekstensi. Pikiran Nerver, senang telah memecahkannya. Ingin lebih banyak pertanyaan seperti yang diposting di sini.
Majte
Maaf, pasti ketinggalan komentar itu. Tidak bermaksud mencurinya dari bawah Anda atau semacamnya - saya akan mengingatnya lain kali. Jawaban Anda pasti lebih menyeluruh daripada jawaban saya setelah diedit!
Chaosed0
1
+1; tanpa bermaksud menyinggung @Majte, saya pribadi menemukan penjelasan Anda lebih mudah dibaca.
Ilmari Karonen
3

Semua matematika yang terlibat di sini sangat penting untuk diketahui karena segala macam alasan, beberapa di antaranya berlaku untuk pengembangan game.

TAPI

Ini adalah situs pengembangan game, bukan situs matematika. Jadi mari kita bahas bagaimana hal-hal ini bekerja bukan sebagai seri algoritmik, tetapi sebagai set , karena itu adalah jenis matematika yang berlaku untuk leveling dalam game yang mungkin benar-benar dikembangkan untuk dijual, dan ini adalah sistem yang mendasari sebagian besar (tetapi tidak semua) leveling sistem (setidaknya secara historis).

Pemain cenderung lebih suka angka bulat yang mudah diingat dan divisualisasikan, dan tidak ada yang lebih penting daripada sistem permainan berbasis level di mana pemain membutuhkan jumlah xp xp untuk naik ke level Y.

Ada dua alasan bagus untuk memilih angka bulat:

  • Pengalaman level itu sendiri adalah angka bulat yang bagus, "100; 200; 1.000.000; dll."
  • Delta antara tingkat cenderung lain bagus, angka bulat pemain bisa melirik dan menghitung di kepalanya.

Angka bulatnya menyenangkan. Tujuan permainan adalah untuk menjadi menyenangkan. Kesenangan itu penting, terutama karena dilema permainan sering kali sama sekali tidak menyenangkan menurut desain.

Mengapa ini penting untuk diingat?

Sebagian besar algoritma rangkaian majemuk tidak menghasilkan angka bulat yang bagus

Sebagian besar seri tidak berhenti pada titik yang indah (setiap jawaban yang saya lihat di sini sejauh ini berlangsung selamanya). Jadi apa yang kita lakukan? Kami memperkirakan, dan kemudian kami menentukan set level apa yang harus diterapkan pada sistem game .

Bagaimana kita tahu perkiraan apa yang tepat? Kami mempertimbangkan apa gunanya leveling dalam sistem game.

Sebagian besar permainan memiliki batas level yang menendang di beberapa titik. Ada beberapa cara yang bisa dilakukan:

  • Tutup ini ditemui relatif awal, di mana sistem level hanya ada untuk membantu pemain melewati fase pertama permainan dengan cara yang terfokus untuk memaksa mereka mempelajari sistem permainan lengkap. Begitu mereka "dewasa", permainan panjang dimulai.
  • XP mendapatkan VS tingkat kesulitan memiliki ekonomi tertentu untuk itu di mana ya, ada batas level, tetapi sangat jauh bahwa kami berharap para pemain untuk menyelesaikan permainan sekitar setengah jalan melalui bagan leveling. Dalam RPG DQ / gaya FF dengan beberapa karakter / kelas, lebih umum untuk membuat karakter / kelas yang berbeda dibuat lebih mudah dengan memperoleh pengalaman dengan kecepatan yang berbeda daripada mengubah XP yang diperlukan untuk setiap level per kelas karakter . Dengan cara itu para pemain dapat dengan mudah mengingat angka bulat kecil yang lucu sebagai tujuan universal, dan tahu bahwa setiap karakter maju ke arah mereka pada tingkat sewenang-wenang yang ditetapkan oleh sistem permainan ( XP + (XP * Modifier)atau apa pun).
  • Batas level didasarkan pada kategori karakter eksternal. Yaitu, beberapa faktor di luar sistem permainan yang tepat menentukan seperti apa sistem tingkat itu. Ini menjadi lebih umum karena banyak game dibayar untuk menang tetapi gratis untuk dimainkan. Seorang pemain gratis dapat dibatasi pada lvl 70, pelanggan dapat dibatasi pada lvl 80, pembelian satu kali dapat meningkatkan level seseorang di luar batas universal, dll.
  • Level caps bersifat universal dan terikat pada dunia game dalam beberapa cara. Sistem ini telah dipopulerkan oleh WoW.
  • Sistem tutup level mana pun yang Anda impikan yang meningkatkan gameplay dengan cara yang lebih cerdas daripada sekadar memberi hadiah kepada pemain karena membuang lebih banyak menit hidup mereka di dunia buatan Anda daripada pemain lain.

Ada yang beberapa sistem permainan di mana tidak ada cap tingkat dan sistem algoritmik ditentukan. Biasanya sistem seperti ini menggunakan beberapa sistem X-power-of-Y untuk membuat angka meledak dengan cepat. Ini membuatnya sangat mudah untuk mencapai level L-1, cukup diharapkan bahwa sebagian besar pemain akan mencapai level L, terlalu sulit untuk mencapai level L + 1, dan pemain akan menjadi tua dan mati sebelum mencapai L + 2. Dalam hal ini "L" adalah level yang Anda putuskan adalah level target yang sesuai untuk dimainkan dan di mana biasanya akan membatasi sistem tetapi membiarkan opsi terbuka bagi orang-orang untuk menipu diri sendiri agar berpikir itu ide yang bagus untuk XP selamanya. (Seram!) Dalam sistem semacam ini, matematika yang ditemukan di sini masuk akal. Tapi itu adalah kasus yang sangat sempit, dan jarang ditemui dalam game sebenarnya.

Jadi apa yang kita lakukan?

Hitung level dan XP? Tidak. Tentukan level dan XP? Iya nih.

Anda menentukan level apa artinya, lalu memutuskan set level apa yang tersedia harus tersedia. Keputusan ini bermuara pada granularity di dalam sistem game (Apakah ada perbedaan besar dalam kekuatan antar level? Apakah setiap level memberikan kemampuan baru? Dll.) Dan apakah level digunakan sendiri atau tidak sebagai sistem gating ("Tidak bisa pergi ke kota berikutnya sampai Anda lvl 10, nak. ", atau sistem tangga yang kompetitif menegakkan tingkatan berbasis tingkat, dll.).

Kode untuk ini sangat mudah, dan hanya penentuan rentang:

level(XP) when XP < 100  -> 1;
level(XP) when XP < 200  -> 2;
level(XP) when XP < 500  -> 3;
level(XP) when XP < 1000 -> 4;
% ...more levels...
level(XP) when XP > 1000000 -> 70. % level cap

Atau dengan pernyataan if, atau case, atau rantai if / elif, atau bahasa apa pun yang Anda gunakan menggunakan dukungan (Bagian ini adalah elemen yang paling menarik dari sistem game mana pun, saya hanya menyediakan dua cara karena kebetulan saya berada dalam mode Erlang sekarang, dan sintaks di atas mungkin tidak jelas bagi semua orang.):

level(XP) ->
    if
        XP < 100  -> 1;
        XP < 200  -> 2;
        XP < 500  -> 3;
        XP < 1000 -> 4;
        % ...more levels...
        XP > 1000000 -> 70 % level cap
    end.

Apakah ini matematika yang luar biasa? Tidak, tidak sama sekali. Apakah ini implementasi manual dari penentuan elemen yang ditetapkan? Ya. Itu saja, dan ini cukup banyak cara saya melihatnya benar - benar dilakukan di sebagian besar permainan sepanjang tahun.

Sebagai catatan, ini tidak boleh dilakukan setiap kali pemain mendapatkan pengalaman. Biasanya Anda melacak "XP untuk pergi" sebagai satu nilai, dan sekali pemain menghabiskan atau melampaui nilai "untuk pergi" (mana pun Anda melakukannya) maka Anda menghitung ini sekali untuk mencari tahu di mana pemain benar-benar di, simpan itu, hitung "pergi" berikutnya minus sisa (jika membawa XP ke depan diperbolehkan) dan ulangi.

zxq9
sumber