Wie kann ich die aktuelle Stufe aus den Gesamt-EP berechnen, wenn für jede Stufe proportional mehr EP erforderlich sind?

33

In meinem Spiel ist XP, das benötigt wird, um das nächste Level zu erreichen, das aktuelle Level × Level-Schwellenwert . Wie kann ich mein aktuelles Level von den gesamten EP abrufen, die ich jemals verdient habe?


Beispielsweise:

Level Threshold = 50
Current Level = 1

Ab Stufe 1 würde ich (1 × 50) = 50 EP benötigen , um auf Stufe 2 zu gelangen, und so weiter.

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

Mit anderen Worten sieht die Fortschrittsanzeige wie folgt aus:

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

Wenn ich 300 XP habe, habe ich gerade Level 4 erreicht. Wie kann ich das generell berechnen?

Jay van Diyk
quelle
Related on Stack Overflow: Berechnung einer Dreieckswurzel ohne sqrt
Damian Yerrick
Die Menge an EP, die für das nächste Level benötigt wird, nimmt nicht zu, je höher das aktuelle Level ist.
Mast
Nun, die erste Frage, die Sie beantworten müssen, lautet: Was ist der "Schwellenwert" für jedes Level? Wenn wir nach Ihrem Beispiel davon ausgehen, dass mindestens 300 EP erforderlich sind, um Stufe 4 zu erreichen, erhöht sich der Schwellenwert nach Stufe 3 auf 75. Wenn Sie die Häufigkeit des Schwellenwertanstiegs ermittelt haben, können Sie einen Algorithmus zur Berechnung des Schwellenwerts erstellen , wie die anderen Leute versuchen, in ihren Antworten zu tun
Taegost
3
Majte gibt eine gute Antwort, wie man es berechnet, aber die "beste" Antwort ist einfach nicht, es zu berechnen .... speichere die Gesamt-Exp, aber speichere auch das aktuelle Level und das XP-Delta. Setzen Sie das Delta jedes Mal zurück, wenn Sie ein Level aufsteigen, und Sie haben alle Informationen, die Sie benötigen (Level, Level + 1, Gesamt-XP, Delta-XP), um einfach alles zu berechnen, was Sie brauchen / anzeigen
Jon Story
@ JonStory In der Tat. Ich habe dies in meiner Antwort ein wenig ausgeführt, denn wer berechnet eigentlich die ganze Zeit dynamisch den Pegel? Diese Frage ist im Wesentlichen nur eine mathematische Frage, da sie die Rolle der Ebenen innerhalb eines Spielsystems überhaupt nicht berücksichtigt.
zxq9

Antworten:

33

Wenn wir die Mathematik erarbeiten und die Levelerfahrungsbedingten Probleme lösen XP, erhalten wir:

Level=1+1+8×XP÷502

Was ist zum Beispiel die Stufe des Spielers für ?XP=300

1+1+8×300÷502=4

Wie gewünscht.

Oder wofür ist das Level XP = 100000?

1+1+8×100000÷502=63

Allgemeiner ausgedrückt für eine willkürliche Startschwelle auf Stufe 1:

Level=1+1+8×threshOld÷502

Sie können auch umgekehrt vorgehen und die XPfür ein bestimmtes Level erforderliche Menge berechnen, indem Sie die obige Formel für XP lösen.

XP=(Level2-Level)×threshOld2

Beachten Sie, dass die obige Formel mit Brüchen funktioniert, Sie jedoch auf den nächsten ganzzahligen Wert abrunden müssen. In C ++ / C # könnten Sie beispielsweise (int) Level verwenden.

Um die obige Formel in geschlossener Form zu erhalten, verwendete ich Differenzgleichungen, Gauß-Summierung und eine quadratische Formel.

Wenn Sie Schritt für Schritt an der Lösung dieser Formel interessiert sind ...

Wir machen einen rekursiven Algorithmus, indem wir unsere Überlegungen dazu letztendlich starten Experience(next_level) = Experience(current_level) + current_level*50.

Um beispielsweise , haben wir:XPLevel3

XPLevel3=XPLevel2+2×50

Woher 2*50kommt die Aufforderung des OP, dass die zum Erreichen des nächsten Levels erforderliche Erfahrung dem aktuellen Level * 50 entspricht?

Nun setzen wir mit der gleichen Logik in die Formel ein. Das ist:XpLevel2

Ersetze in die obige Formel:XPLevel2=XPLevel1+2×50

XpLevel3=XpLevel1+1×50+2×50

und ist nur 50, was unser Ausgangspunkt ist. DaherXpLevel1

XpLevel3=50+2×50=150

Wir können ein Muster für die rekursive Berechnung höherer Ebenen und eine endliche Kette von Summierungen erkennen.

XpLevelN=50+2×50+3×50+...+(N-1)×50=ich=0n-1ich×50

Wobei N das zu erreichende Niveau ist. Um die XP für das Level N zu bekommen, müssen wir nach N auflösen.

XpLevelN÷50=ich=0n-1ich

Nun ist die rechte Seite einfach eine Summation von 1 nach N-1, die durch die berühmte Gaußsche Summation ausgedrückt werden kann . DaherN×(N+1)÷2-N

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

oder nur

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

Zum Schluss alles auf eine Seite legen:

0=N2-N-2×XpLevelN÷50

Dies ist jetzt eine quadratische Formel, die eine negative und eine positive Lösung ergibt, von denen nur die positive relevant ist, da es keine negativen Niveaus gibt. Wir erhalten jetzt:

N=1+1+4×2×XpLevelN502

Der von XP und der linearen Schwelle abhängige aktuelle Pegel ist daher:

Level=1+1+8×XP÷threshold2

Hinweis: Das Kennen dieser Schritte kann hilfreich sein, um noch komplexere Abläufe zu lösen. Im RPG-Bereich sehen Sie neben einem linearen Verlauf wie hier die tatsächlich häufigere gebrochene Potenz oder quadratische Beziehung, zB . Für die eigentliche Implementierung des Spiels halte ich diese Lösung jedoch für weniger optimal, da Sie im Idealfall alle Ihre Stufenfortschritte im Voraus kennen sollten, anstatt sie zur Laufzeit zu berechnen. Für meinen eigenen Motor verwende ich deshalb vorverarbeitete Erfahrungstabellen, die flexibler und oft schneller sind. Wenn Sie jedoch zuerst diese Tabellen schreiben oder sich nur die Frage stellen, waszum Beispiel benötigt wird, um sie zu erhalten, bietet diese Formel den schnellsten Weg, um die spezifische Frage des OP zu beantworten.Level=XP5.0XPLevel 100

Bearbeiten : Diese Formel ist voll funktionsfähig , wie es sollte , und es gibt richtig die aktuellen levelabhängig XP mit einer linearen Schwelle Progression , wie durch die OP angefordert. (Die vorherige Formel gab "Level + 1" aus, indem angenommen wurde, dass der Spieler mit Level 0 angefangen hatte, was mein Fehler war. Ich hatte es in meiner Mittagspause gelöst, indem ich auf ein kleines Taschentuch schrieb! :)

Majte
quelle
Kommentare sind nicht für eine längere Diskussion gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Josh
@JoshPetrie Das Problem für uns, die wir diese Frage später gesehen haben, ist, dass der Chat-Link nicht funktioniert. Wie kann man es wiederherstellen?
14.
@MAnd Ich habe es wiederhergestellt, aber es wird in ungefähr acht Tagen von alleine wieder verschwinden.
Josh
25

Die einfache und allgemeine Lösung besteht darin, eine Schleife zu verwenden , wenn Sie diese Berechnung nicht millionenfach pro Sekunde wiederholen müssen (und wenn Sie dies tun, tun Sie wahrscheinlich etwas Falsches):

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

Der große Vorteil dieser Methode besteht nicht nur darin, dass keine komplizierte Mathematik erforderlich ist, sondern dass sie für jede beliebige Exp-per-Level-Funktion funktioniert. Wenn Sie möchten, können Sie sogar beliebige Exp-Werte pro Ebene erstellen und in einer Tabelle speichern.

Wenn Sie (aus irgendeinem seltsamen Grund) eine noch schnellere Lösung benötigen, können Sie auch den Gesamtbetrag der Exp vorberechnen, der zum Erreichen der einzelnen Ebenen erforderlich ist, diesen in einer Tabelle speichern und eine binäre Suche verwenden, um die Ebene des Spielers zu finden. Die Vorberechnung benötigt noch Zeit proportional zur Gesamtzahl der Ebenen, aber die Suche benötigt dann nur Zeit proportional zum Logarithmus der Anzahl der Ebenen.

Ilmari Karonen
quelle
4
Die flexibelste Lösung. Und da Geschwindigkeit für eine einmalige Berechnung keine Rolle spielt, denke ich am besten.
GameAlchemist
4
@Majte: Vielleicht war mir nicht klar genug. Ich schlage nicht vor , dass eine der veröffentlichten Lösungen "Millionen von Iterationen" erfordern würde. Was ich damit sagen wollte ist, dass meine (naive Brute-Force-) Lösung mehr als schnell genug ist, es sei denn, Sie müssen den Level des Spielers millionenfach pro Sekunde berechnen. Die anderen Lösungen, die auf der algebraischen Ableitung einer Formel in geschlossener Form für die Ebene als Funktion von exp basieren, sind möglicherweise noch schneller - aber für Code, der nur selten aufgerufen wird (und weniger als 1000 Mal pro Sekunde zählt mit Sicherheit als "selten" hier), wird es keinen merklichen Unterschied machen.
Ilmari Karonen
2
Ohh, ich verstehe jetzt, sorry. Ich stimme Ihnen voll und ganz zu und Sie bieten eine großartige Alternative für benutzerdefinierte Aufstiegsschritte pro Level. Verwenden Sie dann aber wahrscheinlich doch vorverarbeitete Tabellen.
Majte
2
Die Einfachheit dieser Lösung macht sie zu einem klaren Gewinner. Reduzieren Sie nicht den Wert der Lesbarkeit und Wartbarkeit.
Mauser
1
Computer sind gut darin, einfache Aufgaben zu erledigen, nicht Menschen. Sie möchten das Leben des Programmierers auf Kosten des Computers vereinfachen, falls erforderlich. Mit dieser Lösung müssen Sie nur eine Methode schreiben, die vorwärts und nicht die vorwärts und rückwärts. Die einfachste Lösung ist nicht die, die er im Code hat, sondern das Erstellen dieser Nachschlagetabelle. Ram ist billig, benutze es.
Mauser
11

Die Frage wurde mit Code beantwortet, aber ich denke, es sollte mit Mathe beantwortet werden. Jemand möchte vielleicht verstehen, anstatt nur zu kopieren und einzufügen.

XPNiveau+1=XPNiveau+NiveauSchwelle

XP

XPNiveau=(Niveau-1)NiveauSchwelle2

Niveau

Niveau=Schwelle2+8XPSchwelle2Schwelle+12

(Auf ganze Zahl abschneiden, da der Spieler alle erforderlichen EP benötigt, um einen der Bonus-Levels zu erhalten. )

MickLH
quelle
2
Ich mag diese Antwort. Klar und prägnant.
Almo
Hey Mick; Es ist schon eine Weile her, seit ich wiederkehrende Beziehungen hatte. Könnten wir nicht auch den Basisfall spezifizieren XP_Level(0) = 50und dann können wir einfach das Lösen vermeiden? Vorteile, Vor- und Nachteile? Ich denke, es wäre gut, diese Antwort zu berühren. +1
Vaughan Hilts
@VaughanHilts Ich bin mir nicht sicher, wie Ihre Notation funktioniert oder was Sie fragen. Sie können mich gerne im Spielev-Chat anpingen.
MickLH
Ich habe die Code-Antwort viel einfacher verstanden.
Pharap
Arbeite weiter daran @Pharap. Als Teenager verstand ich Code auch leichter als Mathe, aber mit Erfahrung und Wissen wird Mathe überall im Leben offensichtlich.
MickLH
10

Hier ist ein Ansatz zur Lösung des Problems mit der grundlegenden Algebra. Wenn Sie sich nicht für die Schritte interessieren, springen Sie nach unten.

Eine einfache Sache, die man sich einfallen lassen kann, ist ndie Gesamterfahrung, die man ebenötigt, um dieses Level zu erreichen:

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

Der tBegriff steht für die Erhöhung der EP, die pro Stufe benötigt wird - im Beispiel 50.

Wir können das Obige mit der Formel für arithmetische Folgen ( Summenidentität ) lösen :

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

Wir wollen jedoch die entgegengesetzte Formel - das Level des Spielers angesichts seiner Gesamterfahrung. Was wir wirklich tun wollen, ist die Lösung für das Level n. Gruppieren wir zunächst die Begriffe:

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

Jetzt können wir die quadratische Formel verwenden:

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

Endgültige Gleichung:

level = 0.5 + sqrt(1 + 8*(total experience)/(threshold)) / 2
Chaosed0
quelle
1
Danke für die Antwort. Aber was ist, wenn ich den Schwellenwert in eine andere Variable ändern möchte? Anstelle von 50 möchte ich dafür 50000 oder 1000 0 verwenden. Wie soll ich die Gleichung ändern?
JayVDiyk
2
Ja, die Lösungen sollten gleich sein. Ich wollte die Schritte zur Lösung festlegen, falls sich jemand dafür interessiert. @JayVDiyk - bearbeitet den Beitrag.
Chaosed0
Das war ein bisschen frech von dir, als ich kommentierte, dass ich die vollständige Lösung nach der Arbeit posten werde;) Es ist in Ordnung, das macht mir nichts aus. Normalerweise antworten Sie mit einem Verweis auf die richtige Antwort und notieren die Erweiterung. Nerver dagegen liebte es, es gelöst zu haben. Wünschte, weitere Fragen wie diese wurden hier gepostet.
Majte
Entschuldigung, muss diesen Kommentar verpasst haben. Wollte es nicht unter dir wegnehmen oder so - ich werde es das nächste Mal im Hinterkopf behalten. Deine Antwort ist definitiv gründlicher als meine nach der Bearbeitung!
Chaosed0
1
+1; Ich persönlich finde Ihre Erklärung lesbarer, ohne dass dies einen Verstoß gegen @Majte zur Folge hat.
Ilmari Karonen
3

Es ist aus den verschiedensten Gründen sehr wichtig , alle mathematischen Aspekte zu kennen, von denen einige für die Spieleentwicklung relevant sind.

ABER

Dies ist eine Spieleentwicklungs-Site, keine Mathe-Site. Lassen Sie uns also diskutieren, wie diese Dinge nicht als algorithmische Reihen, sondern als Mengen funktionieren , denn dies ist die Art von Mathematik, die für das Leveling in Spielen gilt, die Sie möglicherweise entwickeln, um sie zu verkaufen, und dies ist das System, das dem meisten (aber nicht allen) Leveling zugrunde liegt Systeme (zumindest historisch).

Spieler bevorzugen nette, runde Zahlen, die leicht zu merken und zu visualisieren sind. Nirgendwo ist dies wichtiger als in einem Level-basierten Spielsystem, in dem der Spieler X xp-Beträge benötigt, um auf Level Y aufzusteigen.

Es gibt zwei gute Gründe für die Auswahl von runden Zahlen:

  • Die Level-Erfahrung selbst ist eine nette, runde Zahl "100; 200; 1.000.000; etc."
  • Das Delta zwischen den Levels ist in der Regel eine weitere nette, runde Zahl, auf die der Spieler einen Blick werfen und in seinem Kopf rechnen kann.

Runde Zahlen machen Spaß. Der Zweck von Spielen ist es, Spaß zu haben. Angenehmes Verhalten ist wichtig, zumal das Spieldilemma von Natur aus oft alles andere als angenehm ist.

Warum ist das wichtig zu beachten?

Die meisten Algorithmen für zusammengesetzte Reihen erzeugen keine schönen runden Zahlen

Die meisten Serien hören nicht an einem hübschen Punkt auf (jede Antwort, die ich bisher hier gesehen habe, geht einfach für immer weiter). Also, was machen wir? Wir nähern uns und bestimmen dann , welche Ebenen für das Spielsystem gelten sollen .

Woher wissen wir, welche Annäherungen angemessen sind? Wir überlegen, wozu das Leveln im Spielsystem gut ist.

Die meisten Spiele haben Level-Caps, die irgendwann einsetzen. Dies kann auf verschiedene Arten geschehen:

  • Die Obergrenze wird relativ früh erreicht, da das Level-System nur dazu dient, den Spielern zu helfen, die erste Phase des Spiels gezielt zu durchlaufen, um sie zu zwingen, das gesamte Spielsystem zu erlernen. Sobald sie "ausgewachsen" sind, beginnt das lange Spiel.
  • XP Gain VS der Schwierigkeitsgrad hat eine gewisse Wirtschaftlichkeit, wo ja, es gibt eine Levelobergrenze, aber es ist so weit weg, dass wir davon ausgehen, dass die Spieler das Spiel in der Mitte der Level-Tabelle abschließen werden. In RPGs im DQ / FF-Stil mit mehreren Charakteren / Klassen ist es üblicher, dass unterschiedliche Charaktere / Klassen durch das Sammeln von Erfahrung mit unterschiedlichen Raten einfacher zum Level gemacht werden , als das Ändern der erforderlichen EP für jedes Level pro Charakterklasse . Auf diese Weise können sich die Spieler die niedlichen kleinen runden Zahlen leicht als universelle Ziele merken und wissen, dass jeder Charakter mit einer vom Spielsystem ( XP + (XP * Modifier)oder was auch immer) festgelegten willkürlichen Geschwindigkeit auf sie zukommt.
  • Level Caps basieren auf der Kategorie der externen Charaktere. Das heißt, ein Faktor außerhalb des eigentlichen Spielsystems bestimmt, wie das Level-System aussieht. Dies wird immer häufiger, da viele Spiele kostenpflichtig, aber kostenlos sind. Ein freier Spieler kann auf Stufe 70 begrenzt sein, ein Abonnent kann auf Stufe 80 begrenzt sein, ein einmaliger Kauf kann jemandem eine Stufe über eine universelle Obergrenze hinaus bringen, usw.
  • Level-Caps sind universell und in gewisser Weise an die Spielwelt gebunden. Dieses System wurde von WoW populär gemacht.
  • Jedes andere Level-Cap-System, das Sie sich vorstellen können und das das Gameplay auf intelligentere Weise verbessert, als Spieler dafür zu belohnen, dass sie mehr Minuten ihres Lebens in Ihrer erfundenen Welt als die anderen Spieler verschwendet haben.

Es gibt einige Spielsysteme, bei denen es keine Obergrenze gibt und das System algorithmisch bestimmt wird. Normalerweise verwenden Systeme wie dieses ein X-Potenzen-Y-System, um die Zahlen schnell explodieren zu lassen. Dies macht es sehr einfach, Level L-1 zu erreichen. Es ist vernünftigerweise zu erwarten, dass die meisten Spieler Level L erreichen werden. Es ist außerordentlich schwierig, Level L + 1 zu erreichen, und die Spieler werden älter und sterben, bevor sie L + 2 erreichen. In diesem Fall ist "L" ein Level, von dem Sie sich entschieden haben, dass es das für das Spiel geeignete Ziellevel ist, bei dem das System normalerweise begrenzt worden wäre, aber die Option für Leute offen lässt, die sich vormachen, es sei für immer eine gute Idee für XP. (Unheimlich!) In dieser Art von System ist die hier gefundene Mathematik absolut sinnvoll. Aber es ist ein sehr enger und selten anzutreffender Fall in echten Spielen.

Also, was machen wir?

Level und XP berechnen ? Nein. Level und XP bestimmen ? Ja.

Sie bestimmen, was Ebenen bedeuten, und dann, welche verfügbaren Ebenen verfügbar sein sollen. Diese Entscheidung hängt von der Granularität des Spielsystems ab (Gibt es einen großen Unterschied in der Stärke zwischen den Levels? Verleiht jedes Level eine neue Fähigkeit? Usw.) und davon, ob Levels selbst als Gating-System verwendet werden oder nicht ("Kann nicht") Gehe in die nächste Stadt, bis du Level 10, Junge. "bist, oder ein wettbewerbsfähiges Leitersystem erzwingt Level-basierte Stufen usw.).

Der Code dafür ist ziemlich einfach und dient lediglich der Bereichsbestimmung:

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

Oder mit einer if-Anweisung oder einem case oder einer Kette von if / elif oder mit welcher Sprache auch immer, die Sie gerade verwenden. (Dieser Teil ist das am wenigsten interessante Element eines Spielsystems gerade im Erlang-Modus sein, und die obige Syntax ist möglicherweise nicht für alle offensichtlich.):

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

Ist es erstaunlich, Mathe? Nein überhaupt nicht. Handelt es sich um eine manuelle Implementierung der Mengenelementermittlung? Ja. Das ist alles , es ist, und das ist so ziemlich so , wie ich es gesehen habe tatsächlich in den meisten Spielen im Laufe der Jahre getan.

Als Randnotiz sollte dies nicht jedes Mal geschehen, wenn der Spieler Erfahrung sammelt. Normalerweise verfolgst du "XP to go" als einen Wert und sobald der Spieler den "to go" -Wert erschöpft oder überschreitet (auf welche Weise auch immer du es tust), berechnest du diesen einmal, um herauszufinden, wo der Spieler wirklich ist Speichern Sie das, berechnen Sie das nächste "to go" abzüglich des verbleibenden Restbetrags (sofern das Mitführen von XP erlaubt ist) und wiederholen Sie den Vorgang.

zxq9
quelle