Comment puis-je modifier cet algorithme de recherche de chemin A * pour gérer différentes valeurs de mouvement du terrain?

8

Je crée un jeu d'action basé sur une carte 2D avec une conception d'interaction similaire à Diablo II. En d'autres termes, le joueur clique sur une carte pour déplacer son joueur. Je viens de terminer le mouvement du joueur et je passe à la recherche de chemin.

Dans le jeu, les ennemis doivent charger le personnage du joueur. Il existe également cinq types de terrains différents qui donnent différents bonus de mouvement. Je veux que l'IA profite de ces bonus de terrain alors qu'elle essaie d'atteindre le joueur.

On m'a dit de vérifier l'algorithme de recherche A * (http://en.wikipedia.org/wiki/A*_search_algorithm). Je fais ce jeu en HTML5 et JavaScript, et j'ai trouvé une version en JavaScript: http://www.briangrinstead.com/blog/astar-search-algorithm-in-javascript J'essaie de comprendre comment le modifier bien que.

Voici mes idées sur ce que je dois changer. De quoi d'autre dois-je m'inquiéter?

  • Lorsque je crée un graphe, je vais devoir initialiser le tableau 2D que je passe transmis avec une traversée d'une carte qui correspond aux différents types de terrain.
  • dans graph.js: la définition de "GraphNodeType" doit être modifiée pour gérer les 5 types de terrain. Il n'y aura pas de murs.
  • dans astar.js: les scores g et h devront être modifiés. Comment dois-je procéder?
  • dans astar.js: isWall () devrait probablement être supprimé. Mon jeu n'a pas de murs.
  • dans astar.js: Je ne sais pas ce que c'est. Je pense que cela indique un nœud qui n'est pas valide pour être traité. Mais quand cela arriverait-il?
  • À un niveau élevé, comment puis-je changer cet algorithme de "oh, y a-t-il un mur là-bas?" à "ce terrain m'amènera-t-il au joueur plus rapidement que le terrain autour de moi?"

À cause du temps, je discute également de la réutilisation de mon algorithme de Bresenham pour les ennemis. Malheureusement, les différents bonus de mouvement de terrain ne seront pas utilisés par l'IA, ce qui rendra le jeu nul. : / Je voudrais vraiment avoir ça pour le prototype, mais je ne suis pas développeur de métier ni informaticien. :RÉ

Si vous connaissez un code qui fait ce que je recherche, partagez-le!

Des conseils pour vérifier la santé mentale sont également appréciés.

user422318
la source
Hé, auteur de la bibliothèque ici. Utilisez-vous la dernière version de github? github.com/bgrins/javascript-astar/blob/master/astar.js . C'est beaucoup plus rapide que l'ancienne implémentation basée sur une liste.
Brian Grinstead

Réponses:

7

Vous devez faire attention à une ligne très spécifique de l'algorithme:

// g score is the shortest distance from start to current node, we need to check if
//   the path we have arrived at this neighbor is the shortest one we have seen yet
var gScore = currentNode.g + 1; // 1 is the distance from a node to it's neighbor

C'est le coût de ce nœud particulier. Vous voudriez le modifier en quelque chose comme

var gScore = currentNode.g + currentNode.cost

Cela permettra au chemin d'éviter un terrain coûteux et de préférer un terrain bon marché; il est de votre responsabilité de faire en sorte que 'currentNode.cost' renvoie quelque chose de approprié pour votre terrain. C'est le fait que tous les terrains n'ont pas un coût de 1 auquel vous faites attention ... certains terrains sont moins chers que d'autres. Il existe d'autres considérations, mais ce point spécifique du code devrait être au centre de votre attention.

Myrddin Emrys
la source
Merci pour cela. J'ai modifié mon code pour que chaque nœud recherche le pixel à ses coordonnées et le stocke en tant que coût. Malheureusement, j'ai fait un test de recherche de chemin entre deux points sur ma grille 800x500 et mon navigateur plante. : / Il y a plusieurs facteurs à cela: le code astar peut nécessiter une optimisation; ma taille de toile est énorme; peut-être que l'initialisation de mon graphique est incorrecte; et peut-être que les couleurs des avatars des personnages gâchent les choses. Que devrais-je faire? :(
user422318
Quand vous dites «stocke le pixel», vous voulez dire qu'il stocke le coût du terrain du pixel, oui? Parce qu'une certaine valeur RVB est peu susceptible de correspondre au coût réel de ce morceau de terrain. Vous devriez probablement stocker quelque chose entre 1 et 10 (1 étant une route, 10 étant un marais), bien que les valeurs exactes dépendent bien sûr de votre jeu précis.
Myrddin Emrys
1
Hé, auteur de la bibliothèque ici. Utilisez-vous la dernière version de github? github.com/bgrins/javascript-astar/blob/master/astar.js . C'est beaucoup plus rapide que l'ancienne implémentation basée sur une liste.
Brian Grinstead
2
@Brian Vous devriez mettre ce commentaire à la question, plutôt qu'à ma réponse, afin que la personne qui utilise réellement la bibliothèque reçoive la notification dans son e-mail plutôt que moi.
Myrddin Emrys
2

C'est exactement le genre de chose à laquelle A * est destiné. Tout ce que vous devez faire est d'affecter les sommets entre les coûts des nœuds en fonction des types de terrain. (Il semble que vos exemples utilisent un graphique où tous les sommets ont un coût de 1.)

le chaos
la source
0

Cette implémentation est un peu spécifique à l'activation / désactivation en ce moment. Comme le dit Myrddin Emrys, vous devrez modifier le score g en fonction du coût (plutôt que juste de 1). Il y a eu une discussion à ce sujet ici: https://github.com/bgrins/javascript-astar/issues/3 .

J'adorerais que cette solution soit portée dans la bibliothèque principale si vous la faites fonctionner!

Brian Grinstead
la source