2010-06-28 12 views
15

Ich implementiere eine kleine Grid-basierte, Turn-basierte Strategie in den Linien der Final Fantasy-Taktik.AI für ein Final Fantasy Taktik-ähnliches Spiel

Haben Sie irgendwelche Ideen, wie ich den Auswahl-, Bewegungs- und Skill-Auswahlprozess angehen kann?

Ich erwäge, die Entscheidungen getrennt zu haben, aber alle diese 3 Entscheidungen sind weitgehend gekoppelt. (z. B. kann ich nicht entscheiden, wohin ich mich bewegen soll, wenn ich weiß, wen ich angreifen werde und welche Reichweite die Fähigkeit haben wird, und umgekehrt kann ich nicht entscheiden, wen ich angreifen soll, wenn ich nicht weiß, wie viele Runden Ich werde mich auf ein einheitliches System hinbewegen, aber das Ausprobieren von Dingen aus Potenzieller Feldforschung, die auf eine Art und Weise wie in der Killzone 1 KI verwendet wird, lässt mich auf lokalen Maxima stecken.

=== Update 1

ich derzeit mögliche Felder zu verwenden versuchen/Einfluss bildet die Daten i Entscheidungen auf zu erzeugen.

Ich habe keine Ahnung, wie ich damit umgehen kann, viele Fähigkeiten zu haben und Fähigkeiten, die keinen Schaden anrichten, sondern eher die Welt buff/debuff oder verändern.

Jemand anderswo vorgeschlagen Monte Carlo Tree Search verwenden, derzeit in Go-Spiele verwendet.

Ich glaube, dass der Raum, den meine Darsteller benutzen, nicht gut dafür ist, da viele Bewegungen im Spiel nicht zu einer Position führen, von der aus du die Welt angreifen und beeinflussen kannst (ich bin in einer Welt größer als final Fantasy Tactics)

in final Fantasy Tactics könnte es erfolgreich angewendet werden, obwohl der Verzweigungsfaktor als der 9x9 Go viel größer ist (von dem, was ich verstehe)

===

Vielen Dank im Voraus , Xtapodi.

ps.1 - Ein Problem ist, genau zu wissen, wie weit ein Feind ist, den ich zu ihm finden müsste, denn obwohl der Feind in der Nähe ist, könnte uns eine unpassierbare Klippe trennen, die vier Runden braucht. Oder schlimmer, eine Einheit blockiert den Weg, sagen wir eine Brücke, so dass es eigentlich keinen Weg gibt, ihn zu erreichen.

Antwort

12

Ein Ansatz, den ich verwendet habe, ist ein Zwei-Pass-System zu tun.

Finden Sie zuerst heraus, wohin Ihr Gerät gehen kann. Benutze A * oder was auch immer, um das Terrain zu markieren, um zu sehen, wie weit die Einheit in diesem Zug bewegt werden kann.

Sobald Sie das wissen, Schritt durch Ihre verfügbaren Taktiken (Nahkampfangriff, heilen freundliche Einheit, was auch immer), und zuweisen Sie eine Fitness-Funktion für alle verfügbaren Anwendungen der Taktik. Wenn Sie das markierte Terrain passieren, können Sie sehr schnell bestimmen, wie groß Ihr möglicher Taktraum ist.

Dies gibt Ihnen eine Liste der verfügbaren Taktiken und ihrer Fitness-Funktionen für jeden Zug. Wählen Sie die beste oder randomize von oben. Wenn keine Taktiken verfügbar sind, wiederholen Sie den Vorgang, indem Sie das Gelände für zwei Züge markieren und so weiter.

Was ich mit Fitness-Funktion meine, ist die Entscheidung über den "Wert" der Taktik an einer bestimmten Einheit oder einem bestimmten Ort. Zum Beispiel könnte deine taktische Entscheidungsphase "Eine freundliche Einheit heilen" durch alle verbündeten Einheiten gehen. Wenn sich eine befreundete Einheit innerhalb der Reichweite befindet (dh von einem Ort aus erreichbar ist, den Ihre Einheit erreichen kann), fügen Sie ihn der Liste der möglichen Taktiken hinzu und geben Sie ihm eine Fitnessbewertung von beispielsweise 100 * (1,0 Einheiten Gesundheit) Der Gesundheitszustand der Einheiten reicht von 0 bis 1. Somit würde ein Charakter, der nur 10% Gesundheit übrig hat, 90 Punkte wert sein, während eine Einheit nur 5% weniger wert wäre als 5, und die Einheit würde Heilung nicht als unbeschädigt betrachten Einheit. Spezialeinheiten (d. H. "Schützen der Boss" -Szenario-Einheiten, die erforderlich sind, um Siegbedingungen beizubehalten) könnten eine höhere Basennummer erhalten, so dass sie von freundlichen Einheiten mehr Aufmerksamkeit erhalten.

In ähnlicher Weise würde deine "Nahkampfangriff" -Entscheidungsphase durch alle erreichbaren gegnerischen Einheiten gehen, den wahrscheinlichen Schaden berechnen und dies mit der Gesundheit der Einheit vergleichen.Geben Sie jeder Einheit eine "Erwünschtheit" zum Angriff und multiplizieren Sie sie mit dem Prozentsatz der verbleibenden Gesundheit, die Sie wahrscheinlich tun würden, und Sie haben eine ziemlich detaillierte Fitness-Funktion, die die Eliminierung von Einheiten bevorzugt, aber immer noch nach hohem Wert geht Ziele.

Mit einem solchen Prozess erhältst du eine Liste mit Optionen wie "Gehe zu Position A und heilende Einheit B: 50 Punkte", "Gehe zu Position C und angreife Einheit D: 15 Punkte", etc Plötzlich ist es sehr einfach, eine Taktik zu wählen.

Weitere Details können hinzugefügt werden, indem die Fitness der Taktik mit der Eignung für den Pfad multipliziert wird, den Sie für die Implementierung benötigen. Wenn zum Beispiel der Ort, an den du dich begeben musst, um eine befreundete Einheit zu heilen, dich in große Gefahr bringt (zB auf einem Lavaraum oder etwas anderem stehend), kannst du dies durch Multiplizieren der Fitness dieser Taktik mit .2 oder so, damit die Einheit es immer noch in Betracht zieht, aber nur wenn es wirklich wichtig ist. Alles, was man braucht, ist einen Algorithmus zu schreiben, um die Tauglichkeit eines bestimmten Ortes zu beurteilen, und könnte so einfach sein wie eine vorberechnete "Terrain-Erwünschtheit" -Zahl oder so komplex wie die "Bedrohungskarten" der gegnerischen Einheiten.

Der schwierige Teil ist natürlich, die richtigen Maßnahmen zu finden, um den Motor intelligent zu machen. Aber das ist der spaßige Teil Ihres Systems zu optimieren.

+0

Vielen Dank cc für Ihre ausführliche Antwort. Ich kam oft nahe an das, was du beschreibst, was eine großartige Erkenntnis ist, ist dass du deinen Suchraum erweiterst, wenn nichts Interessantes gefunden wird. Wie würden Sie Positionen ohne taktische Vorteile einnehmen? Zum Beispiel haben Sie einen Ritter und 2 Bogenschützen, der Springer würde weit außerhalb der Reichweite laden die Bogenschützen können in Ihrem Modell helfen. Umgekehrt, wenn Sie Fitness hinzufügen, nur um irgendwo zu stehen, wie würden Sie dann entscheiden, Ihren Suchraum zu erweitern. – Xtapodi

+0

Behandeln Sie es, indem Sie dem Terrain eine Fitness verleihen, die das von Ihnen gewünschte Verhalten begünstigt. Bei Nahkämpfern rücken Orte in der Nähe des Gegners mit höherer Fitness näher heran, aber durch Hinzufügen von "in der Nähe von befreundeten Einheiten" bleiben Ihre Einheiten zusammen. Schichte genug Fitnessüberlegungen, und deine Einheiten werden schlau, auch wenn du nicht eine Runde vorausschaust. Es ist auch einfach, bestimmte Taktiken mit diesem System einzulegen. Wenn Sie eine Ebene mit einer erhöhten Zugbrücke haben, fügen Sie eine Fitnessfunktion für den Pfad zum Absenkmechanismus hinzu. –

1

Eine gute Frage die Antworten können überall sein. Persönlich habe ich nicht viel Erfahrung damit, aber ich würde eine Strategie um Konzept nicht Entfernung setzen.

Sie werden eine Zustandsmaschine für jeden NPC erstellen. Es wird einen Charakter vorhersagen, der über einige Einstellungen angreift.

Zum Beispiel würde ein NPC als Attack Weakest oder Attack Strongest oder Attack Most Injured markiert sein. Dann würde ich versuchen, sie so zu positionieren, dass sie dort das gewünschte Ziel beschädigen können.

Wenn Sie auch Heiler haben, können Sie das gleiche für den Heiler Ziel umgekehrt tun.

Zieländerung wird ebenfalls ein wichtiger Teil dieses Systems sein. Also wirst du darüber nachdenken wollen. Eine einfache Version besteht darin, das sich ändernde Ziel in einem bestimmten Prozentsatz der Runden neu zu bewerten.

Und schließlich, würde ich zufällige Chance in das System hinzufügen.Zum Beispiel könnte ein Zeichen gesetzt werden, wie

Angriff Weakest .25 Angriff Stärkste .50 Angriff meist Verletzter .25

Zieländerung folgt 0,1

Wenn es Zeit zum Angriff ist. Sie generieren eine Zufallszahl von 0-1. Wenn es unter dir ist Ziele ändern, ändere das Ziel, indem du eine andere zufällige Zahl von welchem ​​Ziel zum Angriff erzeugst.

Sie können die Entfernung in Ihr System einteilen, indem Sie die Prozentsätze für den Angriffsmodus erhöhen. Zum Beispiel, wenn es 3 Runden dauern würde, um die am meisten Verletzten anzugreifen. Verringern Sie den Prozentsatz des Ziels, indem Sie diesen Wert durch 3 teilen und die Differenz auf die anderen beiden Möglichkeiten verteilen.

+0

Vielen Dank für den tollen Eingang madmik3. Ich mag viele der Ideen, die Sie vorschlagen, meine derzeitige Denkweise basiert auf einem gierigen Algorithmus, der immer die beste Aktion in diesem Zug wählt, die bei Betrachtung durch einen Spieler größtenteils fehlerhaft sein könnte. Auf Ihrem letzten Absatz ist die Sache, dass ich in der Nähe eines Gegners sein könnte, aber tatsächlich durch einen Fluss getrennt ist, der 3 Runden benötigt, um zu versuchen, für jedes mögliche Ziel (teuer) bei Zielauswahl zu finden, aber Ziel behalten Auswahl an jeder Runde, um die Ausführungslast auszugleichen? – Xtapodi

+0

@Xtapodi: Echtzeit-Strategie-Spiele implementieren Pfadfindung Routinen für alle ihre Einheiten ohne viel Problem. Die Kosten für die Implementierung von Pathfinding-Routinen für die viel kleinere Anzahl von Einheiten in einem rundenbasierten Spiel im FFT-Stil, bei dem die Rechenzeit viel weniger ein Problem ist, erscheinen mir ziemlich vernachlässigbar, selbst wenn Sie Pfade prüfen zu allen möglichen Zielen. In der Tat würde ich vorschlagen, es so zu machen, weil Sie dann basierend auf anderen Faktoren wie Gesundheit der Spielereinheit usw. berechnen können, ob die feindlichen Einheiten sich anderswo bewegen sollten, anstatt sich auf die nächste PC-Einheit zu konzentrieren. – JAB

+0

@JAB: Vielen Dank für Ihren Kommentar. Was du über RTS sagst, mag wahr sein (abhängig vom Spiel), aber auch einige Monate Arbeit von Leuten, die schon viel Erfahrung hatten. Ja, basierend auf Rundenzeiten gibt mir viel mehr Zeit für die Verarbeitung. Würdest du vorschlagen, ein Dijkstra von jeder Spielereinheit (derzeit 4 - 5) zu spielen und dann die KI an diesen Daten arbeiten zu lassen? – Xtapodi

3

Wenn das Terrain, in dem der Kampf stattfindet, im Voraus oder nicht zu weit gefasst ist, ist there ein Artikel über Geländeerinnerung in FPS, der als Grundlage für ein rundenbasiertes Spiel verwendet werden kann.

Kurz gesagt, Sie berechnen für jede Zelle der Karte eine Reihe von Werten voraus, z. B. Eignung für die Aufnahme in eine bestimmte Richtung, Schutz, Sichtbarkeit ... und so weiter. Die KI kann dann diese Werte verwenden, um eine korrekte Aktion auszuwählen. Zum Beispiel, Kämpfer wird so schnell wie möglich in Richtung Feind, mit Schutz, wenn verfügbar, während Dieb wird einen Weg, wo Sichtbarkeit aus Feind-Richtung so niedrig wie möglich, mit dem Ziel, von Flanke oder hinten angreifen.

Wenn das Terrain randomisiert und/oder zu breit ist, kann der Vorcalculus jedoch zu lang sein, um nützlich zu sein.

Grüße Guillaume

+0

Danke Guillaume für die Antwort, ich lese immer noch die Zeitung und denke darüber nach, wie und ob ich es anwenden kann. Ich habe das Gefühl, dass für einige Dinge, die ungefähre Daten haben, wirklich schlecht auf diese Art von Spiel, zum Beispiel Sichtlinie scheinen kann. – Xtapodi

+0

ja und nein. Sie haben keine Sichtlinie, nur die Tatsache, dass die Zelle, in der sich der Feind befindet, eine geringe Sichtbarkeit auf der linken Seite hat. So können Sie damit Ihre Pfadsuche auf diese Seite des Feindes einschränken. Ein anderes Beispiel: zu wissen, dass der Feind an einem Gebiet vorbei muss und weiß, dass es eine sehr gute Schießposition für diesen Bereich ist (dh gute Sicht für diesen Bereich, viele kleine Hindernisse in dieser Richtung, geringer Zugang oder Sichtbarkeit in andere Richtungen)) kann für einen AI Scharfschützen nützlich sein :) Aber Sie müssen effektiv die reale Sichtlinie überprüfen –