Berechnung der Leistung zweier kämpfender Armeen

20

Ich programmiere ein strategisches Spiel mit Flash. Das Spiel funktioniert sehr ähnlich wie das berühmte Spiel "Travian".

Mein Problem ist wie folgt: Ich versuche, die Berechnung der Truppen vorzunehmen, die infolge eines Kampfes zwischen zwei Armeen verloren gegangen sind. Die beiden Armeen haben unterschiedliche Arten von Einheiten. Einige von ihnen sind stärker gegen andere Einheiten und schwächer gegen andere Typen.

Wie kann ich diesen Effekt dieser Unterschiede in die Kampfgleichung einbringen?

Es scheint einfach zu sein, wenn sie nur Att- und Def-Punkte haben, aber wenn es um die Typabhängigkeit der Einheiten geht, bin ich verloren.

Ali Albahrani
quelle
6
Sollte der Ausgang Ihrer Kämpfe rein deterministisch sein oder möchten Sie eine Art Zufälligkeit verwenden?
sum1stolemyname
4
Ich denke nicht, dass es als Multiplayer-Spiel markiert werden sollte, da dies vom OP nicht vorgegeben wird - es könnte menschlich gegen KI sein. Und reden wir von 'Typabhängigkeit' über die klassische Rock-> Scheren-> Papier-> Rock-Typ-Sache?
Die kommunistische Ente

Antworten:

10

Zusätzlich zu Amits Vorschlag, sich die Lanchester-Gleichungen anzuschauen, möchte ich hinzufügen, dass dies eine Entscheidung für das Spieldesign ist, keine empirische Tatsache, die wir Ihnen geben können. Wenn Sie den Einheitentyp berücksichtigen möchten, müssen Sie entscheiden, was dies bedeutet. Dies bedeutet, dass Sie eine Gleichung auswählen, die alle Faktoren enthält, die Ihr Gameplay enthalten soll. Wenn Sie wollen, dass Infanterie besser ist als Kavallerie, müssen Sie sich entscheiden, was das bedeuten soll - z. Wie viele Kavallerieeinheiten benötigen Sie, um 100 Infanterieeinheiten gleichzusetzen? Und spielt es eine Rolle, wer wen angreift? Sie scheinen zu implizieren, dass es nicht gut genug ist, Infanterie und Kavallerie unterschiedliche Angriffs- und Verteidigungswerte zuzuweisen - warum ist das so? Was möchten Sie sonst noch darstellen, das nicht nur von diesen Werten erfasst werden kann?

Sie müssen entscheiden, welche Faktoren Sie in Ihrem Spiel modellieren möchten, da sie sich auf die Art und Weise auswirken, wie sich die Spieler dem Spiel nähern. Dies können Größe / Menge der Einheit, Typ der Einheit, Erfahrung der Einheit (z. B. Veteranenstatus), Gelände- und Umwelteinflüsse, etwaige Unterschiede zwischen Angriff und Verteidigung, Modellierung von Schaden und Abnutzung oder Modellierung des Zeitablaufs während des Angriffs sein der Kampf, die Fähigkeit, sich zurückzuziehen oder zu fliehen (möglicherweise einschließlich Moralmodellierung), wie viel Zufälligkeit Sie in der Gleichung wollen, und so weiter.

Wenn Sie das alles wissen, können Sie verschiedene grundlegende mathematische Ansätze wählen. Sie könnten eine Runde für Runde "Chance zu treffen" -System wie viele RPGs haben, z. das d20 kampfsystem. Sie könnten ein gewichtetes Münzwurfsystem mit einer Runde "Angriff gegen Verteidigung" durchführen, wie es das ursprüngliche Civilization-Spiel tut. Sie könnten jede Seite dazu bringen, eine Punktzahl zu generieren, indem Sie einer Zufallszahl Attribute hinzufügen, und jeder, der den höchsten Wert erhält, gewinnt. Und Sie können diesen Systemen erlauben, rund um die Uhr zu arbeiten oder Treffer- oder Moralpunkte oder was auch immer abzurechnen. Jedes System kann funktionieren, aber Sie müssen es so ausbalancieren, wie Sie es möchten. Letztendlich ist die Wahl des Modells des Kampfes ein wichtiger Bestandteil des Spieldesigns und kann nicht nur von anderen Leuten vorgegeben werden.

Kylotan
quelle
Sie haben völlig Recht, Kylotan. Ich hatte einige Ideen über den Kampf, bevor ich mit dem Design des Spiels begann. Ich habe diese Frage jedoch gestellt und gefragt, ob es eine bessere Möglichkeit gibt, sie zu entwerfen und herauszufinden, wie sie am besten implementiert werden kann. Ich habe in beiden Fällen gewonnen, denke ich :) Mein Freund, können Sie mir bitte sagen, wo ich weitere Informationen zu diesen mathematischen Ansätzen finden kann? Wenn ich alle Fragen beantworte, die Sie zur Auswahl des Systems stellen, können Sie mir dann raten, welches für meinen Fall am besten geeignet ist? Vielen Dank für Ihre Zeit :)
Ali Albahrani
Ich kann dir nicht sagen, welches das Beste ist, aber du solltest wahrscheinlich einfach anfangen und das verbessern, wenn du musst. Travian scheint ein einfaches Angriffs- / Verteidigungssystem mit 2 Einheitentypen (Infanterie und Kavallerie) und 2 Verteidigungswerten pro Einheit zu haben. Eine einfache Möglichkeit, eine Schlacht zu lösen, wie sie in Civilization 1 verwendet wird, besteht darin, den Angriffswert des Angreifers durch den Gesamtwert plus den Verteidigungswert des Verteidigers zu teilen. Dies gibt Ihnen einen Prozentsatz. Wählen Sie nun eine Zufallszahl zwischen 0 und 100 Prozent. Wenn es niedriger ist als der Angriffswert des Angreifers, gewinnen die Angreifer. Ansonsten gewinnen die Verteidiger.
Kylotan
15

Für Solar Realms Elite habe ich mich von Lanchesters Gleichungen für die Modellierung von Kriegsführung inspirieren lassen . Ich hatte in jeder Kampfrunde mehrere Kämpfe gleichzeitig.

Im ersten Kampf griffen alle Soldaten an. In SRE sind Soldaten am besten gegen Soldaten (es ist keine Schere aus Steinpapier, sondern Infanterie, Luftangriff und Weltraum). Ich habe eine Angriffs- und Verteidigungskraft aufgebaut, bei der die Soldaten am besten angegriffen haben:

attack_strength = 3*soldiers + 1*fighters + 2*cruisers
defense_strength = 10*soldiers

Im zweiten Kampf griffen alle die Verteidigungsstationen an. In SRE sind Kämpfer (Luft) am besten gegen Verteidigungsstationen (zB Flugabwehr):

attack_strength = 1*soldiers + 4*fighters + 2*cruisers
defense_strength = 25*defense_stations

Im dritten Kampf griffen alle die schweren Kreuzer an. In SRE sind schwere Kreuzer im Weltraum und eignen sich am besten gegen andere schwere Kreuzer:

attack_strength = 1*soldiers + 1*fighters + 10*cruisers
defense_strength = 15*cruisers

(Ich erinnere mich nicht, welche Konstanten ich verwendet habe; dies sind nur Beispiele.) In jeder Kampfrunde verlieren die Angreifer einen Teil der Verteidigungsstärke und die Verteidiger einen Teil der Angriffsstärke. Ich glaube, das entspricht dem Lanchester Square Law (Gleichungen hier ). Ich hatte Zufälligkeit hinzugefügt, aber ich erinnere mich nicht genau, wo. Nach jeder Kampfrunde waren die Armeen kleiner. Ich habe eine Höchstgrenze für die Anzahl der Runden festgelegt. Danach würde sich die Verliererseite zurückziehen.

Es war nicht realistisch, dass die Infanterie auf dem Boden in den Weltraum schoss, aber es funktionierte aus Spielgründen besser, wenn alle Einheiten in der Lage waren, alle anderen Einheiten zu bekämpfen (mit verringerter Effektivität).

amitp
quelle
12

Ich neige dazu zu sagen: "Wenn Sie keine explizite Lösung finden können, suchen Sie eine implizite." Sie können den Kampf intern simulieren, bis eine Armee ausgelöscht ist oder sich zurückzieht (abhängig von den möglichen Ergebnissen Ihres Spiels).

Ich würde so etwas verwenden:

Bei jeder Wiederholung des Kampfes sind alle Einheiten opportunistisch, sodass sie versuchen, den größtmöglichen Schaden zu verursachen. Jede Einheit wählt eine feindliche Einheit aus, die sie in dieser Runde angreifen wird, basierend auf den bekannten Vor- und Nachteilen.

Dann werden alle Unterkämpfe durchgeführt. Ein Beispiel:

Lass die Speerträger gegen Kavallerie, Kavallerie gegen Bogenschützen und Bogenschützen gegen Speerträger wirksam sein.

In einem Kampf zwischen zwei Armeen, die aus beiden Typen dieser Basiseinheiten bestehen, würden alle Speermänner Kavallerie angreifen, alle Kavallerieeinheiten würden Bogenschützen angreifen und alle Bogenschützen würden Speermänner angreifen. Wenn zum Beispiel eine Seite keine Bogenschützen hätte, würde die Kavallerie der anderen Seite den nächstbesten Zieltyp auswählen (wobei es sich um die feindlichen Kavallerieeinheiten handelt).

Jedes Einheiten-Angriffs-Einheiten-Ereignis wird separat ausgeführt, wobei die verlierende Einheit beschädigt oder als zerstört markiert wird.

Nachdem alle Einzelkämpfe beendet wurden, entferne alle Einheiten, die kritisch beschädigt oder zerstört wurden.

Die nächste Iteration beginnt mit dem Einsatz der jetzt reduzierten Armeen.

sum1stolemyname
quelle
Stimme diesem Beitrag wirklich zu. Besser durch den Kampf iterieren, als ihn auf eine einzige Gleichung zu reduzieren. Und ich würde definitiv ein bisschen Zufälligkeit hinzufügen. Es sollte eine so geringe Chance geben, dass der schwache Verteidiger hoch würfelt und einen kritischen Treffer erzielt. Ein weiterer Vorteil von iterativ ist, dass Sie eine Erzählung der Ereignisse erstellen können, um den Player anzuzeigen. "Die Schwertkämpfer griffen an und dezimierten bald die Lakaien, aber dann kam der Kalvarienberg und ..."
Tim Holt
Ich mag Ihre Antwort sehr und ich denke, ich werde sie mit Zufälligkeit umsetzen :)
Ali Albahrani
3

Ich teste ein Spiel, bei dem es sich derzeit um eine einfache Version von Solar Realms ( Star Empire Elite ) handelt, und verwende zunächst etwas, das Amits Gleichungen ähnelt (siehe oben). Insbesondere gefiel mir die Idee, drei Phasen im Kampf zu haben, in denen man zwei der drei gewinnen musste. Aber ich wollte auch ein Element der Zufälligkeit in den Kampf einbringen, und dafür wurde ich von einigen Tabletop-Spielen beeinflusst.

Die Verarbeitung ist ein Problem, wenn das Spiel skaliert werden soll. Daher wollte ich die von sum1stolemyname oben vorgeschlagene Methode nicht befolgen. Wenn Ihr Spiel im Gegensatz zu einem Server den Client zum Verarbeiten der Ergebnisse verwendet, scheint dies ein Problem zu sein guter Ansatz.

Ich beschloss, den Kampf in zwei Phasen zu unterteilen (analog zu den drei in Amits Modell): Luft und Boden. Ich berechne die Angriffs- und Verteidigungsstärke und passe die Angriffsstärke um einen Bruchteil an (um dem Verteidiger den Vorteil zu geben). Wenn zu diesem Zeitpunkt die Angriffsstärke und die Verteidigungsstärke gleich sind, hat der Angriff eine 50% ige Siegchance. Von dort aus stelle ich die prozentuale Siegchance nach oben oder unten ein, basierend darauf, wie viel mehr (oder weniger) Stärke der Angreifer im Vergleich zum Verteidiger hat. Hier sind einige vereinfachte Gleichungen für Luft:

air_attack_strength = 1 * soldiers + 10 * fighters
air_defence_strength = 2 * soldiers + 25 * stations

differential = (air_attack_strength - air_defence_strength) * constant

chance_of_victory = 50 - differential

Ich gebe an, dass die Chance_des_Siegs niemals größer als 80 oder kleiner als 5 sein darf. Von dort aus erstelle ich eine Zufallszahl aus 100 und übertrage dieses Ergebnis in den Landkampf.

Eine Sache, die ich nicht zu meiner Zufriedenheit gelöst habe, sind die Unfallraten. Aber ich denke, ein guter Weg, dies herauszufinden, wäre, die Chance_des_Siegs mit der generierten Zufallszahl zu vergleichen und einen Bruchteil der angreifenden und verteidigenden Streitkräfte als Opfer zu nehmen.

Robert Joghurt
quelle