Una * explicación detallada del algoritmo (piense personalmente en la versión más detallada y fácil de entender)

1. Información general

Aunque las personas que dominan el algoritmo A * piensan que es fácil, para los principiantes, el algoritmo A * sigue siendo muy complicado.

 

2. El área de búsqueda

Suponemos que alguien quiere moverse del punto A al punto B, pero los dos puntos están separados por una pared. Como se muestra en la Figura 1, el verde es A, el rojo es B y el azul del medio es la pared.

Figura 1

Debería haber notado que dividimos el área a buscar en cuadrículas cuadradas. Este es el primer paso en la búsqueda de rutas, simplificando el área de búsqueda, tal como lo hicimos aquí. Este método en particular reduce nuestra área de búsqueda a una matriz bidimensional. Cada elemento de la matriz representa una cuadrícula y su estado es transitable e inaccesible. Calculando qué cuadrados deben recorrerse de A a B, se encuentra el camino. Una vez que se encuentra el camino, el personaje se mueve desde el centro de un cuadrado al centro de otro cuadrado hasta llegar al destino.

 

El punto central del cuadrado se llama "nodos". Si ha leído otros artículos sobre los algoritmos de búsqueda de caminos A *, encontrará que la gente suele hablar de los nodos. ¿Por qué no describirlo directamente como un cuadrado? Porque podemos dividir el área de búsqueda en otras deformaciones múltiples en lugar de cuadrados, como hexágonos, rectángulos o incluso deformaciones múltiples arbitrarias. Los nodos se pueden colocar en cualquier polígono, se pueden colocar en el centro de múltiples deformaciones o en los lados del polígono. Usamos este sistema porque es el más simple.

 

3. Inicio de la búsqueda

Una vez que reducimos el área de búsqueda a un conjunto de nodos cuantificables, como hicimos anteriormente, el siguiente paso que debemos hacer es encontrar el camino más corto. En A *, comenzamos desde el punto de partida, verificamos los cuadrados adyacentes y luego expandimos hasta encontrar el objetivo.

Comenzamos nuestro viaje de búsqueda de caminos así:

(1) Comience desde el punto de partida A y agréguelo a una lista abierta compuesta por cuadrados. Esta lista abierta es un poco como una lista de compras. Por supuesto, solo hay un elemento en la lista abierta, que es el punto de partida A, y se agregarán más elementos más adelante. La cuadrícula en la lista Abierta indica que la ruta puede o no pasar por el camino. Básicamente, la lista abierta es una lista a cuadros.

(2) Compruebe las casillas adyacentes al punto de partida A (ignore las casillas ocupadas por los muros, las casillas ocupadas por el río y las casillas ocupadas por otro terreno ilegal), y seleccione las casillas transitables o alcanzables La casilla (alcanzable) es también agregado a la lista abierta. Establezca el punto de partida A en el padre (nodo principal o cuadrado principal) de estos cuadrados. Cuando estamos rastreando la ruta, el contenido de estos nodos principales es muy importante. Te lo explicaré más tarde.

(3) Elimine A de la lista abierta y agréguelo a la lista cerrada (lista cerrada). Cada cuadrado en la lista cerrada ya no es necesario para llamar la atención.

Como se muestra en la figura siguiente, el cuadrado verde oscuro es el punto de partida y su marco exterior es azul brillante, lo que indica que el cuadrado se ha agregado a la lista de cierre. Es necesario comprobar los cuadrados negros adyacentes y su marco es de color verde brillante. Cada cuadrado negro tiene un puntero gris que apunta a su nodo principal, aquí está el punto de partida A.

image002.jpg

Figura 2 .

A continuación, debemos seleccionar un cuadrado adyacente al punto de partida A de la lista abierta y repetir los pasos anteriores más o menos como se describe a continuación. Pero, ¿qué cuadrado elegir? El que tiene el valor F más pequeño.

 

4. Clasificación de rutas

La clave para calcular los cuadrados que componen el camino es la siguiente ecuación:

F = G + H

Aquí,

G = El costo de moverse desde el punto de partida A al cuadrado especificado, a lo largo del camino generado para llegar al cuadrado.

H = El costo estimado de moverse desde el cuadrado especificado hasta el punto final B. Esto a menudo se conoce como heurística, lo cual es un poco confuso. ¿Por qué se llama así? Porque es una suposición. No sabremos la distancia real hasta que encontremos el camino, porque hay varias cosas (como paredes, agua, etc.) en el camino. Este tutorial le enseñará un método para calcular H, también puede encontrar otros métodos en Internet.

Nuestro camino se genera así: recorriendo repetidamente la lista abierta y seleccionando el cuadrado con el valor F más pequeño. Este proceso se describe en detalle más adelante. Primero veamos cómo calcular la ecuación anterior.

 

Como se mencionó anteriormente, G es el costo de moverse desde el punto de partida A hasta el cuadrado especificado. En este ejemplo, el costo del movimiento horizontal y vertical es 10 y el costo del movimiento diagonal es 14. Estos datos se utilizan porque la distancia real del movimiento diagonal es la raíz cuadrada de 2, o aproximadamente 1,414 veces el costo del movimiento horizontal o vertical. 10 y 14 se utilizan para simplificar. La relación es correcta, evitamos cálculos abiertos y decimales. No es que no tengamos esta habilidad o que no nos gusten las matemáticas. El uso de estos números también puede hacer que la computadora sea más rápida. Más adelante descubrirá que si no utiliza estas técnicas, el algoritmo de búsqueda de rutas será muy lento.

 

Dado que calculamos el valor G a lo largo del camino hacia el cuadrado especificado, la forma de calcular el valor G del cuadrado es encontrar el valor G de su padre y luego sumar 10 o según si el padre está en línea recta o una dirección diagonal 14. A medida que salgamos del punto de partida y obtengamos más cuadrados, este método se volverá más claro.

 

Hay muchas formas de estimar el valor de H. Aquí usamos el método de Manhattan para calcular el número de cuadrados pasados ​​moviéndonos del cuadrado actual horizontal o verticalmente al objetivo, ignorando el movimiento diagonal y luego multiplicando el total por 10. Se llama método Manhattan porque es muy parecido a contar la cantidad de cuadras que cruza de un lugar a otro y no puede cruzar las cuadras en diagonal. Es importante calcular H para ignorar los obstáculos en el camino. Esta es una estimación de la distancia restante, no un valor real, por lo que se llama heurística.

 

Agregue G y H para obtener F. El resultado de nuestro primer paso se muestra en la siguiente figura. Cada cuadrado está marcado con el valor de F, G y H, al igual que el cuadrado a la derecha del punto de partida, la esquina superior izquierda es F, la esquina inferior izquierda es G y la esquina inferior derecha es H.

image003.jpg

imagen 3

 

Bien, ahora echemos un vistazo a algunos de los cuadrados. En el cuadro marcado con letras, G = 10. Esto se debe a que solo hay un cuadrado desde el punto de partida en la dirección horizontal. Los cuadrados superior, inferior e izquierdo directamente adyacentes al punto de partida tienen valores G de 10, y los cuadrados diagonales tienen valores G de 14.

El valor H se obtiene estimando la distancia de Manhattan desde el punto de inicio hasta el punto final (cuadrado rojo), moviéndose solo horizontal y verticalmente, e ignorando las paredes a lo largo del camino. De esta manera, hay una distancia de 3 cuadrados desde el cuadrado a la derecha del punto de inicio hasta el punto final, entonces H = 30. Hay una distancia de 4 cuadrados desde el cuadrado sobre este cuadrado hasta el punto final (tenga en cuenta que solo se calculan las distancias horizontal y vertical), por lo que H = 40. Para otros cuadrados, puede usar el mismo método para saber cómo se obtiene el valor H.

 

El valor F de cada cuadrado, nuevamente, simplemente agregue el valor G y el valor H directamente.

5. Continuación de la búsqueda

Para continuar la búsqueda, seleccionamos el nodo (cuadrado) con el valor F más pequeño de la lista abierta, y luego realizamos las siguientes operaciones en el cuadrado seleccionado:

(4) Sáquelo de la lista abierta y colóquelo en la lista cerrada.

(5) Marque todas las casillas adyacentes e ignore las casillas de la lista cerrada o las que no se pueden caminar (como muros, agua u otro terreno ilegal). Si la casilla no está abierta, agréguelos a la lista abierta.

Establezca nuestro cuadrado seleccionado como el padre de estos cuadrados recién agregados.

(6) Si un cuadrado adyacente ya está en la lista abierta, verifique si este camino es mejor, es decir, si se llega al cuadrado por el cuadrado actual (el cuadrado que seleccionamos) tiene un valor G menor. Si no es así, no haga nada.

Por el contrario, si el valor G es menor, establezca el padre de ese cuadrado en el cuadrado actual (el cuadrado que seleccionamos) y luego vuelva a calcular los valores F y G de ese cuadrado. Si todavía está confundido, consulte la imagen a continuación.

image004.jpg

Figura 4

Ok, veamos como funciona. De nuestros primeros 9 cuadrados, 8 más están en la lista abierta y el punto de partida se coloca en la lista cerrada. Entre estos cuadrados, el cuadrado a la derecha del punto de partida tiene el valor F más pequeño de 40, por lo que elegimos este cuadrado como el siguiente cuadrado a procesar. Su marco está resaltado con líneas azules.

 

Primero, lo movemos de la lista abierta a la lista cerrada (por eso está resaltado con una línea azul). Luego verificamos el cuadrado adyacente a él. El cuadrado a la derecha es la pared, que ignoramos. El cuadrado a la izquierda es el punto de partida, que también se ignora en la lista de cierre. Los otros 4 cuadrados adyacentes están en la lista abierta Necesitamos verificar si el camino a través de este cuadrado es mejor y usar el valor G para determinar. Miremos el cuadrado de arriba. Ahora tiene un valor G de 14. Si llegamos allí por el cuadrado actual, el valor G será 20 (donde 10 es el valor G para llegar al cuadrado actual, más el valor G 10 que se mueve verticalmente desde el cuadrado actual al cuadrado superior). Obviamente, 20 es mayor que 14, por lo que esta no es la ruta óptima. Si miras la imagen, lo entenderás. Es mejor moverse diagonalmente desde el punto de partida a ese cuadrado que moverlo horizontalmente y luego verticalmente.

 

Después de comprobar los 4 cuadrados adyacentes en la lista abierta, no se encuentra un camino mejor a través del cuadrado actual, por lo que no hacemos ningún cambio. Ahora que hemos comprobado todos los cuadrados adyacentes del cuadrado actual y los hemos procesado, es hora de seleccionar el siguiente cuadrado que se procesará.

 

Entonces, recorremos nuestra lista abierta nuevamente, y ahora solo tiene 7 cuadrados, debemos elegir el que tenga el valor F más pequeño. Lo interesante es que esta vez hay dos cuadrados con valores F de 54. ¿Cuál debería elegir? No importa. Desde la perspectiva de la velocidad, es más rápido elegir el último cuadrado que se agregará a la lista abierta. Esto conduce a la preferencia de usar los cuadrados recién encontrados primero al acercarse al objetivo durante el proceso de búsqueda de ruta. Pero esto no es importante. (El tratamiento diferente de los mismos datos hace que las dos versiones de A * encuentren diferentes caminos de igual longitud).

 

Seleccionamos el cuadrado en la parte inferior derecha del punto de partida, como se muestra en la figura siguiente.

image005.jpg

Figura 5

 

Esta vez, cuando revisamos los cuadrados adyacentes, encontramos que el cuadrado de la derecha es una pared, así que ignóralo. Lo mismo ocurre con lo anterior.

También ignoramos un cuadrado debajo de la pared. ¿Por qué? Porque si no cruza la esquina, no puede moverse directamente del cuadrado actual a ese cuadrado. Primero debes bajar y luego moverte a ese cuadrado para doblar la esquina. (Nota: la regla de cruzar la esquina es opcional y depende de cómo se coloquen sus nodos)

 

Esto deja 5 cuadrados adyacentes. Los dos cuadrados debajo del cuadrado actual aún no se han agregado a la lista abierta, así que agréguelos y establezca el cuadrado actual como su padre. De los 3 cuadrados restantes, 2 ya están en la lista de cierre (uno es el punto de partida, el otro es el cuadrado sobre el cuadrado actual, el marco exterior está resaltado), los ignoramos. El último cuadrado, que es el cuadrado a la izquierda del cuadrado actual, verificamos si hay un valor G más pequeño para llegar allí a través del cuadrado actual. No. Así que estamos listos para seleccionar el siguiente cuadro que se procesará de la lista abierta.

 

Repita este proceso hasta que el punto final también se agregue a la lista abierta, como se muestra en la figura siguiente.

image006.jpg

Figura 6

 

Tenga en cuenta que el padre del cuadrado 2 cuadrados debajo del punto de partida es diferente al anterior. Anteriormente, su valor G era 28 y apuntaba al cuadrado de la esquina superior derecha. Ahora su valor G es 20 y apunta al cuadrado directamente encima de él. Esto sucede en algún lugar del proceso de búsqueda de ruta, cuando se usa la nueva ruta, el valor G se verifica y se vuelve más bajo, por lo que el nodo principal se restablece y los valores G y F se recalculan. Aunque este cambio no es importante en este ejemplo, en muchos casos, este cambio puede generar grandes cambios en los resultados de la búsqueda de rutas.

 

Entonces, ¿cómo determinamos el camino real? Es muy simple, comience desde el final, presione la flecha para moverse al nodo principal, de modo que regrese al punto de partida, este es su camino. Como se muestra abajo. Moverse desde el punto de inicio A hasta el punto final B es simplemente moverse desde el centro de un cuadrado en el camino al centro de otro cuadrado hasta el objetivo. ¡Es así de simple!

image007.jpg

Figura 7

 

6. Resumen del método A *

Ok, ahora que ha leído la introducción completa, ahora juntamos todos los pasos:

(1) Agregue el punto de partida a la lista abierta.

(2) Repita el siguiente proceso:

                        a. Recorra la lista abierta, busque el nodo con el valor F más pequeño y utilícelo como el nodo que se procesará actualmente.

                        b. Mueva este nodo a la lista de cierre.

                        c. ¿Para cada uno de los 8 cuadrados adyacentes del cuadrado actual?            

                                         ◆ Si es inalcanzable o está en la lista cerrada, ignórelo. De lo contrario, haga lo siguiente.

                                         ◆ Si no está en la lista abierta, agréguelo a la lista abierta, establezca el cuadrado actual como padre y registre los valores F, G y H del cuadrado.

                                         ◆ Si ya está en la lista abierta, verifique si este camino (es decir, para llegar a él a través de la cuadrícula actual) es mejor, y use el valor G como referencia. Un valor de G más pequeño indica que este es un mejor camino. Si es así, establezca su padre en el cuadrado actual y vuelva a calcular sus valores G y F. Si su lista abierta está ordenada por valor F, es posible que deba volver a ordenar después del cambio.

                         d. Deténgase cuando

                                         ◆ Agregue el punto final a la lista abierta, en este momento se ha encontrado la ruta, o

                                         ◆ Falló la búsqueda del punto final y la lista abierta está vacía, no hay ruta en este momento.

(3) Guarde la ruta. Desde el punto final, cada cuadrado se mueve a lo largo del nodo principal hasta el punto de inicio, este es su camino.

7. Fuera de tema (pequeña perorata)

Por favor, perdone mi digresión. Cuando vea varias discusiones sobre el algoritmo A * en Internet o en el foro, ocasionalmente encontrará algunos códigos A *, de hecho no lo son. Para usar A *, debe incluir todos los elementos discutidos anteriormente, especialmente la lista abierta, la lista cerrada y los costos de ruta G, H y F. Hay muchos otros algoritmos de búsqueda de rutas, estos algoritmos no son algoritmos A *, A * se considera el mejor. En algunos de los artículos citados al final de este artículo, Bryan Stout analiza algunos de ellos, incluidos sus pros y contras. En algún momento puede elegir uno de los dos, pero debe comprender lo que está haciendo. Ok, no más tonterías. Volver al artículo.

 

8. Notas sobre la implementación

Ahora que comprende el método básico, aquí hay algunas cosas adicionales que debe considerar al escribir sus propios programas. Los siguientes materiales citan algunos programas que escribí en C ++ y Basic, pero también son válidos para otros lenguajes.

 

(1) Mantener lista abierta: esta es la parte más importante de A *. Cada vez que visita la lista Abierta, debe encontrar el cuadrado con el valor F más pequeño. Hay varias formas de hacer esto. Puede guardar los elementos de la ruta a voluntad.Cuando necesite encontrar el cuadrado con el valor F más pequeño, recorra toda la lista abierta. Esto es muy simple, pero será muy lento para caminos muy largos. Este método se puede mejorar manteniendo una lista ordenada, y cada vez que necesite encontrar el cuadrado con el valor F más pequeño, simplemente saque el primer elemento de la lista. Cuando escribí el programa, este fue el primer método que utilicé.

      

       Para mapas pequeños, esto puede funcionar bien, pero no es la solución más rápida. Los programadores A * que persiguen la velocidad usan algo llamado montón binario, y yo también lo uso en mi programa. En mi experiencia, este método es 2-3 veces más rápido en la mayoría de los casos y aumenta geométricamente (10 veces o incluso más rápido) para trayectos más largos. Si desea obtener más información sobre los montones binarios, lea Uso de montones binarios en A * Pathfinding  .

(2) Otras unidades: si lee mi programa con mucho cuidado, notará que ignoré completamente otras unidades. Mis exploradores pueden cruzarse entre sí. Depende del juego, tal vez pueda o tal vez no. Si desea considerar otras unidades y desea que se desvíen entre sí cuando se muevan, sugiero que su programa de búsqueda de rutas las ignore y escriba algunos programas nuevos para determinar si dos unidades colisionarán. Si ocurre una colisión, puede generar una nueva ruta o usar algunas reglas de movimiento estándar (como moverse siempre hacia la derecha, etc.) hasta que el obstáculo ya no esté en el camino y luego generar una nueva ruta. ¿Por qué no se incluyen otras unidades en el cálculo de la ruta inicial? Debido a que otras unidades son móviles, es posible que no estén en su lugar cuando llegue. Esto puede producir algunos resultados extraños: una unidad gira repentinamente para evitar chocar con una unidad que ya no existe, y después de calcular su trayectoria, choca con aquellas unidades que la atraviesan.

Ignorar otras unidades en el código de búsqueda de rutas significa que debe escribir otro código para manejar las colisiones. Estos son los detalles del juego, así que os dejo la solución. Vale la pena conocer varias soluciones en el artículo de Bryan Stout citado al final de este artículo.

(3) Algunos consejos de velocidad: si está desarrollando su propio programa A * o adaptando el programa que escribí, encontrará que la búsqueda de rutas requiere mucho tiempo de CPU, especialmente cuando tiene bastantes buscadores de rutas y un mapa grande. Si ha leído la información en Internet, encontrará que incluso en el desarrollo de StarCraft, los expertos de Age of Empires son así. Si encuentra que las cosas se están ralentizando debido a la búsqueda de rutas, aquí hay algunas buenas ideas:

                                         ◆ Utilice mapas pequeños o menos exploradores.

                                         ◆ Nunca encuentre caminos para varios buscadores al mismo tiempo. En su lugar, colócalos en una cola y distribúyelos en varios ciclos de juego. Si su juego se ejecuta a una velocidad de 40 ciclos por segundo, nadie puede detectarlo. Pero si hay una gran cantidad de exploradores que buscan caminos al mismo tiempo, inmediatamente descubrirán que el juego se ralentiza.

                                         ◆ Considere usar cuadrados más grandes en el mapa. Esto reduce el número de cuadrados que deben buscarse para encontrar caminos. Si es ambicioso, puede diseñar múltiples esquemas de búsqueda de caminos, que se pueden usar en diferentes situaciones según la longitud del camino. Esta es también la práctica de los profesionales, utilizando cuadrados grandes para caminos largos y cuadrados pequeños cuando estás cerca del objetivo. Si está interesado en esto, consulte  Búsqueda de caminos A * de dos niveles  .

                                         ◆ Para caminos muy largos, considere usar un sistema de puntos de referencia, o puede calcular previamente el camino y agregarlo al juego.

                                         ◆ Procese previamente su mapa y señale qué áreas no son accesibles. Estas áreas se llaman "islas". De hecho, pueden ser islas, o cualquier área a la que no se pueda acceder porque están rodeadas de muros, etc. El límite inferior de A * es que cuando le dice que busque la ruta a qué área, buscará en todo el mapa hasta que todos los cuadrados accesibles se hayan procesado a través de la lista abierta o lista cerrada. Esto desperdicia mucho tiempo de CPU. Esto se puede solucionar preconfigurando áreas inalcanzables. Registre esta información en algún tipo de matriz y compruébela antes de buscar la ruta. En mi versión Blitz del programa, escribí un preprocesador de mapas para lograr esto. Puede identificar rutas muertas que el algoritmo de búsqueda de rutas ignorará de antemano, lo que mejora aún más la velocidad.

(4) Diferentes pérdidas de terreno: en este tutorial y en mi programa, solo hay dos tipos de terreno: alcanzable e inalcanzable. Pero si tienes un terreno accesible, el costo de la mudanza será mayor. Los pantanos, colinas, escaleras de mazmorras, etc. son terrenos accesibles, pero el costo de la mudanza es más alto que el de un terreno plano. De manera similar, el costo de mudanza de una carretera es menor que el terreno que la rodea.

Este problema se puede resolver fácilmente agregando el costo del terreno cuando se calcula el valor G de un cuadrado dado. Simplemente agregue un costo adicional a estos cuadrados. El algoritmo A * se utiliza para encontrar la ruta con el costo más bajo, que debería ser fácil de manejar. En mi ejemplo simple, solo hay dos tipos de terreno: alcanzable e inalcanzable. A * buscará el camino más corto y directo. Pero en un entorno con el costo del terreno, el camino menos costoso puede ser muy largo.

Es como rodear el pantano a lo largo de la carretera en lugar de cruzarlo directamente.

Otra cosa a considerar es lo que los expertos llaman "Mapeo de influencia". Al igual que el terreno de costo variable descrito anteriormente, puede crear un sistema de puntuación adicional y aplicarlo a la IA de búsqueda de caminos. Suponga que tiene un mapa de este tipo. Hay un pasaje a través de la colina en el mapa. Hay una gran cantidad de exploradores que atraviesan este pasaje. Cada vez que la computadora genera un camino a través de ese pasaje, se llenará de gente. Si es necesario, puede generar un mapa de influencia, que castiga las casillas donde ocurrirá una masacre. Esto permitirá que la computadora elija un camino más seguro, y también puede ayudarlo a evitar continuar enviando equipos o exploradores a un camino específico debido al camino corto (y más peligroso, por supuesto).

(5) Mantenga áreas no detectadas: cuando juega juegos de PC, encuentra que la computadora siempre puede seleccionar con precisión la ruta, incluso el mapa no es detectado. Para los juegos, la búsqueda de caminos es demasiado precisa pero poco realista. Afortunadamente, este problema es fácil de solucionar. La respuesta es crear una matriz de caminabilidad conocida independiente para cada jugador y computadora (cada jugador, no cada unidad, eso desperdiciaría mucha memoria). Cada matriz contiene información sobre las áreas que el jugador ha detectado y otras áreas que se supone que son accesibles hasta que se confirme. Con este método, la unidad se mantendrá en el callejón sin salida de la carretera y tomará la decisión incorrecta hasta que encuentre un camino a su alrededor. Una vez que se detecta el mapa, la búsqueda de rutas vuelve a funcionar como de costumbre.

(6) Ruta suave: A * le dará automáticamente la ruta más corta y menos costosa, pero no le dará automáticamente la ruta más suave. Mire la ruta que se encuentra en nuestro ejemplo (Figura 7). En este camino, el primer paso está en la parte inferior derecha del punto de inicio. Si el primer paso está directamente debajo del punto de inicio, ¿el camino será más suave?

       Hay varias formas de solucionar este problema. Cuando calcula la ruta, puede castigar esos cuadrados que cambian de dirección y agregar un costo adicional a su valor G. Otra opción es que puede recorrer el camino que genera y encontrar aquellos lugares donde reemplazar el camino con cuadrados adyacentes hará que el camino sea más suave. Para obtener más información, consulte  Hacia una búsqueda de caminos más realista  .

(7) Área de búsqueda no cuadrada: en nuestro ejemplo, usamos áreas cuadradas que son todas 2D. Puede utilizar zonas irregulares. Piense en los países en el juego de aventuras, puede diseñar un nivel de orientación como ese. Necesita crear una tabla para almacenar la relación de vecino entre países y el valor G para moverse de un país a otro. También necesita una forma de estimar el valor H. Todo lo demás se puede tratar igual que en el ejemplo anterior. Cuando agrega un nuevo elemento a la lista abierta, en lugar de usar cuadrados adyacentes, mira los países adyacentes en la lista.

Del mismo modo, puede crear un sistema de puntos de referencia para la ruta de un mapa de terreno fijo. Los waypoints suelen ser puntos de inflexión en carreteras o pasajes de mazmorras. Como diseñador de juegos, puede preestablecer puntos de ruta. Si no hay obstáculos en la línea de dos waypoints, se consideran adyacentes. En el ejemplo de un juego de aventuras, puede guardar esta información adyacente en algún tipo de tabla y usarla cuando se agrega un nuevo elemento a la lista abierta. Luego registre el valor G (puede usar la distancia en línea recta entre los dos nodos) y el valor H (puede usar la distancia en línea recta desde el nodo hasta el objetivo). Quiero ocuparme de todo lo demás como siempre.

 

8. Lecturas adicionales

Bien, ahora tiene un conocimiento básico de A * y algunos temas avanzados. Te recomiendo encarecidamente que eches un vistazo a mi código El paquete comprimido contiene dos versiones de la implementación, una es C ++ y la otra es Blitz Basic. Ambas versiones tienen comentarios, por lo que puede comprenderlos fácilmente. Aqui esta el link:

Código de muestra: A * Pathfinder (2D) Versión 1.71  。

 

Si no sabe cómo usar C ++ o BlitzBasic, puede encontrar dos archivos exe en la versión C ++. La versión BlitzBasic debe ir al sitio web  Blitz Basic para  descargar la Demo gratuita de BlitzBasic 3D para que funcione. Aquí  puede ver un ejemplo de verificación en línea A * de Ben O'Neill.

 

Debería leer los artículos en los siguientes sitios. Puede comprenderlos más fácilmente después de terminar este tutorial.

Páginas A * de Amit  : este artículo de Amit Patel es ampliamente citado, pero si no ha leído este tutorial, es posible que se sienta muy confundido. Especialmente puedes ver algunos de los pensamientos del propio Amit Patel.

Movimientos inteligentes: búsqueda inteligente de caminos  : el artículo de Bryan Stout debe ir a Gamasutra.com para registrarse y leerlo. El programa escrito por Bryan en Delphi me ayudó a aprender A * y al mismo tiempo me dio algo de inspiración en mi programa. También elaboró ​​otras opciones para A *.

Terrain Analysis  : un artículo atractivo y de muy alto nivel de Dave Pottinger. Es un experto en Ensemble Studios. Este tipo ajustó el juego Age of Empires y Age of Kings. No espere poder leer todo aquí, pero este es un artículo atractivo que puede darle algunas buenas ideas. Discute el paquete mip-mapping,

mapeo de influencia y otros temas de búsqueda de caminos de IA de alto nivel. Su inundación me inspiró al tratar con callejones sin salida "callejones sin salida" e islas "isla". Esto está incluido en mi versión Blitz del programa.

 

También vale la pena visitar los siguientes sitios:

·                      AiGuru: Pathfinding

·                      Recurso de IA del juego: Pathfinding

·                      GameDev.net: Pathfinding 


Gracias.

 

Código: https://www.redblobgames.com/pathfinding/a-star/implementation.html#cplusplus

Reimpreso: https://blog.csdn.net/hitwhylz/article/details/23089415

Supongo que te gusta

Origin blog.csdn.net/Zhouzi_heng/article/details/115035298
Recomendado
Clasificación