Ideen für Angriffsschadensalgorithmus (Sprache irrelevant)

8

Ich arbeite an einem Spiel und brauche Ideen für den Schaden, der dem Feind zugefügt wird, wenn Ihr Spieler angreift. Die Gesamtmenge an Gesundheit, die der Feind hat, wird aufgerufen enemyHealthund hat einen Wert von 1000. Sie beginnen mit einer Waffe, die 40 Schadenspunkte verursacht (kann geändert werden). Der Spieler hat einen Angriffsstatus, den Sie erhöhen können playerAttack. Dieser Wert beginnt bei 1 und hat einen möglichen Maximalwert von 100, nachdem Sie ihn mehrmals erhöht und weiter ins Spiel gebracht haben. Die Menge an Schaden, die die Waffe anrichtet, ist geschnitten und trocken und zieht jedes Mal, wenn der Feind getroffen wird, 40 Punkte von den insgesamt 1000 Gesundheitspunkten ab. Aber was das playerAttackmacht, ist, diesen Wert mit einem Prozentsatz zu addieren. Hier ist der Algorithmus, den ich jetzt habe. (Ich habe alle GUI, Klassen usw. herausgenommen und den Variablen sehr vorwärtsgerichtete Namen gegeben)

double totalDamage = weaponDamage + (weaponDamage*(playerAttack*.05))
enemyHealth -= (int)totalDamage;

Dies schien größtenteils großartig zu funktionieren. Also habe ich einige Werte getestet ...

//enemyHealth ALWAYS starts at 1000
weaponDamage = 50;
playerAttack = 30;

Wenn ich diese Werte einstelle, beträgt der Schaden, der dem Feind zugefügt wird, 125. Es schien eine gute Zahl zu sein, also wollte ich sehen, was passieren würde, wenn der Angriff des Spielers maximal wäre, aber mit der schwächsten Startwaffe.

weaponDamage = 50;
playerAttack = 100;

Der Gesamtschaden beträgt 300, was einen Feind in nur wenigen Treffern töten würde. Selbst wenn Ihr Angriff so hoch ist, möchte ich nicht, dass die schwächste Waffe den Feind so schnell töten kann. Ich habe darüber nachgedacht, Verteidigung hinzuzufügen, aber ich habe das Gefühl, dass das Spiel an Konsistenz verlieren und auf lange Sicht aus dem Gleichgewicht geraten wird. Möglicherweise funktioniert ein gut konzipierter Algorithmus für einen Waffenverringerungsmodifikator für Waffen niedrigerer Stufe oder ähnliches. Ich brauche nur eine Pause, um herauszufinden, wie ich am besten vorgehen kann, und vielleicht könnte mir jemand, der Erfahrung mit Spielen hat und das Leveling konsistent hält, einige Ideen / Hinweise geben.

Dillon
quelle
2
Ich denke, wir brauchen etwas mehr Informationen. Wie einfach ist es, deine playerAttackStatistik auf 100 zu bringen? Wenn man bedenkt, dass dies der Maximalwert ist, wäre es nicht angemessen, den Feind mit wenigen Treffern zu töten? (Ist der 1000-HP-Feind etwas, das Sie zu Beginn des Spiels sehen würden? Ein Standard-Feind? Boss?)
Lee

Antworten:

14

Die Antwort von Grzegorz Sławecki ist bereits gut, aber ich wollte die Gründe für seine Methode erläutern und Ihnen die Werkzeuge geben, um die Lösungen an Ihre Spielanforderungen anzupassen.

Die Parameter des vorliegenden Problems sind die Angriffsstufe a des Spielers , der Waffenschaden w , der Gesamtschaden in einem Angriff d , die Gesundheit des Feindes H und die Mindestanzahl an Treffern, die erforderlich sind, um den Feind zu töten. Nennen wir es n .

Wenn Sie möchten, dass der Spieler in n Treffern tötet , muss sein Gesamtschaden d so sein, dass

(n-1) .d <H ≤ nd    oder mit anderen Worten, n = Ceil (H / d) .

d hängt vom Waffenschaden w und von der Angriffsstufe a des Spielers ab. Wir können erwarten, dass die Waffen mit zunehmender Stufe besser werden. Schreiben wir also d (a) und w (a) anstelle von einfach d und w . Es wird auch erwartet, dass die Feinde, denen der Spieler gegenübersteht, härter werden, also wieder H (a) . Dies sind alles zunehmende Funktionen von a , und Sie möchten, dass sie die obigen Ungleichungen erfüllen. Die Unbekannten des Problems sind Funktionen. Sie legen eine als Einschränkung fest und finden die anderen. Sie haben jedoch Freiheitsgrade, was gut ist.

Wenn ich Ihre Frage gut verstehe, haben Sie ein genaues Gameplay im Sinn, und dieses Gameplay wird hier hauptsächlich durch die Anzahl der Treffer dargestellt, die erforderlich sind, um den Feind zu töten, n (a) . Daher Satz n (a) je nach Spiel Sie für das Spiel vorstellen und dann den Rest der Variablen des Problems finden . Dies sollten Sie immer tun, da Ihr erster Versuch, wie Ihre Frage zeigt, darin bestand, einen Algorithmus auszuprobieren, von dem Sie dachten, dass er dies tun könnte, und dann erkannte, dass dies zu einem unerwünschten Gameplay führte.

Nehmen wir zum Beispiel an, Sie möchten, dass der Spieler im Verlauf des Spiels immer öfter schlagen muss. Sie möchten auch, dass die erforderliche Anzahl von Treffern immer seltener zunimmt, sodass der Spieler einen längeren Teil des Spiels damit verbringt, fünfmal als zweimal zu schlagen. So sieht n (a) aus:

das gewünschte n (a)

Die verwendete Funktion ist n (a) = Ceil (2 / 3.sqrt (a)) .

Wir wollen, dass H (a) / d (a) innerhalb der Wertebereiche bleibt, die n (a) den gewünschten Wert haben, und da n (a) = Ceil (H (a) / d (a)) , diese Bereiche sind die folgenden Rechtecke:

n (a) und n (a) -1

und H (a) / d (a) kann natürlich auf 2 / 3.sqrt (a) gesetzt werden, so dass wir den folgenden Graphen erhalten, wobei die rote Kurve H (a) / d (a) ist :

n (a), n (a) -1 und H (a) / d (a)

Bemerkung: Wir können H (a) / d (a) hier leicht finden , weil wir wissen, welche Funktion n (a) die Decke ist, aber wenn unsere Spezifikation für n weniger schön wäre, müssten wir unsere eigene Anpassung vornehmen Funktion mit verschiedenen Tricks. Nicht alle Probleme sind so schön!

Wir möchten also, dass H (a) / d (a) einer benutzerdefinierten Quadratwurzelfunktion ähnelt, und wir wissen, dass H und d Funktionen erhöhen müssen. Es gibt viele Lösungen. Zum Beispiel,

H (a) = a. 2 / 3.sqrt (a)    und    d (a) = a

Eine erste Lösung für H und d

Aber wir möchten, dass der Schaden und die HP des Feindes sehr stark zunehmen, so dass es am Ende des Spiels große, beeindruckende Zahlen gibt, nur für den Stil, also setzen wir stattdessen

H (a) = a². 20 / 3.sqrt (a)    und    d (a) = 10.a²

Eine bessere Lösung für H und d

Der springende Punkt und das Beste daran ist: Sie wissen, dass Ihre Lösungen für das Problem ( H (a) und d (a) ) den Spezifikationen ( n (a) ) entsprechen, sodass Sie das gleiche n (a) erhalten. , aber du hast Freiheit. Sie kennen genau die Freiheit, die Sie haben, und können sie verwenden, um die Erfahrung anzupassen. Sie sollten immer versuchen, sich diese Freiheit zu geben und gleichzeitig Ihre wichtigsten Bedürfnisse zu befriedigen, wann immer dies möglich ist.

Nachdem wir den Ein-Treffer-Schaden d (a) gewählt haben und d (a) vom Waffenschaden w (a) abhängt , können wir d (a) als Spezifikation verwenden und versuchen, ein w (a) zu finden ) das gibt uns dieses d (a) . Die Prinzipien sind die gleichen, das Problem ist anders: Wir möchten, dass der Spieler mit zunehmendem Level mehr Schaden verursacht, auch wenn die Waffe gleich bleibt, und wir möchten, dass der Schaden steigt, wenn die Waffe alleine besser wird und das Level bleibt das Gleiche.

Aber welche Bedeutung sollte jeder Faktor haben? Nehmen wir an, wir wollen, dass das Level wichtiger ist als Waffen: Ein größerer Teil der Variationen von d (a) = a² sollte unabhängig von w (a) sein , zum Beispiel mit

w (a) = 22.sqrt (a)    und daher    d (a) = (22.sqrt (a)). (10 / 22.a.sqrt (a)) = w (a). (10 / 22.a.sqrt (a))

Wir erhalten die folgende Grafik für w (a) ...

w (a)

... und immer noch das gleiche d (a) , weil wir wieder eine Lösung gefunden haben, die der Spezifikation entsprach , hier d (a) , und wir haben die oben genannten Eigenschaften mit w und a , die zum Schaden beitragen (nehmen wir an, wir schauen uns an d als Funktion von a und w : Wenn a fest wäre und wir w in der Gleichung d (a, w) = a / 30.w variieren würden , wäre d immer noch eine zunehmende Funktion von w , und das Gleiche gilt wenn Sie w beheben und eine Änderung vornehmen ).

Dieses w (a) könnte Ihnen den Wert geben, der in der Ingame-Beschreibung der Waffe angezeigt werden soll: Wir würden zum Beispiel "Waffenschaden: 220" mit der besten Waffe im Spiel erhalten.

Wir hätten eine völlig andere Spezifikation für unser Gameplay und damit für n (a) verwenden können , zum Beispiel eine, bei der die Anzahl der erforderlichen Treffer im Verlauf des Spiels schnell zunimmt und dann ein Plateau erreicht, und die resultierenden Lösungen wären anders gewesen.

jrsala
quelle
Dies kombiniert ein fundiertes Verständnis der Mathematik mit dem Gameplay als Ausgangspunkt. Eine ausgezeichnete Antwort.
Marcks Thomas
1
@MarcksThomas Na danke! Ich wünschte, mehr Menschen hätten ihre Bedürfnisse klar definiert und ihre Spiele von dort aus aufgebaut. Auf diese Weise würden wir vollständigere, fertiggestellte Qualitätsspiele sehen.
jrsala
Ja, ich stimme zu, dass dies die perfekte Antwort ist. Ich habe das gerne gelesen :)
Grzegorz Sławecki
1
Fantastisch! Ich wünschte, diese Art von Mathematik wäre ein regelmäßigerer Bestandteil der Literatur zum Systemdesign. (Vielleicht sollte ich irgendwann meinen Aufsatz über Schaden gegen Schilde schreiben ...)
Steven Stadnicki
Gute Antwort, aber warum müssen Sie in Ihren Gleichungen Variablen mit einem Zeichen verwenden? Wie oft frage ich: "Wofür asteht wieder?" und nach oben scrollen?
Daniel Kaplan
9

Ich würde Ihnen empfehlen, Ihr Spiel aus der anderen Richtung zu gestalten: Überlegen Sie sich zunächst, wie Ihr Spiel gespielt werden soll (in Bezug auf die Spielerfahrung, nicht in Bezug auf die Zahlen), und entwerfen Sie dann sowohl die Formeln als auch die Zahlenbereiche, die Sie erhalten möchten das Ergebnis.

Ihr Spielziel ist, dass eine bestimmte Anzahl von Treffern erforderlich ist, um einen Feind zu töten. Wie viele Treffer hängen von drei Variablen ab:

  • Machtstufe des Feindes
  • Leistungsstufe des Charakters
  • Leistungsstufe der Waffe

Sie sollten zuerst eine Tabelle aller möglichen Kombinationen dieser drei Variablen erstellen, die niedrig, mittel oder hoch sind (noch keine konkreten Zahlen, nur "niedrig", "mittel" oder "hoch") und wie viele Treffer Sie wünschen für diese Kombinationen erforderlich sein.

Dann sollten Sie versuchen, eine Formel und Wertebereiche zu finden, die Ihren Wunschwerten am besten entsprechen.

Philipp
quelle
7

Der einfachste Weg ist, den Waffenschaden zwischen den Waffenstufen exponentiell zu erhöhen.

Was jedoch zählt, ist, dass Sie auch definieren sollten, wie die HP von Feinden wachsen, wenn sie stärker werden. Wenn Sie also sehr stark sind, sollten Sie einfache Feinde mit nur wenigen Treffern töten, aber diejenigen auf Ihrem Level sollten relativ schwerer zu töten sein als die Feinde, die sich zu Beginn auf Ihrem Level befanden. Also würde ich es so gestalten, dass es ungefähr so ​​aussieht:

level   weapon  enemy   attack  total   hits needed
        dmg     hp      factor  dmg     to kill
======================================================
1       1       2       5       1.25    1.6
2       4       16      10      6       2.666666667
3       9       54      15      15.75   3.428571429
4       16      128     20      32      4
5       25      250     25      56.25   4.444444444
6       36      432     30      90      4.8
7       49      686     35      134.75  5.090909091
8       64      1024    40      192     5.333333333
9       81      1458    45      263.25  5.538461538
10      100     2000    50      350     5.714285714
11      121     2662    55      453.75  5.866666667
12      144     3456    60      576     6
13      169     4394    65      718.25  6.117647059
14      196     5488    70      882     6.222222222
15      225     6750    75      1068.75 6.315789474
16      256     8192    80      128     6.4
17      289     9826    85      1517.25 6.476190476
18      324     11664   90      1782    6.545454545
19      361     13718   95      2075.75 6.608695652
20      400     16000   100     2400    6.666666667
Wo:
1. Der Gesamt-dmg wird anhand Ihrer Formel berechnet
2. Waffe dmg = Level * Level (exponentielles Wachstum)
3. feindliche HP = 2 * Level * Level * Level (exponentielles Wachstum)
4. Angriffsfaktor = 5 * Stufe
5. Erforderliche Treffer beschreibt, wie viele Treffer auf Stufe x und mit Waffen auf Stufe x erforderlich sind, um einen Feind auf Stufe x zu töten

Ich habe diese konstanten Faktoren in Formeln optimiert, um Ergebnisse zu erzielen, die ich für akzeptabel halte. Wichtig ist jedoch, wo Sie lineares Wachstum wollen und wo Sie exponentiell wollen.

Sie sollten auch beachten, dass es viel Zeit in Anspruch nimmt, z. B. feindliche Stufe 20 mit 100 Angriffen und eine Waffe der Stufe 1 mit insgesamt 6 dmg zu töten. Wenn es Ihrer Meinung nach zu viel kostet, spielen Sie mit Konstanten.

Grzegorz Sławecki
quelle
Was bedeutet "Angriffsfaktor"?
Daniel Kaplan
0

Ich denke, die World of War Craft-Methode ist eine der besten. Die Basisstatistiken des Spielers haben einen geringen Einfluss auf den Gesamtschaden, wobei der größte Teil des Schadensmodifikators aus Bonusstatistiken für Ausrüstung stammt. Das macht es viel einfacher, das Spiel zu erweitern und es im Laufe der Zeit auszugleichen

ProtoJazz
quelle