Ich habe Probleme mit einem bestimmten Suchbegriff dafür, aber wie würde man die möglichen Bewegungen in einem rundenbasierten 2D-Strategiespiel finden (dh FF: Taktik, Feueremblem, Advance Wars).
Ich denke an dieser Stelle nicht so sehr über Gelände (oder gar Kollision) nach. Ich frage mich nur, mit welchem Algorithmus ich herausfinden kann, dass eine X-Entität 5 Kacheln bewegen und 2 weitere Kacheln angreifen kann.
Ich weiß, dass ich so etwas wie Dijkstra verwenden kann, um den Abstand zwischen zwei Punkten zu ermitteln. Eine mögliche Implementierung besteht darin, am Standort des Spielers zu beginnen und von dort abzweigen, bis die von Dijkstra zurückgegebene Entfernung größer ist als die Anzahl der Züge.
Ich frage mich nur, ob mich jemand in die richtige Richtung weisen könnte (dh Name der Algorithmen, Techniken, Artikel usw.).
Antworten:
Ich denke, eine begrenzte Dijkstra ist genau das, was Sie verwenden möchten. Die Art und Weise, wie Dijkstra die Entfernung zwischen zwei Punkten ermittelt, besteht darin, die Entfernung zu jedem Knoten von einem Ursprungsknoten abzubilden und dann den kürzesten Pfad aus dieser Entfernungskarte auszuwählen. Sie möchten praktisch dasselbe tun, außer dass Sie das von ihm erstellte Entfernungsknotendiagramm als Ausgabe und nicht als Pfad zu einem bestimmten Punkt verwenden möchten.
Die einzige Änderung, die Sie vornehmen möchten, besteht darin, die Berechnung der Entfernung von Knoten zu überspringen, die Ihren maximalen Bewegungsbereich bereits überschritten haben. Dann haben Sie ein Knotendiagramm aller Knoten, zu denen die Einheit fahren kann, sowie einen Rand. Schneiden Sie also einfach die Knoten aus, deren Abstand größer als die zulässige Bewegung ist.
Viola.
Mit anderen Worten, so ziemlich das, was Sie in Ihrer Frage beschrieben haben, ist das, was Sie tun müssen. Es hat auch den Vorteil, dass die Ausgabe für die Pfadfindung verwendet werden kann, ohne dass weitere Berechnungen erforderlich sind.
quelle
Der einfachste (und wahrscheinlich naivste) Ansatz, den ich mir derzeit vorstellen kann:
steps - 1
.steps - 1
wosteps
das aktuelle Feld der Schrittzahl sein würde, es sei denn , das neue Feld eine bereits höhere Nummer hat.quelle
Ich denke, was Sie suchen, könnte Manhattan Distance sein . Wenn Sie keine Hindernisse annehmen, können Sie sagen, dass ein Quadrat einfach erreichbar ist, wenn:
| toX-fromX | + | toY-fromY | <maxMoveDistance
Dieser Algorithmus ist möglicherweise nicht die richtige Richtung, wenn Sie später auf Hindernisse stoßen. Eine Möglichkeit zur Anpassung könnte darin bestehen, Hindernisse „Schatten“ werfen zu lassen und vom nächsten Punkt aus neu zu bewerten.
BEARBEITEN (weil ich jetzt etwas mehr Freizeit habe):
Mit "Schatten" meine ich so etwas: Wenn 0 ein erreichbares Quadrat ist, ist C das Zeichen und X ein Hindernis:
Da (5, 2) ein Hindernis ist, gehen Sie zunächst davon aus, dass Sie mit x> = 5 UND y <= 2 nichts erreichen können. Sie können dann von einem anderen Quadrat aus neu berechnen. Wenn Sie zu (5, 1) gehen möchten, können Sie die Manhattan-Entfernung von (4, 1) berechnen und prüfen, ob diese + die Entfernung vom Charakter zu (4, 1) geringer ist als die Bewegungsentfernung des Spielers.
Dies ist ein ziemlich triviales Beispiel, aber wenn Sie mehrere Hindernisse und / oder einen etwas größeren Bewegungsbereich haben, sollte es in der Lage sein, die Komplexität zu bewältigen.
Ob es tatsächlich besser wäre als nur das Füllen von Fluten, sei es in Bezug auf die Programmierkomplexität oder die Ausführungseffizienz, ich habe keine Ahnung. Es schien nur ein interessanter Weg zu sein, das Problem zu lösen.
quelle