Attribute zur Berechnung eines Treffers in einem rundenbasierten Spiel oder in Roguelikes

22

Ich versuche eine gute Formel für die Bestimmung eines Treffers zu finden, wenn der Spieler einen Feind in einem Roguelike angreift. Ich würde mir gerne etwas Vereinfachtes einfallen lassen, aber immer noch genau so, wie es in D & D oder den beliebten Roguelikes wie AngBand oder NetHack gemacht wird.

Was ich bisher habe, ist das Hinzufügen der Unterschiede zwischen Spieler- und Feindattributen zusammen mit einer zufälligen ganzen Zahl:

if ((player.dex - enemy.dex) + (player.speed - enemy.speed) +
    (player.luck - enemy.luck) + random_integer_below_6()) >= 10) {
    hit(enemy);
}

Dies führt zu unnatürlichem Gameplay: Der Spieler vermisst niemals schwache Gegner und umgekehrt, wenn er stark ist. Kennt jemand einen Leitfaden für attributbasierte Kämpfe, die in rundenbasierten Spielen usw. verwendet werden? Soll (und darf) ich die D & D-Regeln wörtlich kopieren?

jdeseno
quelle

Antworten:

18

Ich würde herausfinden, wie hoch die Wahrscheinlichkeit ist, dass ein Kätzchen einen Drachen trifft und ein Drache ein Kätzchen übersieht. Speichern Sie Ihr zufälliges Ergebnis und markieren Sie einen Treffer, wenn er innerhalb dieser Grenzen liegt, bevor Sie Leistungsunterschiede anwenden. Damit wird das Problem der 100% igen Treffer- / Fehlschlagchance vermieden. Es gibt jedoch eine weitere Option, mit der Sie immer eine Trefferchance angeben können (siehe unten).

D & D ist ein "flaches" System, bei dem die Wahrscheinlichkeit gleichmäßig auf die möglichen Würfelergebnisse verteilt ist. Andere Systeme verwenden eine stärker gekrümmte Verteilung, die normalerweise dadurch erreicht wird, dass mehrere Würfel gewürfelt und addiert werden. Es ist einfach genug, eine Kurve wie diese zu erstellen (rand () + rand ()) / 2 kommt in den Sinn).

Eine andere Möglichkeit ist das "Explodieren von Würfeln". In Systemen wie Shadowrun und Savage Worlds können Sie nach dem Würfeln des maximal möglichen Würfelergebnisses den Würfel neu würfeln und das neue Ergebnis hinzufügen. In Ihrem Spiel würden Sie testen, ob Ihr zufälliges Ergebnis über einem bestimmten Schwellenwert lag, und in diesem Fall erneut würfeln. Wenn Sie Würfel auf unbestimmte Zeit explodieren lassen, hat selbst der niedrigste Goblin eine Chance, einen Gott zu treffen, und Sie benötigen keine explizite "garantierte Treffer" -Mechanik.

Ein möglicher Ansatz mit einem gekrümmten Wurf, einer garantierten Chance zu fehlen und explodierenden Würfeln wäre also wie folgt:

function getRoll():Number
{
  var result:Number = (rand() + rand()) * 3; //Curved result from 0 to 6
  if(result > 5.75) result += getRoll(); //Explode over a certain threshold, recursively
  return result;
}

function attackHits():Boolean
{
  var roll:Number = getRoll();
  if(roll < 0.25) return false; //Guaranteed chance of miss
  else return ((player.dex - enemy.dex) + (player.speed - enemy.speed) +
    (player.luck - enemy.luck) + roll) >= 10; //Your original test.
}

Das ist natürlich ungeprüft und unausgeglichen. Sie möchten all diese magischen Zahlen anpassen, bis sie sich richtig anfühlen.

Was das wörtliche Kopieren von Regeln angeht, so gibt es damit rechtliche und ethische Probleme. Sie lassen sich jedoch von D & D und anderen Tabletop-Spielen inspirieren. das ist, wie sie alle in erster Linie entworfen wurden. Sie müssen dem Spieler auch nicht genau zeigen, wie die Regeln funktionieren, und Sie stellen möglicherweise fest, dass die Verwendung einer glatten Gleitkomma-Würfelkurve zu einem besseren Gefühl führt, als sich auf die ganzzahligen Beschränkungen physischer Würfel zu beschränken.

Gregory Avery-Weir
quelle
3
Welche Sprache ist das mit den lustigen Typdeklarationen? Oder ist es nur Pseudocode?
Am
2
Ich denke, es kann Actionscript oder Javascript sein, aber halte mich nicht daran fest.
Die kommunistische Ente
Es ist Actionscript 3. Ich bin ein Flash-Entwickler.
Gregory Avery-Weir
6

Ich gehe davon aus, dass dies eine Frage zum Spielgleichgewicht und keine Codierungsfrage ist, und es gibt viele Möglichkeiten, damit umzugehen. Ich vermute, dass Sie Ihren bestehenden Algorithmus komplizierter machen, als er sein muss (drei Attribute UND eine Zufallszahl ergeben aus Sicht des Spielers ein extrem matschiges System). Mein erster Instinkt ist zu vereinfachen!

Bevorzugen Sie Attribute, die mehrere Aufgaben ausführen, anstatt Ergebnisse, die von mehreren Attributen bestimmt werden. DEX funktioniert einwandfrei als primärer Bestimmungsfaktor für die Trefferchance. die Hinzufügung von allem anderen dient nur dazu, das Gleichgewicht zu erschweren. Stellen Sie sich das so vor: Der erwartete Schaden eines Spielers bei jedem Treffer ist sein Trefferanteil multipliziert mit seinem durchschnittlichen Schaden, wenn er trifft. Wie planen Sie, einen "erwarteten" oder "typischen" Trefferprozentsatz mit so vielen Variablen zu berechnen?

Ich sehe ein anderes Problem, nämlich, dass Ihre Formel nicht skaliert, und dies ist wahrscheinlich, was Sie erleben. Unter der Annahme, dass DEX, LUCK und SPEED im Laufe des Spiels tendenziell zunehmen, nehmen auch die Unterschiede zwischen Spieler und Monster in diesen Statistiken tendenziell zu. Wenn beispielsweise das DEX eines Spielers im Frühstadium im Bereich von 4 bis 6 liegt, und das gilt auch für Monster, ist dies ein Modifikator für Treffer von 10 bis 20%. Wenn die Reichweite in späteren Spielphasen eher zwischen 10 und 20 liegt, ist dies ein Modifikator von 100%.

Eine Möglichkeit, dies zu beheben, besteht darin, die Statistiken zu korrigieren. Die Reichweite von Spielern und Monstern ist während des gesamten Spiels gleich, und so etwas wie +1 DEX zu erhalten, ist ein riesiges Geschäft, extrem selten und wird als solches behandelt (sofern es überhaupt existiert). Dann funktioniert Ihre Formel für das gesamte Spiel und Sie sehen einen Spieler mit ungefähr der gleichen Trefferchance.

Eine andere Möglichkeit besteht darin, die fest codierte "10" so zu ändern, dass sie mit dem Level übereinstimmt. Vielleicht ist es also "10 + Monsterlevel" oder "10 + Dungeonlevel" oder etwas anderes, was im Verlauf des Spiels zu einem leichten Anstieg des Schwierigkeitsgrades führt, sofern der Spieler kein höheres Level erreicht ihre Statistiken entsprechend.

Ein dritter Weg, wie andere gesagt haben, besteht darin, die Obergrenze auf den höchsten und niedrigsten akzeptablen Trefferprozentsatz zu setzen und einfach zu sagen: "Wenn der berechnete Wert kleiner als X ist, verwenden Sie stattdessen X".

Der Vollständigkeit halber möchte ich darauf hinweisen, dass es kein absolutes Gesetz gibt, nach dem Sie einen Treffer-Wurf vorschreiben MÜSSEN. Das Durchführen einer Aktion in einem Spiel, das ineffektiv ist, macht keinen besonderen Spaß und erhöht die Erfahrung nur in seltenen Fällen. Eine Alternative ist, die Spieler IMMER schlagen zu lassen und nur mit der Schadensreichweite herumzuspielen, damit sie manchmal viel weniger Schaden anrichten als andere. Denken Sie daran, dass komplexe Systeme für den Designer mehr Spaß machen als für den Spieler.

Ian Schreiber
quelle
Das ist eine großartige Antwort.
Seanicus
3

Möglicherweise möchten Sie kritische Treffer (normalerweise kein Fehlschuss, Bonusschaden) und kritische Fehlschüsse (pauschale Chance, egal was zu verpassen, möglicherweise den Spieler zu betäuben) hinzufügen.

coderanger
quelle
0

Viele Spiele verwenden zusätzlich zur normalen Trefferformel eine Änderung des Treffers um fünf Prozent, unabhängig von allen Faktoren.

EddieC
quelle