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.
la source
Réponses:
Vous devez faire attention à une ligne très spécifique de l'algorithme:
C'est le coût de ce nœud particulier. Vous voudriez le modifier en quelque chose comme
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.
la source
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.)
la source
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!
la source