Estoy creando un juego de acción basado en mapas 2D con un diseño de interacción similar al de Diablo II. En otras palabras, el jugador hace clic alrededor de un mapa para mover a su jugador. Acabo de terminar el movimiento del jugador y estoy avanzando hacia la búsqueda de caminos.
En el juego, los enemigos deben cargar el personaje del jugador. También hay cinco tipos de terreno diferentes que otorgan bonificaciones de movimiento diferentes. Quiero que la IA aproveche estas bonificaciones de terreno mientras intentan llegar al jugador.
Me dijeron que revisara el algoritmo de búsqueda A * (http://en.wikipedia.org/wiki/A*_search_algorithm). Estoy haciendo este juego en HTML5 y JavaScript, y encontré una versión en JavaScript: http://www.briangrinstead.com/blog/astar-search-algorithm-in-javascript Estoy tratando de descubrir cómo ajustarlo aunque.
A continuación se presentan mis ideas sobre lo que necesito cambiar. ¿De qué más debo preocuparme?
- Cuando creo un gráfico, necesitaré inicializar la matriz 2D que paso con un recorrido de un mapa que corresponde a los diferentes tipos de terreno.
- en graph.js: la definición "GraphNodeType" debe modificarse para manejar los 5 tipos de terreno. No habrá muros.
- en astar.js: será necesario modificar la puntuación g y h . ¿Cómo debería hacer esto?
- en astar.js: isWall () probablemente debería eliminarse. Mi juego no tiene paredes.
- en astar.js: No estoy seguro de qué es esto. Creo que indica un nodo que no es válido para ser procesado. ¿Pero cuándo sucederá esto?
- En un nivel alto, ¿cómo cambio este algoritmo de "oh, ¿hay un muro allí?" a "¿este terreno me llevará al jugador más rápido que el terreno que me rodea?"
Debido al tiempo, también estoy debatiendo la reutilización de mi algoritmo de Bresenham para los enemigos. Desafortunadamente, los diferentes bonos de movimiento del terreno no serán utilizados por la IA, lo que hará que el juego sea una mierda. : / Realmente me gustaría tener esto en el prototipo, pero no soy desarrollador de oficio ni científico de la computación. :RE
Si conoce algún código que haga lo que estoy buscando, ¡comparta!
Consejos de comprobación de cordura para esto también son apreciados.
fuente
Respuestas:
Debe prestar atención a una línea muy específica en el algoritmo:
Este es el costo de ese nodo en particular. Desea modificarlo a algo como
Esto hará que el camino evite terrenos caros y prefiera terrenos baratos; es su responsabilidad hacer que 'currentNode.cost' devuelva algo apropiado para su terreno. Es el hecho de que no todo el terreno tiene un costo de 1 al que le estás prestando atención ... algunos terrenos son más baratos que otros. Hay otras consideraciones, pero este punto específico en el código debe ser el foco de su atención.
fuente
Este es exactamente el tipo de cosa para la que A * es. Todo lo que necesita hacer es asignar los vértices entre los costos de los nodos en función de los tipos de terreno. (Parece que sus ejemplos usan un gráfico donde todos los vértices tienen un costo de 1.)
fuente
Esta implementación es un poco específica para el encendido / apagado en este momento. Como dice Myrddin Emrys, deberá modificar el puntaje g según el costo (en lugar de solo 1). Hubo una discusión sobre esto aquí: https://github.com/bgrins/javascript-astar/issues/3 .
¡Me encantaría portar esta solución a la biblioteca principal si la haces funcionar!
fuente