Ich erstelle ein 2D-Karten-basiertes Actionspiel mit einem ähnlichen Interaktionsdesign wie Diablo II. Mit anderen Worten, der Spieler klickt auf eine Karte, um seinen Spieler zu bewegen. Ich habe gerade die Spielerbewegung beendet und gehe zur Wegfindung über.
Im Spiel sollten Feinde den Charakter des Spielers aufladen. Es gibt auch fünf verschiedene Geländetypen, die unterschiedliche Bewegungsboni bieten. Ich möchte, dass die KI diese Geländeboni nutzt, um den Spieler zu erreichen.
Mir wurde gesagt, ich solle den A * -Suchalgorithmus überprüfen (http://en.wikipedia.org/wiki/A*_search_algorithm). Ich mache dieses Spiel in HTML5 und JavaScript und habe eine Version in JavaScript gefunden: http://www.briangrinstead.com/blog/astar-search-algorithm-in-javascript Ich versuche herauszufinden, wie ich es optimieren kann obwohl.
Nachfolgend sind meine Ideen aufgeführt, was ich ändern muss. Worüber muss ich mich sonst noch sorgen?
- Wenn ich ein Diagramm erstelle, muss ich das übergebene 2D-Array mit einer Durchquerung einer Karte initialisieren, die den verschiedenen Geländetypen entspricht.
- in graph.js: Die Definition "GraphNodeType" muss geändert werden, um die 5 Geländetypen zu verarbeiten. Es wird keine Wände geben.
- in astar.js: Die Punkte g und h müssen geändert werden. Wie soll ich das machen?
- in astar.js: isWall () sollte wahrscheinlich entfernt werden. Mein Spiel hat keine Wände.
- in astar.js: Ich bin mir nicht sicher, was das ist. Ich denke, es zeigt einen Knoten an, der nicht gültig ist, um verarbeitet zu werden. Wann würde das allerdings passieren?
- Wie ändere ich diesen Algorithmus auf hoher Ebene von "Oh, gibt es dort eine Wand?" zu "Wird mich dieses Terrain schneller zum Spieler bringen als das Terrain um mich herum?"
Aus Zeitgründen diskutiere ich auch darüber, meinen Bresenham-Algorithmus für die Feinde wiederzuverwenden. Leider werden die verschiedenen Geländebewegungsboni von der KI nicht verwendet, was das Spiel zum Kotzen bringt. : / Ich hätte das wirklich gerne für den Prototyp, aber ich bin weder ein Entwickler von Beruf noch ein Informatiker. : D.
Wenn Sie einen Code kennen, der das tut, wonach ich suche, teilen Sie ihn bitte mit!
Tipps zur Überprüfung der geistigen Gesundheit sind ebenfalls willkommen.
quelle
Antworten:
Sie müssen auf eine ganz bestimmte Zeile im Algorithmus achten:
Dies sind die Kosten für diesen bestimmten Knoten. Sie möchten es zu etwas wie ändern
Dies führt dazu, dass der Pfad teures Gelände vermeidet und billiges Gelände bevorzugt. Es liegt in Ihrer Verantwortung, dass 'currentNode.cost' etwas zurückgibt, das für Ihr Gelände geeignet ist. Es ist die Tatsache, dass nicht jedes Gelände Kosten von 1 hat, auf die Sie achten ... einige Gebiete sind billiger als andere. Es gibt andere Überlegungen, aber dieser spezielle Punkt im Code sollte im Mittelpunkt Ihrer Aufmerksamkeit stehen.
quelle
Genau dafür ist A * gedacht. Sie müssen lediglich die Eckpunkte zwischen den Knotenkosten basierend auf den Geländetypen zuweisen. (Es sieht so aus, als ob in Ihren Beispielen ein Diagramm verwendet wird, in dem alle Eckpunkte Kosten von 1 haben.)
quelle
Diese Implementierung ist momentan ein wenig spezifisch für das Ein- und Ausschalten. Wie Myrddin Emrys sagt, müssen Sie den g-Wert basierend auf den Kosten ändern (und nicht nur um 1). Hier gab es eine Diskussion darüber: https://github.com/bgrins/javascript-astar/issues/3 .
Ich würde diese Lösung gerne wieder in die Hauptbibliothek portieren, wenn sie funktioniert!
quelle