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 enemyHealth
und 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 playerAttack
macht, 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.
quelle
playerAttack
Statistik 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?)Antworten:
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:
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:
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 :
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
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²
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) ...
... 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.
quelle
a
steht wieder?" und nach oben scrollen?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:
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.
quelle
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:
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.
quelle
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
quelle