Einfache Abnahme der Rendite mit Kappe


19

Problem

Der Spieler erhält 5 Punkte pro Level bis zu Level 80 mit einem Maximum von 400. Es gibt 5 Statistiken, auf die verteilt werden kann, und keine Obergrenze, wie viel Sie zu einer Statistik hinzufügen können.

  • Stärke
  • Ausdauer
  • Intelligenz
  • Beweglichkeit
  • Glück - Gewährt kritische Chance und kritischen Schaden

Ich würde gerne eine abnehmende Renditegleichung auf Lass uns Glück sagen implementieren. Bei einem kritischen Treffer möchte ich nicht, dass der Spieler einen kritischen Treffer von 100% erzielt.

Es wird eine Obergrenze geben, die erreicht wird, wenn das zunehmend abnehmende Wachstum gegen 0 je hinzugefügten Punkt geht.

Beispiel: Wenn die maximale kritische Chance, die der Spieler haben soll, 40% beträgt, erhöht jeder Glückspunkt die kritische Chance immer weniger, bis die kritische Chance etwa 40% erreicht. Womit 1 Glück eine sehr sehr winzige Menge ergibt.

Irgendwelche Lösungen? Vielen Dank und Ihre Hilfe wird sehr geschätzt!


Mögliches Duplikat von Wie man RPG-Schadensformeln entwickelt? - tl; dr das Stichwort, das Sie suchen, ist Sigmoid-Kurve
BlueRaja - Danny Pflughoeft

@ BlueRaja Ich denke, das ist kein Duplikat. Bei dieser Frage geht es im Allgemeinen um Funktionen zur Verminderung der Rendite - bei der einen um die Schadensberechnung. Die Antworten auf diese Fragen haben sich zwar größtenteils mit Funktionen zur Verringerung der Rendite befasst, aber ich denke, die Fragen sind immer noch deutlich unterschiedlich.
Anko

Antworten:


30

Sie möchten mit einer asymptotischen Funktion beginnen. Das heißt, einer, der bei einer Zahl beginnt aund sich einer anderen Zahl nähert b, diese aber nie erreicht. Es wird wahrscheinlich am einfachsten sein, wenn a = 0und b = 1. Sie nehmen diese Gleichung, geben die Anzahl der Statistikpunkte (Glückspunkte) des Charakters ein und erhalten den tatsächlichen Statistikwert (Crit Chance) als Ausgabe.

Ein sehr einfaches Beispiel ist, y = x / (x + n)wo neine positive Konstante ist. Hier xist Ihre Eingabe, bei der Sie die Anzahl der Statistikpunkte eingeben, und yIhre Ausgabe, bei der Sie den endgültigen Statistikwert erhalten.

Um n = 5herauszufinden, wie es aussieht:

y = x / (x + 5) Diagramm für x in [0,100]

Wenn du fütterst x = 0, bekommst du es y = 0, aber egal wie groß xdu hineingesteckt hast, erreichst du ynie ganz 1. Perfekt.

Jetzt können Sie dies auf Ihren Herzenswunsch abstimmen. Sie können mit einem Skalierungsfaktor multiplizieren, um die Obergrenze auf das zu setzen, was Sie möchten. y = a * x / (x + 5). Wenn die Obergrenze 40% betragen soll, multiplizieren Sie sie mit 0,4. y = .4 * x / (x + n). Jetzt, wenn Sie in x's füttern , ywird sich erhöhen, aber es wird nie ganz .4 erreichen.

Stellen Sie ein n, wie schnell oder langsam die Gleichung ansteigt. n = 100wird viel langsamer zunehmen als n = 5:

y = x / (x + 100) Diagramm für x in [0,400]

Sie können diese Gleichung lösen, nwenn Sie wissen, dass Sie den gewünschten Statistikwert an einer bestimmten Anzahl von Statistikpunkten erreichen möchten. Nehmen wir an, der Charakter sollte bei 100 Glückspunkten eine Chance von 35% auf kritische Treffer haben. Die Lösung .35 = .4 * 100 / (100 + n)für die nRenditen n = 14.29.

Diese Zahlen müssen auch keine Rohkonstanten sein. Vielleicht gehen andere Statistiken in die Berechnung der Werte von n. Möglicherweise haben einige Charaktere unterschiedliche nWerte, so dass sie in ihrem bevorzugten Wert besser skalieren können.

Wenn Sie eine Kurve wünschen, die anders geformt oder komplexer ist, gibt es viele andere Beispiele für asymptotische Funktionen, die Sie ebenfalls verwenden können. Ich überlasse es Ihnen, das zu erkunden, wie Sie es wünschen.


3
Meine Lieblingskurve ist die Exponentialkurve. Nehmen Sie einfach ein festes Verhältnis des verbleibenden Pools mit jedem Level.
John Dvorak

Kannst du der Vollständigkeit halber ein Beispiel geben? Es gibt viele Exponentialkurven und ein Leser weiß möglicherweise nicht, wie er Ihren Vorschlag allein aus dem vorherigen Kommentar anwenden soll.
Adam

Dies ist ein guter Ausgangspunkt, und die Mathematik wird gut erklärt. Denken Sie jedoch daran, dass Sie nicht einfach eine Funktion auswählen können, die gut aussieht. Dieses Problem erfordert sorgfältige Überlegungen und viele Optimierungen. Ein Nachteil dieser Methode ist beispielsweise, dass sie von der Spezialisierung abhält. Wenn alle fünf Statistiken gleich gut sind, sind die Punkte, die für die am wenigsten entwickelte Statistik ausgegeben werden, die wertvollsten (und die am wenigsten entwickelten). Der ideale Build wäre eine gleichmäßige Verteilung der Punkte, was die Entscheidung des Spielers, wie sie ausgegeben werden sollen, weniger interessant macht.
Marcks Thomas

@MarcksThomas Das setzt keine Synergie zwischen Attributen oder die Fähigkeit voraus, ein Attribut taktisch zu isolieren und damit zu "gewinnen". Stellen Sie sich zum Beispiel einen erstaunlichen Bogenschützen vor, der seine Beweglichkeit so weit erhöht, dass Feinde sterben, bevor sie ihn erreichen: Selbst wenn die Beweglichkeit nachlässt, macht die gewählte Taktik die anderen Attribute unwichtig. Eine andere Taktik, bei der Stärke eine Rolle spielt, ist möglicherweise ebenso effektiv, sodass die Attribute "gleichwertig" sind. Taktiken bedeuten jedoch häufig, dass Spezialisierung vorherrscht. Wenn Ihr Attribut-System auch Spezialisierung belohnt, läuft das Spiel auseinander.
Yakk

Ich nenne das das "Steine ​​aus einer Tüte ziehen" -System. Der Wert P = x/(x+n)ist die Wahrscheinlichkeit, mit der Sie bei einer Tüte mit n schwarzen und x weißen Steinen einen weißen Stein aus der Tüte ziehen. Ein Ansatz, den Sie tun können, besteht darin, Crits auf X = Ihr Glück und N = ihr Glück zu setzen. Ihre Chance auf Kritik beträgt dann 50%, wenn Sie dasselbe Glück wie Ihr Gegner haben. Wenn Sie möchten, dass die Grundchance 10% beträgt, dann sind wir X = Ihr Glück, N = 9x ihr Glück.
Yakk

10

Eine gute Basis wäre eine Funktion wie arctan, da sie den Ursprung durchläuft und eine horizontale Asymptote aufweist.

arctan

Skaliere es nach 40 / (pi/2)oder 80/pifür dein gewünschtes Limit. Dann transformieren luck, um die gewünschte Kurvensteilheit zu erhalten.

critical = 80/pi * arctan(f(luck))

8

Mir gefällt die Art und Weise, wie die Souls-Spiele dieses Problem angehen. Anstatt dass jede Statistik Boni basierend auf einer kontinuierlichen Funktion gibt, wie vorgeschlagen wurde, gibt es Boni in einer stückweise linearen Funktion.

Ich kann mich nicht an die exakten Zahlen auf meinem Kopf erinnern, aber die Funktionen sind wie folgt (jeder Wert hat seine eigenen Konstanten)

{0 <= x <20: y = 4x, 20 <= x <30: y = 3x + 20, 30 <= x <40: y = 2x + 50, 40 <= x <60: y = 1x + 90 , 60 <= x: y = 0,5x + 120}

Handlung

Diese Methode bietet dem Designer und dem Spieler viele Vorteile. Der Designer profitiert, da Sie den genauen Nutzen pro Punkt in einer Fertigkeit ziemlich trivial einstellen können, und der Spieler profitiert, da er genau weiß, wie viel Nutzen er von Stufe zu Stufe sehen wird.

Im Fall einer kontinuierlichen Funktion bieten einige Pegel möglicherweise einen Vorteil, der sich aufgrund von Mess-Aliasing nicht in den Zahlen widerspiegelt. Sicher, dieses letzte Level hat zu einer Erhöhung des Bonus XYZ um 0,9 geführt, aber seit der tatsächliche Wert von 23,52 auf 24,42 gestiegen ist und Sie die Zahl vor der Anzeige gerundet haben, merkt der Spieler nicht, dass sich etwas geändert hat.

Aus UX-Sicht würde ich definitiv vorschlagen, eine stückweise lineare Funktion zu verwenden. Die Verwendung einer kontinuierlichen Funktion kann jedoch später einfacher sein, da die Spieler nicht so an runde Konstanten gebunden sind.


1
Annäherung einer Kurve, die nicht viel Mathematik erfordert und einfach zu ändern ist. Ich mag das. :)
Casey Kuball

> Sie runden die Zahl, bevor Sie sie anzeigen => Eine Möglichkeit zur Kompensation besteht darin, ceilden Betrag vor dem Hinzufügen zu erhöhen und nur ganzzahlige Statistikstufen zuzulassen. oder floordann x <= 0: x = 1zu vermeiden , versehentlich die weiche Kappe gehen über.
Bob

1
Sie können zwar immer noch eine stückweise Funktion ausführen, sie hat jedoch nicht den gewünschten Effekt. Der Glückswert ist ein Prozentsatz mit einer maximalen Bewertung von 400. Das bedeutet , jede Bewertung Punkt muss in einem Unter 1% an Wert gewinnen, auch in einer linearen Funktion mit 100% Glück führen. Der Trick zeigt gerade genug Dezimalpunkte, dass y (399) sich von y (400) unterscheidet. Ihre Funktion bewirkt dasselbe, indem sie y sehr groß werden lässt, sodass Erhöhungen immer ganzzahlig sein können. Bei x = 40 ist y mehr als das Vierfache des Wertes von x.
MichaelS

@MichaelS Ich gab nur ein Beispiel für die Art der Funktion, die in Dark Souls verwendet wird. Es müsste je nach der Situation, auf die es angewendet wird, unterschiedlich ausbalanciert werden, aber meiner Meinung nach werden die Spieler den Effekt einer stückweisen linearen Funktion viel leichter verstehen als eine Arcustangens-Kurve oder einen Kegelschnitt.
Kaslai

3

Jan Dvorak weist in einem Kommentar auf die Exponentialfunktion hin. Ich erkläre es hier.

Beachten Sie, dass Exponential- (und Trigger-) Operationen erheblich rechenintensiver sind als Quadratwurzeloperationen, die selbst weitaus schlechter sind als die Grundrechenarten. Wenn Sie diese Berechnungen also mehrmals pro Sekunde ausführen, sind Sie wahrscheinlich besser mit Adams Ansatz vertraut . Wenn Sie nur die Werte berechnen, wenn der Spieler das Level erreicht, die Ausrüstung ändert usw., ist die Geschwindigkeit nicht wichtig. Verwenden Sie also, was Ihnen die beste Kurve gibt.

Eine Exponentialfunktion ist einige Base, B , bis zu einem gewissen Leistung, x , y=B^x. Mathematiker verwenden gewöhnlich eine Basis von e (~ = 2.718), aber es gibt keinen Grund, warum Sie 2 oder 10 nicht verwenden können, wenn Sie es vorziehen.

y=e^x sieht aus wie das: y = e ^ x

Beachten Sie die linke Seite bewegt asympotically auf 0 , so dass wir die x-Achse , indem Sie drehen können y=e^(-x) , aber es ist absteigend nach wie vor von 1 auf 0 , und wir wollen es aufzusteigen. Also können wir es mit y=- um die y-Achse drehen e^(-x). Jetzt steigt es von -1 nach 0 auf. Wir können 1 addieren, um y=1 zu erhalten, - e^(-x)und es steigt von 0 nach 1 auf.

y = 1-e ^ (- x)

Von hier aus geht es nur noch darum, es vertikal und horizontal zu skalieren. Wir können das Ganze mit einem Wert multiplizieren, nennen wir es A , der die asymptotische Grenze setzt. Dann können wir x mit einem Wert für die Änderungsrate k multiplizieren , um anzupassen, wie schnell das Limit erreicht wird.

Dies gibt uns eine endgültige Gleichung von y=A*(1 - e^(-k*x)). Mit den Werten von k=0.012und A=0.5können wir den Grenzwert auf 50% setzen und ihn ungefähr an diesen Grenzwert annähern x=400.

y = 0,5 * (1-e ^ (- 0,012 * k))

Jetzt können Sie einige Änderungen daran vornehmen. Eine von mir vorgenommene A=0.5041Optimierung wurde auf geändert. Wenn wir also auf einen Prozentsatz mit 2 Dezimalstellen (wie 32,23%) runden, ist y (399) = 49,99% und y (400) = 50,00%. Ab y (347) gibt es mehrere Stellen, an denen zwei Punkte erforderlich sind, um eine Änderung von 0,01% zu erzielen. Aber dieser letztmögliche Punkt bringt immer noch einen (kaum) greifbaren Vorteil und bringt ihn auf gerade 50%.

Alternativ könnten wir den kWert optimieren , um einen ähnlichen Effekt zu erzielen. Auf k=0.02305die Wert Runden zu 49,99% auf y=39950,00% an y=400. Dies hat jedoch das Problem, dass die Grafik am Ende sehr flach ist - es werden 48 Punkte benötigt, um das letzte Hundertstel Prozent (von y(352)=49.99%bis y(399)=49.99%bis y(400)=50.00%) zu erhalten, und die letzte 1% -kritische Chance benötigt satte 230 Punkte (von y(170)=49.01%bis y(400)=50.00%). Das ist wahrscheinlich ein bisschen zu nachlassend für die Rendite.

Wenn Sie möchten, können Sie sowohl A als auch k so einstellen, dass sie langsamer auf einen etwas höheren Grenzwert abfallen, um einen Wert zwischen linearem und exponentiellem Abfall zu erhalten. Dabei erhalten Sie Folgendes y=0.6*(1-e^(-0.00447*x)): y = 0,6 * (1-e ^ (- 0,00447 * x))

Beachten Sie, dass die Kurve nach 50% fortgesetzt wird, aber da es ein hartes Limit von 400 gibt, kann der Spieler diesen Punkt nicht überschreiten (und wenn er es schafft, gibt es immer noch ein hartes Limit von 60% krit.). Mit dieser Gleichung können Sie 1 Dezimalstelle verwenden und trotzdem alle 2 bis 3 Punkte Gewinne sehen, mit einem abschließenden Häkchen von y(399)=49.9%bis y(400)=50.0%.

Mathematisch gesehen scheinen die früheren Gleichungen vielleicht besser zu sein, da sie sich tatsächlich 50% nähern, aber ich persönlich denke, dass sich Gewinne von 0,1% alle paar Punkte besser anfühlen als Gewinne von 0,01%. Sogar mit A=0.05041und k=0.012sind 102 Punkte nötig, um von y(298)=49.00%zu zu gelangen y(400)=50.00%. 25% Ihrer Punkteausgaben für 2% Ihrer Kritikpunkte sind wahrscheinlich zu gering. Die 60% -Gleichung nimmt nur 20 Punkte für das letzte Prozent an (was immer noch 5-mal höher ist als die 4 Punkte, die für das erste Prozent benötigt werden).

Mit diesen letzten Gleichungen habe ich die Gleichungen einfach in eine Tabelle eingefügt und die Werte manuell angepasst, bis sie gut ausgesehen haben. Sie müssten etwas Ähnliches tun, wenn Sie eine andere Kappe wollten.


2
Der Hinweis zur relativen Geschwindigkeit von mathematischen Operationen ist korrekt, für Spielerstatistiken jedoch wahrscheinlich irrelevant. Engpässe in modernen Spielen sind in der Regel die Ursache für viele tausend Elemente pro Frame (z. B. Physik und Rendering). Gameplay-Skripte, die wahrscheinlich ein paar Dutzend Mal pro Frame ausgeführt werden, sind im Vergleich dazu wahrscheinlich kein Ausrutscher, und sie sind im Allgemeinen sowieso voller Cache-Ausfälle, was der CPU viel Zeit lässt, um mit den Daumen nach Belieben zu rechnen. tl; dr: Fühlen Sie sich nicht unter Druck gesetzt, teure Operationen zu vermeiden, es sei denn, Sie schreiben Shader oder andere
Dinge

-1

Wie wäre es mit Quadratwurzel x 2 für eine sehr einfache Lösung?

Die Quadratwurzel von 400 (maximal möglich) ist 20, 20 * 2 = 40.


Warum die Abwahlen? Es löst die gestellte Frage und ist einfach, was auch gefragt wurde.
Catwood

1
Ich bin nicht der Abwähler, aber es war wahrscheinlich, weil Ihre Antwort zu spezifisch ist und keine Informationen liefert, die noch nicht bereitgestellt wurden (eine Quadratwurzel ist nur eine Potenzierung zur Potenz von 1/2), und Sie erklären das nicht Gründe, warum dies nützlich sein könnte.
Kaslai

Ich habe nicht abgelehnt, aber ich denke nicht, dass dies eine gute Antwort ist, da es nicht sehr flexibel ist - Quadratwurzel ist nicht asymptotisch. Wenn sich also der Maximalpegel jemals ändert, müssen Sie die Formel ändern, um den Maximalpegel beizubehalten stat das gleiche.
BlueRaja - Danny Pflughoeft
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.