Her seviye orantılı olarak daha fazla XP gerektirdiğinde mevcut seviyeyi toplam XP'den nasıl hesaplayabilirim?


33

Benim oyunumda, bir sonraki seviyeye ulaşmak için gereken XP Mevcut Seviye × Seviye Eşiğidir . Göz önüne alındığında, nasıl benim alabilirsiniz akım seviyesi gelen toplam XP şimdiye kazandı?


Örneğin:

Level Threshold = 50
Current Level = 1

1. seviyeden başlayarak, 2. seviyeye ulaşmak için (1 × 50) = 50 XP'ye ihtiyacım olacaktı .

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

Başka bir deyişle, ilerleme tablosu aşağıdaki gibidir:

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

300 XP'ye sahipsem, henüz 4. seviyeye geleceğim. Bunu genel olarak nasıl hesaplayabilirim?



Bir sonraki seviye için gerekli olan XP miktarı mevcut seviyenin yükselmesiyle artmıyor mu?
Mast

Cevaplamanız gereken ilk soru şudur: Her seviye için "eşik" değeri nedir? Örneğinize göre, eğer 300 XP'nin seviye 4'e ulaşmanın minimum olduğunu varsayarsak eşik değeriniz seviye 3'ten sonra 75'e çıkar. Eşiğin yükseleceği frekansı belirledikten sonra hesaplamak için bir algoritma ile karşılaşabilirsiniz. , diğer insanlar gibi cevaplarında yapmaya çalışıyorlar
Taegost

3
Majte, nasıl hesaplanacağına dair iyi bir cevap veriyor, ama "en iyi" cevap sadece hesaplamak değil ... genel exp'i depolamak, aynı zamanda mevcut seviyeyi ve XP deltasını da saklamak. Her seviye yükseldiğinde deltaları sıfırla ve kullanman / görüntülemen gereken her şeyi kolayca hesaplamak için ihtiyacın olan tüm bilgilere (seviye, seviye + 1, toplam xp, delta xp) sahipsin
Jon Story

@JonStory Gerçekten. Cevabımı biraz bu konuya dahil ettim çünkü aslında , her zaman seviyeyi dinamik olarak kim hesaplıyor? Bu soru, özünde, bir oyun sistemi içindeki seviyelerin rolünü hiç düşünmediği için , sadece bir matematik sorusudur.
zxq9

Yanıtlar:


33

Matematiği işlerken ve Levelkoşullara dayalı deneyimleri çözerken XP, şunları elde ederiz:

Level=1+1+8xXP÷502

Örneğin, oyuncunun için seviyesi nedir?XP=300

1+1+8x300÷502=4

İstendiği gibi.

Veya, seviye XP = 100000nedir?

1+1+8x100000÷502=63

Daha genel olarak , Seviye 1'deki keyfi bir başlangıç ​​eşiği için:

Level=1+1+8xthreshOld÷502

Ayrıca XP, XP için yukarıdaki formülü çözerek, tersini yapabilir ve herhangi bir seviye için gerekenleri hesaplayabilirsiniz .

XP=(Level2-Level)xthreshOld2

Yukarıdaki formülün kesirlerle çalıştığını ancak bir sonraki tamsayı değerine yuvarlamanız gerektiğini unutmayın. Örneğin C ++ / C # 'da (int) Seviyesini kullanabilirsiniz.

Yukarıdaki kapalı formülü elde etmek için fark denklemlerini, Gauss toplamını ve ikinci dereceden bir formülü kullandım.

Bu formülün çözümüyle ilgileniyorsanız adım adım ...

Sonunda ki düşüncelerimizi başlatarak özyinelemeli bir algoritma yapıyoruz Experience(next_level) = Experience(current_level) + current_level*50.

Örneğin, elde etmek üzere Elimizdeki:XPLevel3

XPLevel3=XPLevel2+2x50

, Nerede 2*50deneyimi sonraki seviyeye ulaşmak için gerekli OP'ın isteği geliyor akım seviyesi * 50'dir.

Şimdi, yerine aynı mantıkla formülü koyarız . Yani:XpLevel2

Yerine yukarıdaki formül içinde:XPLevel2=XPLevel1+2×50

XpLevel3=XpLevel1+1×50+2×50

ve , başlangıç ​​noktamız olan sadece 50'dir. bundan dolayıXpLevel1

XpLevel3=50+2×50=150

Daha yüksek seviyeleri tekrarlı bir şekilde hesaplamak için bir kalıp ve sonlu bir toplamlar zinciri tanıyabiliriz.

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

N, ulaşılacak seviyedir. N seviyesi için XP’yi almak için N için çözmemiz gerekir.

XpLevelN÷50=i=0n1i

Şimdi sağ taraf, ünlü Gauss toplamı ile ifade edilebilecek olan 1'den N-1'e kadar bir toplamdır . bundan dolayıN×(N+1)÷2N

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

ya da sadece

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

Sonunda, her şeyi bir tarafa koymak:

0=N-2-N--2xXpLevelN-÷50

Bu, şimdi negatif seviye olmadığından sadece pozitifin ilgili olduğu negatif ve pozitif bir çözüm veren ikinci dereceden bir formüldür. Şimdi biz elde ediyoruz:

N-=1+1+4x2xXpLevelN-502

Bu nedenle, XP ve lineer eşik koşullarına bağlı mevcut seviye şudur:

Level=1+1+8xXP÷threshOld2

Level=XP5.0XPLevel 100

Düzenleme : Bu formül tamamen olması gerektiği gibi çalışmaktadır ve OP'nin talep ettiği gibi lineer bir eşik ilerlemesi ilelevel koşullu akımı doğru şekilde vermektedir . (Önceki formül, oyuncunun benim erimem olan Seviye 0'dan başladığını varsayarak "seviye + 1" i çıkardı - öğle tatilinde küçük bir dokuya yazarak çözdüm! :)XP


Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
Josh

@JoshPetrie Bu soruyu daha sonra gören bizim için sorun, sohbet bağlantısının kesilmiş olmasıdır. Kurtarmanın bir yolu var mı?
Ve

@ Ve sonra onu geri aldım, ancak sekiz gün sonra tekrar kendiliğinden kaybolacak.
Josh

25

Basit ve jenerik sen (bunu yaparsanız ve eğer konum saniyede kez bu hesaplama milyonlarca tekrarlamak gerekmiyorsa çözüm, muhtemelen bir şey yanlış yapıyor), bir döngü kullanmak adildir:

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

Bu yöntemin en büyük avantajı, karmaşık bir matematik gerektirmemesinin yanı sıra, herhangi bir seviye başına rasgele işlev için de işe yaramasıdır. İsterseniz, seviye başına rasgele exp değerleri oluşturabilir ve bunları bir tabloda saklayabilirsiniz.

Daha garip bir nedenden dolayı daha hızlı bir çözüme ihtiyaç duyarsanız, her seviyeye ulaşmak için gereken toplam exp miktarını da önceden hesaplayabilir, bunu bir masada saklayabilir ve oyuncunun seviyesini bulmak için ikili bir arama kullanabilirsiniz. Ön hesaplama hala toplam seviye sayısına orantılı olarak zaman alır, ancak bu durumda arama sadece seviye sayısının logaritması ile orantılı olarak zaman gerektirir .


4
En esnek çözüm. Ve hız bir kerelik bir hesaplama için önemli olmadığından, sanırım en iyisi.
GameAlchemist 28:15

4
@ Majte: Belki de yeterince açık değildim. Ben değilim değil yayınlanmıştır çözümlerin herhangi "tekrarlamalar milyonlarca" gerektireceğini de düşündüren. Söylemek istediğim, bir oyuncunun seviye başına saniyede milyon kez hesaplamanız gerekmediği sürece , (saf kaba kuvvet) çözümümün yeterince hızlı olması. Exp'in bir fonksiyonu için seviye için kapalı formlu bir formülü cebirsel olarak türetmeye dayanan diğer çözümler daha hızlı olabilir - ancak sadece nadiren (ve saniyede 1000 defadan daha az olan herhangi bir şey kesinlikle "nadir" burada), gözle görülür bir fark yaratmaz.
Ilmari Karonen

2
Ohh, şimdi anlıyorum üzgünüm. Size tamamen katılıyorum ve seviye başına kullanıcı tanımlı ilerleme adımları için mükemmel bir alternatif sunuyor. Ama sonra, muhtemelen sonuçta önceden işlenmiş tabloları kullanın.
Majte

2
Bu çözümün basitliği, kazananı açıkça kazanıyor. Okunabilirlik ve bakımın değerini iskonto etmeyin.
Mauser

1
Bilgisayarlar insanları değil, saygın görevleri yapmakta iyidir. Gerektiğinde bilgisayar masrafları olan kişilerin hayatlarını, programcılarını basitleştirmek istiyorsunuz. Bu çözümü kullanarak, ileri ve geri değil, yalnızca bir yöntem yazmalısınız. En basit çözüm kodunda olan değil, o arama tablosunu oluşturmaktır. Ram ucuz, kullan.
Mauser

11

Soru kod ile cevaplandı, ancak matematikle cevaplanması gerektiğini düşünüyorum. Birisi sadece kopyalayıp yapıştırmak yerine anlamak isteyebilir .

XPseviye+1=XPseviye+seviyeEşik

XP

XPseviye=(seviye-1)seviyeEşik2

seviye

seviye=Eşik2+8XPEşik2Eşik+12

(tamsayıyı kesin; çünkü oyuncu , seviye yükseltme bonuslarından herhangi birini almak için gerekli tüm XP'ye ihtiyaç duyar )


2
Bu cevabı beğendim. Net ve özlü.
Almo

Selam Mick; uzun zamandır yinelenme ilişkileri yaptığımdan beri. Temel davayı da belirleyemedik XP_Level(0) = 50mi ve sonra çözmek istemez miyiz ? Herhangi bir yararı, artıları, eksileri? Bu cevaba dokunmanın iyi olacağını düşünüyorum. +1
Vaughan Hilts

@VaughanHilts Notasyonunuzun nasıl çalıştığını veya ne sorduğunuzu bilmiyorum, gamedev sohbetinde bana ping atmaktan çekinmeyin?
MickLH,

Kod cevabının bundan daha kolay olduğunu anladım.
Pharap

Üzerinde çalışmaya devam edin @Pharap. Gençken de, matematikten daha kolay kod anladım, ancak deneyim ve bilgiyle matematik hayatın her yerinde açıklığa kavuşacak.
MickLH

10

Temel cebir kullanarak problemi çözmek için bir yaklaşım. Adımlar umrunda değilse, en alta atlayın.

Ortaya çıkan kolay bir şey, bir seviye verildiğinde n, eo seviyeyi elde etmek için gereken toplam deneyimdir :

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

tÖrnekte, 50 - süreli XP artış seviyesi başına gerekli demektir.

Yukarıdakileri aritmetik dizileri ( toplamı kimliği ) formülü kullanarak çözebiliriz :

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

Bununla birlikte, tam tersi bir formül istiyoruz - oyuncunun seviyesi, toplam deneyimlerini verir. Gerçekten yapmak istediğimiz şey seviye için çözmektir n. İlk önce, terimleri gruplayalım:

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

Şimdi ikinci dereceden formülünü kullanabiliriz:

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

Son denklem:

level = 0.5 + sqrt(1 + 8*(total experience)/(threshold)) / 2

1
Cevap için teşekkürler. Peki ya Eşiği başka bir değişkenle değiştirmek istersem? 50 yerine bu konuda 50000 veya 1000 0 kullanmak istiyorum. Denklemi nasıl değiştirmeliyim?
JayVDiyk,

2
Evet, çözümler aynı olmalı. Herhangi birinin ilgisini çekmesi durumunda çözüme giden adımları hazırlamak istedim. @JayVDiyk - yayını düzenler.
0

İşten sonra tam çözümü yayınlayacağımı belirttiğim gibi biraz arsızcaydı;) tamam, umrumda değil. Her zamanki şey, doğru cevabı referans alarak cevaplamak ve genişletmeyi not almaktır. Nerver zihin, çözmeyi sevdi. Buraya daha fazla soru sorulmasını isterdim.
Majte

Üzgünüz, bu yorumu kaçırmış olmalısınız. Bunu altınızdan veya benzeri bir şeyden çalmak istemedim - Bir dahaki sefere aklımda tutarım. Cevabınız kesinlikle benim düzenlemeden sonra benimkilerden daha kapsamlı!
Chaosed0

1
+ 1; @Majte'ye yönelik herhangi bir suç olmadan, şahsen açıklamanızı daha okunaklı buluyorum.
Ilmari Karonen

3

Buradaki tüm matematik , bazıları oyun geliştirme için geçerli olan her türlü nedenden ötürü bilmek çok önemlidir .

FAKAT

Bu bir oyun sitesi, matematik sitesi değil. Öyleyse, bu şeylerin algoritmik seri olarak değil, kümeler olarak nasıl çalıştığını tartışalım , çünkü satmak için geliştirebileceğiniz oyunlarda seviyelemeye uygulanan matematik türüdür ve bu, en çok (ama hepsinin değil) seviyelemesinin temelini oluşturur. sistemler (en azından tarihsel olarak).

Oyuncular, hatırlanması ve görselleştirmesi kolay, yuvarlak sayıları tercih etme eğilimindedir ve hiçbir yerde bu, oyuncunun Y seviyesine ilerlemek için X miktarında xp'ye ihtiyaç duyduğu seviye tabanlı bir oyun sisteminden daha önemli değildir.

Yuvarlak sayıları seçmenin iki iyi nedeni vardır:

  • Seviye deneyiminin kendisi güzel, yuvarlak bir sayıdır "100; 200; 1,000,000; vb."
  • Seviyeler arasındaki delta , oyuncuya göz atabileceği ve kafasında hesaplayabileceği bir başka iyi, yuvarlak sayı olma eğilimindedir .

Yuvarlak sayılar eğlencelidir. Oyunların amacı eğlenceli olmaktır. Hoşluk önemlidir, çünkü özellikle oyun ikilemleri tasarım açısından hoş bir şey olamayacaktır.

Bu akılda tutulması için neden önemlidir?

Çoğu bileşik seri algoritması güzel, yuvarlak sayılar üretmez

Çoğu seri güzel bir noktada durmuyor (şu ana kadar burada gördüğüm her cevap sonsuza dek sürüyor). Peki ne yapıyoruz? Yaklaşık olarak hesaplıyoruz ve oyun sistemine hangi seviyelerin uygulanacağını belirliyoruz .

Hangi yaklaşımların uygun olduğunu nasıl bilebiliriz? Seviye seviyesinin oyun sistemi içerisinde ne olduğunu düşünüyoruz.

Oyunların çoğunda bir noktada devreye giren seviye kepleri vardır. Bunun oynayabileceği birkaç yol var:

  • Bu başlık nispeten erken yaşta karşılaşılır, seviye sistemi oyuncuların oyunun ilk aşamasını geçip odaklanmış bir şekilde oyunun tamamını öğrenmelerini sağlamak için var olmalarına yardımcı olur. "Tamamen büyümüşler" olduklarında uzun oyun başlar.
  • XP kazancı VS zorluk seviyesi belli bir ekonomiye sahip, evet, seviye sınırı var, ancak oyuncuların oyunu seviyelendirme çizelgesinin yarısına kadar tamamlamasını bekleriz. Birden fazla karakter / sınıf içeren DQ / FF stili RPG'lerde, her karakter sınıfı için her seviye için gereken XP'yi değiştirmek yerine farklı oranlarda deneyim kazanarak farklı karakterlerin / sınıfların seviyeye getirilmesi daha yaygındır . Bu şekilde oyuncular, sevimli küçük yuvarlak sayıları evrensel hedefler olarak kolayca hatırlayabilir ve her karakterin, oyun sistemi ( veya her neyse) tarafından belirlenen bir oranda kendilerine doğru ilerlediğini bilir .XP + (XP * Modifier)
  • Seviye büyük harfleri harici karakter kategorisine dayanır. Yani, oyun sisteminin dışındaki bazı faktörler, seviye sisteminin nasıl göründüğünü belirler. Bu, birçok oyun kazan-ma öde ancak bedavaya oynadıkça daha yaygın hale geliyor. Lvl 70'de ücretsiz bir oyuncu kapatılabilir, lvl 80'de bir abone kapatılabilir, bir defalık bir satın alma birisini bazı evrensel sınırların ötesinde bir seviyeye ilerletebilir.
  • Seviye kepleri evrenseldir ve bir şekilde oyun dünyasına bağlıdır. Bu sistem WoW tarafından popülerleştirildi.
  • Herhangi bir seviye kap sistemi, oyun dünyasını, sizin makyaj dünyasındaki diğer oyunculara kıyasla daha fazla dakika harcadığınız için ödüllendirmek yerine, daha zeki bir şekilde geliştiren herhangi bir seviye kap sistemi.

Orada olan hiçbir seviye kap ve sistem algoritmik olarak belirlenir bazı oyun sistemleri. Genellikle bu gibi sistemler, sayıların hızlı bir şekilde patlamasını sağlamak için bazı X güçlerinin Y sistemini kullanır. Bu, L-1 seviyesine ulaşmayı çok kolaylaştırır, makul bir şekilde çoğu oyuncunun L seviyesine ulaşması, L + 1 seviyesine ulaşması oldukça zor ve oyuncuların yaşlanıp L + 2'ye ulaşmadan önce ölmeleri makul bir şekilde bekleniyor. Bu durumda "L" karar verdiğiniz bir seviyedir, oyuna uygun olan ve normalde sistemi kapatan, ancak herkesin XP için iyi bir fikir olduğunu düşünmek için kendilerini kandırmak için seçeneği açık bırakan bir seviyedir. (Sinister!) Bu tür bir sistemde burada bulunan matematik mükemmel bir anlam ifade ediyor. Ancak gerçek oyunlarda çok dar ve nadiren karşılaşılan bir durumdur.

Peki ne yapıyoruz?

Seviyeleri ve XP hesaplayın ? Hayır . Seviyeleri ve XP'yi belirle ? Evet.

Hangi seviyelerin ne anlama geldiğini belirlersiniz, daha sonra mevcut seviyelerin ne olması gerektiğine karar verin. Bu karar oyun sistemindeki her iki ayrıntı düzeyine de iner ( Seviyeler arasında iktidarda muazzam bir fark var mı? Her seviye yeni bir yetenek kazandırıyor mu? Vb.) Ve seviyelerin kendileri bir geçit sistemi olarak kullanılıp kullanılmadığı 10 yaşına gelene kadar bir sonraki şehre git, evlat. ”veya rekabetçi bir merdiven sistemi seviyeye dayalı katmanları uygular vb.).

Bunun için kod oldukça basittir ve sadece aralık tespitidir:

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

Ya da bir if ifadesi, bir dava ya da if / elif zinciri ya da kullandığınız dil ne olursa olsun destekler (Bu kısım, herhangi bir oyun sisteminin en az ilgi çeken unsurudur, çünkü ben sadece iki yol sunuyorum. Şu anda Erlang modunda olmak ve yukarıdaki sözdizimi herkes için açık olmayabilir.):

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

Harika bir matematik mi? Hayır, hiç de değil. Set elemanı tespitinin manuel uygulaması mı? Evet. Hepsi bu kadar ve bu, yıllar boyunca çoğu oyunda gerçekte yaptığım gibi görünüyor.

Bir yan not olarak, bu olmamalı , her seferinde oyuncu kazanır deneyimi yapılabilir. Genellikle "XP to go" değerini bir değer olarak takip edersiniz ve oyuncu bir kez "gitmek" değerini tüketir veya aştığında (hangi şekilde yaparsanız yapın), o zaman oyuncunun gerçekte nerede olduğunu bulmak için bunu bir kez hesaplarsınız. at, sakla, sonraki "gitmek" eksi kalanı hesaplayın (eğer XP'yi ileri taşımaya izin verilirse) ve tekrarlayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.