Jak obliczyć aktualny poziom z całkowitej liczby punktów doświadczenia, gdy każdy poziom wymaga proporcjonalnie więcej punktów doświadczenia?

33

W mojej grze XP potrzebny do osiągnięcia następnego poziomu to Bieżący poziom × Próg poziomu . Biorąc to pod uwagę, w jaki sposób mogę uzyskać swój obecny poziom z całkowitej liczby zdobytych XP ?


Na przykład:

Level Threshold = 50
Current Level = 1

Począwszy od poziomu 1 potrzebowałbym (1 × 50) = 50 XP, aby dostać się na poziom 2 i tak dalej.

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

Innymi słowy, tabela progresji wygląda następująco:

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

Jeśli mam 300 XP, właśnie osiągnęłam poziom 4. Jak mogę to ogólnie obliczyć?

Jay van Diyk
źródło
Powiązane z przepełnieniem stosu: Obliczanie trójkątnego korzenia bez sqrt
Damian Yerrick
Ilość XP wymagana do następnego poziomu nie wzrasta, im wyższy jest obecny poziom?
Maszt
Cóż, pierwsze pytanie, na które musisz odpowiedzieć, to: jaka jest wartość „progowa” dla każdego poziomu? W oparciu o twój przykład, jeśli założymy, że 300 XP to minimum, aby osiągnąć poziom 4, to twój próg wzrasta do 75 po poziomie 3. Po określeniu częstotliwości wzrostu progu możesz wymyślić algorytm do jego obliczenia , podobnie jak inni starają się odpowiedzieć
Taegost
3
Majte daje dobrą odpowiedź na to, jak ją obliczyć, ale „najlepszą” odpowiedzią jest po prostu nie obliczanie jej… zapisz ogólny exp, ale także zapisz bieżący poziom i deltę XP. Zresetuj deltę za każdym razem, gdy awansujesz i masz wszystkie potrzebne informacje (poziom, poziom + 1, suma xp, delta xp), aby łatwo obliczyć wszystko, czego potrzebujesz / wyświetlić
Jon Story,
@JonStory Rzeczywiście. Rozbudowałem to trochę w mojej odpowiedzi, bo kto właściwie cały czas oblicza poziom dynamicznie? To pytanie jest w istocie tylko pytaniem matematycznym, ponieważ w ogóle nie uwzględnia roli poziomów w systemie gry.
zxq9

Odpowiedzi:

33

Opracowując matematykę i rozwiązując pod Levelwarunkiem doświadczenia XP, otrzymujemy:

Level=1+1+8×XP÷502

Na przykład, jaki jest poziom gracza dla ?XP=300

1+1+8×300÷502)=4

Zgodnie z prośbą.

Lub jaki jest poziom XP = 100000?

1+1+8×100000÷502)=63

Mówiąc bardziej ogólnie, dla dowolnego progu początkowego na poziomie 1:

L.miprzeciwkomil=1+1+8×thrmisholre÷502)

Możesz także zrobić odwrotną czynność i obliczyć XPwymagany poziom dla danego poziomu, rozwiązując powyższą formułę dla XP.

XP.=(L.miprzeciwkomil2)-L.miprzeciwkomil)×thrmisholre2)

Zauważ, że powyższa formuła działa z ułamkami, ale musisz zaokrąglić w dół do następnej liczby całkowitej. Na przykład w C ++ / C # możesz użyć (int) Level.

Aby uzyskać powyższą formułę w postaci zamkniętej, zastosowałem równania różnicowe, sumowanie Gaussa i wzór kwadratowy.

Jeśli jesteś zainteresowany rozwiązaniem tej formuły krok po kroku ...

Wykonujemy algorytm rekurencyjny, rozpoczynając nasze rozważania, które ostatecznie Experience(next_level) = Experience(current_level) + current_level*50.

Na przykład, aby uzyskać , mamy:XP.L.miprzeciwkomil3)

XP.L.miprzeciwkomil3)=XP.L.miprzeciwkomil2)+2)×50

Gdzie 2*50pochodzi z prośby PO, że doświadczenie potrzebne do osiągnięcia następnego poziomu to obecny poziom * 50.

Teraz podstawiamy tą samą logiką do wzoru. To jest:XpLevel2

Zastąp w powyższym wzorze:XPLevel2=XPLevel1+2×50

XpLevel3=XpLevel1+1×50+2×50

a wynosi zaledwie 50, co jest naszym punktem wyjścia. StądXpLevel1

XpLevel3=50+2×50=150

Możemy rozpoznać wzór rekurencyjnego obliczania wyższych poziomów i skończonego łańcucha sumowań.

XpL.miprzeciwkomilN.=50+2)×50+3)×50+...+(N.-1)×50=ja=0n-1ja×50

Gdzie N jest poziomem do osiągnięcia. Aby zdobyć XP za poziom N, musimy rozwiązać dla N.

XpL.miprzeciwkomilN.÷50=ja=0n-1ja

Teraz prawej stronie jest po prostu sumą od 1 do N-1, która może być wyrażona za pomocą znanego Gaussa sumowania . StądN.×(N.+1)÷2)-N.

XpL.miprzeciwkomilN.÷50=N.(N.+1)÷2)-N.

Lub tylko

2)(XpL.miprzeciwkomilN.-50)÷50=N.(N.+1)-2)N.

Wreszcie, stawiając wszystko na jednej stronie:

0=N.2)-N.-2)×XpL.miprzeciwkomilN.÷50

Jest to teraz formuła kwadratowa dająca rozwiązanie negatywne i pozytywne, z których tylko dodatnia jest istotna, ponieważ nie ma poziomów ujemnych. Teraz otrzymujemy:

N.=1+1+4×2)×XpL.miprzeciwkomilN.502)

Obecny poziom uzależniony od XP i liniowego progu wynosi zatem:

L.miprzeciwkomil=1+1+8×XP.÷thrmisholre2)

L.miprzeciwkomil=XP.5.0XPLevel 100

Edycja : Ta formuła działa w pełni tak, jak powinna i prawidłowo generuje prąd level, XP z liniowym progiem progowym, zgodnie z wymaganiami PO. (Poprzednia formuła dawała „poziom + 1”, zakładając, że gracz zaczął od poziomu 0, co było moim błędem - rozwiązałem go podczas przerwy na lunch pisząc na małej chusteczce! :)

Majte
źródło
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Josh
@JoshPetrie Problemem dla nas, którzy właśnie zobaczyli to pytanie później, jest to, że link do czatu jest uszkodzony. Jakiś sposób to odzyskać?
MA
@ I Usunąłem go, ale zniknie samo za około osiem dni.
Josh
25

Prosty i rodzajowe rozwiązanie, jeśli nie trzeba powtarzać tego obliczenia miliony razy na sekundę (a jeśli nie, jesteś prawdopodobnie robi coś złego), jest po prostu użyć pętli:

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

Dużą zaletą tej metody, poza tym, że nie wymaga skomplikowanej matematyki, jest to, że działa ona dla dowolnej dowolnej funkcji exp-per-level. Jeśli chcesz, możesz nawet utworzyć dowolne wartości exp na poziom i zapisać je w tabeli.

Jeśli potrzebujesz (z jakiegoś dziwnego powodu) jeszcze szybszego rozwiązania, możesz również wstępnie obliczyć całkowitą liczbę exp potrzebną do osiągnięcia każdego poziomu, przechowywać go w tabeli i użyć wyszukiwania binarnego, aby znaleźć poziom gracza. Wstępne obliczenie nadal zajmuje czas proporcjonalny do całkowitej liczby poziomów, ale wyszukiwanie wymaga wtedy tylko czasu proporcjonalnego do logarytmu liczby poziomów.

Ilmari Karonen
źródło
4
Najbardziej elastyczne rozwiązanie. A ponieważ prędkość nie ma znaczenia dla jednorazowego obliczenia, to chyba najlepsze.
GameAlchemist
4
@Majte: Być może nie byłem wystarczająco jasny. Ja nie sugeruje, że każdy z zamieszczonymi rozwiązania wymagałoby „miliony iteracji”. Chciałem powiedzieć, że o ile nie musisz w jakiś sposób obliczać poziomu gracza miliony razy na sekundę, moje rozwiązanie (naiwna brutalna siła) jest wystarczająco szybkie. Inne rozwiązania, oparte na algebraicznym wyprowadzaniu formuły zamkniętej dla poziomu w funkcji exp, mogą być jeszcze szybsze - ale dla kodu, który jest rzadko wywoływany (i cokolwiek mniej niż, powiedzmy, 1000 razy na sekundę, z pewnością liczy się jako „rzadkie” tutaj), nie zrobi to zauważalnej różnicy.
Ilmari Karonen
2
Och, rozumiem teraz, przepraszam. W pełni się z Tobą zgadzam, a Ty oferujesz doskonałą alternatywę dla zdefiniowanych przez użytkownika kroków zaawansowania na poziom. Ale prawdopodobnie prawdopodobnie mimo wszystko używają tabel wstępnie przetworzonych.
Majte
2
Prostota tego rozwiązania czyni go wyraźnym zwycięzcą. Nie pomniejszaj wartości czytelności i łatwości konserwacji.
Mauser
1
Komputery są dobre w wykonywaniu zwykłych zadań, a nie ludzie. Chcesz uprościć życie osób, programistę, w razie potrzeby kosztem komputera. Korzystając z tego rozwiązania, musisz napisać tylko jedną metodę, do przodu, a nie do przodu i do tyłu. Najprostszym rozwiązaniem nie jest to, które posiada w kodzie, ale budowanie tej tabeli odnośników. Ram jest tani, użyj go.
Mauser
11

Na pytanie odpowiedziano kodem, ale myślę, że należy na nie odpowiedzieć matematyką. Ktoś może chcieć to zrozumieć zamiast po prostu skopiować i wkleić.

Twój system można łatwo opisać za pomocą relacji powtarzalności:

XPPoziom+1=XPPoziom+PoziomPróg

Który oferuje ładne proste rozwiązanie w formie zamkniętej XP:

XPPoziom=(Poziom-1)PoziomPróg2)

Co możemy rozwiązać Poziom:

Poziom=Próg2)+8XPPróg2)Próg+12)

(Przybliżenie do liczby całkowitej, ponieważ gracz musi cały wymagany XP, aby uzyskać dowolny premii level-up)

MickLH
źródło
2
Podoba mi się ta odpowiedź. Jasne i zwięzłe.
Almo
Hej Mick; minęło trochę czasu, odkąd nawiązałem relacje nawrotowe. Czy nie moglibyśmy również określić przypadku podstawowego, XP_Level(0) = 50a wtedy moglibyśmy po prostu uniknąć rozwiązania? Jakieś korzyści, zalety, wady? Myślę, że dobrze byłoby dotknąć tej odpowiedzi. +1
Vaughan Hilts
@VaughanHilts Nie jestem pewien, jak działa twoja notacja ani o co pytasz, nie krępuj się ze mną pingować na czacie gamedev?
MickLH
Zrozumiałem odpowiedź na kod znacznie łatwiej.
Pharap
Pracuj nad tym @Pharap. Kiedy byłem nastolatkiem, rozumiałem również kod łatwiej niż matematykę, ale dzięki doświadczeniu i wiedzy matematyka stanie się oczywista w każdym miejscu w życiu.
MickLH,
10

Oto jedno podejście do rozwiązania problemu za pomocą podstawowej algebry. Jeśli nie przejmujesz się krokami, przejdź na sam dół.

Łatwo wymyślić, biorąc pod uwagę poziom n, całkowite doświadczenie epotrzebne do uzyskania tego poziomu:

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

tTermin oznacza wzrost XP potrzebne na poziomie - 50, w tym przykładzie.

Możemy rozwiązać powyższe za pomocą wzoru na sekwencje arytmetyczne ( tożsamość sumy ):

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

Chcemy jednak przeciwnej formuły - poziomu gracza, biorąc pod uwagę jego całkowite doświadczenie. Co naprawdę chcemy zrobić, to rozwiązać na poziomie n. Najpierw zgrupujmy warunki:

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

Teraz możemy użyć formuły kwadratowej:

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

Ostateczne równanie:

level = 0.5 + sqrt(1 + 8*(total experience)/(threshold)) / 2
Chaosed0
źródło
1
Dziękuję za odpowiedź. Ale co jeśli chcę zmienić Próg na inną zmienną? Zamiast 50 chciałbym użyć do tego 50000 lub 1000 0. Jak powinienem zmodyfikować równanie?
JayVDiyk
2
Tak, rozwiązania powinny być takie same. Chciałem wytyczyć kroki rozwiązania, na wypadek gdyby ktoś był zainteresowany. @JayVDiyk - będzie edytować post.
Chaosed0
To było trochę bezczelne, ponieważ skomentowałem, że po pracy opublikuję pełne rozwiązanie;) jest w porządku, nie mam nic przeciwko. Zwykle jest to odpowiedź z odniesieniem do poprawnej odpowiedzi i zanotowanie rozszerzenia. Umysł Nerver, uwielbiał to rozwiązać. Chciałbym, aby więcej takich pytań zostało zamieszczonych tutaj.
Majte
Przepraszam, musiałem przegapić ten komentarz. Nie chciałem tego ukraść spod ciebie ani nic w tym rodzaju - będę o tym pamiętać następnym razem. Twoja odpowiedź jest zdecydowanie dokładniejsza niż moja po edycji!
Chaosed0
1
+1; bez urazy wobec zamierzonej przez @Majte osobiście uważam, że twoje wyjaśnienie jest bardziej czytelne.
Ilmari Karonen
3

Cała matematyka, o której tu mowa, jest bardzo ważna z wielu powodów, niektóre z nich dotyczą tworzenia gier.

ALE

To jest strona poświęcona tworzeniu gier, a nie strona matematyczna. Porozmawiajmy więc o tym, jak te rzeczy nie działają jako szeregi algorytmiczne, ale jako zestawy , ponieważ jest to rodzaj matematyki, który ma zastosowanie do wyrównywania poziomów w grach, które możesz rozwinąć w celu sprzedaży, i to jest system, który leży u podstaw (ale nie wszystkich) wyrównywania systemy (przynajmniej historycznie).

Gracze preferują ładne, okrągłe liczby, które są łatwe do zapamiętania i wizualizacji, i nigdzie nie jest to ważniejsze niż w systemie gier opartych na poziomach, w którym gracz potrzebuje X xp, aby przejść do poziomu Y.

Istnieją dwa dobre powody, aby wybierać okrągłe liczby:

  • Poziom doświadczenia sam w sobie jest ładną, okrągłą liczbą „100; 200; 1 000 000; itd.”
  • Delta między poziomami jest zwykle kolejną ładną, okrągłą liczbą, na którą gracz może spojrzeć i obliczyć w swojej głowie.

Okrągłe liczby są przyjemne. Celem gier jest bycie przyjemnym. Przyjemność jest ważna, zwłaszcza że dylematy w grze często są z założenia przyjemne.

Dlaczego warto o tym pamiętać?

Większość algorytmów szeregów złożonych nie generuje ładnych, okrągłych liczb

Większość serii nie kończy się w ładnym momencie (każda odpowiedź, którą do tej pory widziałem, trwa wiecznie). Więc co robimy? Przybliżamy, a następnie my jaki zestaw poziomów powinien obowiązywać w systemie gry .

Skąd wiemy, jakie przybliżenia są odpowiednie? Rozważamy, jaki jest sens wyrównywania w systemie gry.

Większość gier ma ograniczenia poziomów, które zaczynają się w pewnym momencie. Można to rozegrać na kilka sposobów:

  • Ograniczenie napotyka się stosunkowo wcześnie, gdzie system poziomów istnieje tylko po to, aby pomóc graczom przejść przez pierwszą fazę gry w skoncentrowany sposób, aby zmusić ich do nauki pełnego systemu gry. Gdy „dorosną”, zaczyna się długa gra.
  • Zysk XP przeciwko poziomowi trudności ma pewną oszczędność, w której tak, istnieje ograniczenie poziomu, ale jest tak daleko, że oczekujemy, że gracze ukończą grę mniej więcej w połowie tabeli poziomów. W grach RPG w stylu DQ / FF z wieloma postaciami / klasami bardziej powszechne jest, aby różne postacie / klasy były łatwiejsze do zdobywania poziomów, zdobywając doświadczenie przy różnych stawkach, niż zmieniając wymagane XP dla każdego poziomu na klasę postaci . W ten sposób gracze mogą łatwo zapamiętać urocze małe okrągłe liczby jako uniwersalne cele i wiedzieć, że każda postać podąża w ich kierunku w dowolnie wybranym tempie ustalonym przez system gry ( XP + (XP * Modifier)lub cokolwiek innego).
  • Limity poziomów zależą od kategorii postaci zewnętrznych. Oznacza to, że jakiś czynnik poza systemem gry decyduje o tym, jak wygląda system poziomów. Staje się to coraz bardziej powszechne, ponieważ wiele gier jest płatnych do wygrania, ale darmowych. Darmowy gracz może zostać ograniczony do poziomu 70, subskrybent może zostać ograniczony do poziomu 80, jednorazowy zakup może awansować kogoś na wyższy poziom niż jakikolwiek uniwersalny limit itp.
  • Limity poziomów są uniwersalne i w pewien sposób powiązane ze światem gry. System ten został spopularyzowany przez WoW.
  • Każdy inny system limitów poziomów, jaki możesz sobie wymarzyć, który poprawia rozgrywkę w mądrzejszy sposób niż po prostu nagradzanie graczy za marnowanie więcej minut życia w wymyślonym świecie niż inni gracze.

Tam niektóre systemy gry, gdzie nie ma ograniczenia poziomu i system jest algorytmem. Zwykle takie systemy wykorzystują system X-Power-of-Y, aby liczby szybko wybuchały. To sprawia, że ​​bardzo łatwo jest dostać się do poziomu L-1, co, jak można się spodziewać, większości graczy dostanie się na poziom L, niezwykle trudno jest dostać się na poziom L + 1, a gracze zestarzeją się i umrą przed osiągnięciem L + 2. W tym przypadku „L” jest poziomem, który zdecydowałeś, że jest poziomem docelowym odpowiednim do gry i na którym normalnie ograniczałby system, ale pozostawia opcję otwartą dla ludzi, którzy mogą się łudzić, że dobrym pomysłem jest XP na zawsze. (Sinister!) W tego rodzaju systemie znaleziona tutaj matematyka ma doskonały sens. Ale jest to bardzo wąski i rzadko spotykany przypadek w rzeczywistych grach.

Więc co robimy?

Oblicz poziomy i XP? Nie. Określić poziomy i XP? Tak.

Określ, co oznaczają poziomy, a następnie zdecyduj, jaki dostępny zestaw poziomów powinien być dostępny. Ta decyzja sprowadza się do ziarnistości w systemie gry (czy istnieje ogromna różnica w sile między poziomami? Czy każdy poziom nadaje nową zdolność? Itp.) I czy poziomy są używane jako system bramkowania („Nie można idź do następnego miasta, dopóki nie osiągniesz 10 poziomu, dzieciaku. ”lub system drabin konkurencyjnych wymusza poziomy oparte na poziomach itp.).

Kod do tego jest dość prosty i polega jedynie na określeniu zasięgu:

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

Lub z instrukcją if, sprawą, łańcuchem if / elif lub jakimkolwiek językiem, w którym używasz wsparcia (ta część jest najmniej interesującym elementem każdego systemu gry, przedstawiam tylko dwa sposoby, ponieważ być teraz w trybie Erlang, a powyższa składnia może nie być oczywista dla wszystkich.):

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

Czy to niesamowita matematyka? Nie, wcale nie. Czy jest to ręczna implementacja wyznaczania elementu zestawu? Tak. To wszystko, co jest, i to dość dużo droga Widziałem to faktycznie odbywa się w większości gier przez lata.

Na marginesie, nie należy tego robić za każdym razem, gdy gracz zdobywa doświadczenie. Zazwyczaj śledzisz wartość „XP to go” jako jednej wartości, a gdy gracz wyczerpuje lub przekracza wartość „go to” (niezależnie od tego, w jaki sposób to robisz), obliczasz to raz, aby dowiedzieć się, gdzie naprawdę jest gracz w, zapisz to, oblicz następny „iść” minus resztki (jeśli dozwolone jest przenoszenie XP do przodu) i powtórz.

zxq9
źródło