Hacer que la IA tome diferentes caminos entre sí

16

Tengo un juego 2D de arriba hacia abajo donde la IA genera en los bordes del mapa y corre hacia el centro.

Estoy usando A * y una malla de nodos para hacer la búsqueda de ruta.

En este momento, la IA genera en un punto en el borde del mapa y todos toman el mismo camino, que es la ruta más corta hacia el centro.

Ahora quiero que sean más sorprendentes e interesantes y tomen diferentes caminos entre sí.

Puedo pensar de inmediato en dos ideas para hacer esto, pero ¿quería saber si hay otras formas o formas mejores que la gente usa a menudo?

  1. Cuando un enemigo genera y genera un camino hacia el centro, aumente temporalmente el costo de todos los nodos en ese camino, luego disminuya lentamente hacia abajo con el tiempo. Entonces la IA enemiga que engendra más tarde se verá obligada a tomar un camino más amplio.

  2. Sin embargo, el enfoque anterior conducirá a la IA a tomar un camino cada vez más amplio y aún será muy predecible. Así que pensé que también introduciría una serie de nodos de objetivos intermedios alrededor del mapa. Cuando la IA aparece, escogen aleatoriamente uno de los objetivos intermedios y se dirigen allí primero antes de dirigirse al centro del mapa. ¿Combinar esto con el enfoque anterior de aumentar los costos podría verse bastante bien?

¿Qué enfoques han encontrado las personas que funcionan mejor para lograr que la IA varíe los caminos que toman, se ve convincente y sorprendente?

TerryB
fuente

Respuestas:

7

Su segunda opción sugiere un enfoque más fundamental: garantizar que los enemigos se acerquen a su jugador desde diferentes direcciones. La pregunta es, ¿hasta dónde tienen que viajar para "desplazarse" a su jugador? Lo ideal para esto sería una mezcla de

  • generar dinámicamente puntos que rodean de cerca (es decir, siguen) la posición del jugador;
  • lo que Nevermind ha sugerido en términos de aleatorizar rutas a estos puntos circundantes, en mayor o menor grado.

De esta manera, puedes asegurarte de que las IA no se desvíen innecesariamente largas solo para obtener una variación de ruta realista al converger en el jugador.

La difusión colaborativa hace lo que quiere implícitamente como parte del algoritmo. Pero no es trivial de implementar.

Ingeniero
fuente
La difusión colaborativa es solo una inundación con algo de peso. Es trivial de implementar, quizás más fácil que A *. Solo requiere una visión diferente de su mundo: un cambio conceptual no trivial, tal vez, pero sin problemas de implementación.
Todavía no es trivial implementarlo como resultado de ser un punto de vista no estándar en términos de gestión de entidades de IA :)
Ingeniero
Gracias Nick Creo que configurar algunos waypoints que rodean al jugador en el centro del mapa será el camino principal a seguir. No estoy seguro en esta etapa si se generarán dinámicamente o si se involucrarán algunas manualidades para cada nivel para mi situación particular. ¡Gracias de nuevo!
TerryB
12

Como primera idea, intente agregar un pequeño valor aleatorio al peso de cada nodo al encontrar rutas. De esta manera, cada agente buscará una ruta en un entorno ligeramente diferente. No estoy seguro de si esto funcionará en su caso, pero debería ser realmente fácil de intentar.

No importa
fuente
Los enemigos terminarán corriendo como pollos, y en un entorno de grano fino los caminos no serán tan diferentes de todos modos. Es una buena adición a otras soluciones, pero no una solución en sí misma
Coyote
@Coyote Esto depende mucho de la estructura de malla de navegación y las relaciones entre los pesos de los nodos, las velocidades y el componente aleatorio. Es por eso que enmarqué la respuesta como una sugerencia para intentar, no como una respuesta definitiva.
importa
De hecho :) Normalmente soy fanático de la entropía. Pero el resultado final rara vez es excelente.
Coyote
De hecho, creo que la respuesta de Nick Wiggill es mucho mejor que la mía. Pero de alguna manera no está recibiendo los votos positivos que merece.
importa
Es ... Pero el tuyo es el primero y más simple ... podríamos tratar de votar en contra: P
Coyote
3

Sin embargo, me gusta la respuesta de Nevermind , dada la limitación descrita en los comentarios, esto es lo que intentaría:

  1. El algoritmo para una sola unidad al centro, registra la distancia total recorrida.
  2. Para cada unidad subsiguiente, asigne una distancia que sea aleatoria y una cantidad más pequeña que esta.
  3. Mientras realiza la A * para cada unidad, agregue un peso adicional en función de lo cerca que esté y de lo lejos que 'quiera' viajar. Esto probablemente sería algo así (distanceToGoal) + Max(0, desiredDistance - distanceTravelled)).

Esto haría que las unidades intenten ir más allá, lo que probablemente sea un camino diferente, lo que podría resultar en que posiblemente tomen caminos diferentes.

También podría agregarlo a su huerestic inicial para cada unidad, pero el rango aleatorio probablemente tendría que ser un poco más grande.

Jonathan Dickinson
fuente
2

Como señaló Nick Wiggill, el enfoque más simple sería obtener un círculo que rodeara el objetivo.

  • asigne aleatoriamente un punto cercano a este círculo como punto de referencia.
  • eliminar todos los caminos en el círculo del camino inicial (o aumentar dramáticamente el valor de estos puntos)
  • luego, desde ese punto de referencia, obtenga el camino hacia el objetivo.

La parte importante es eliminar todos los caminos en el círculo para el waypoint original, ya que probablemente terminarías con enemigos cruzando el círculo para llegar a su waypoint inicial.

A partir de eso, puede obtener cualquier variante jugando con múltiples valores agregando puntos de referencia secundarios en el círculo cercano al inicial, etc.

Coyote
fuente
si su mapa lo admite, encuentre ubicaciones 'interesantes' alrededor de este círculo (puertas, cubiertas, árboles, rocas, edificios; cualquier nodo con alguna ventaja táctica) y haga que sus enemigos se dirijan a esas ubicaciones primero si están disponibles y solo salen el abierto si tienen que hacerlo. Esto se verá mucho más inteligente que simplemente golpear un punto aleatorio en el borde del círculo.
DampeS8N
Gracias Coyote, sí, probablemente voy a ir con la solución Nicks y, como lo sugiere DampeS8N, algunas ubicaciones clave de interés como puntos de referencia. Para evitar el problema de que la IA "cruce el círculo", solo voy a aumentar considerablemente el costo de los nodos en el círculo, por lo que A * debería encaminarlo con suerte :)
TerryB
2

Su problema aquí es esencialmente que A * es un algoritmo para encontrar la ruta más rápida a un objetivo. Si ese es su criterio principal para un 'buen' camino, entonces no es sorprendente que todos sus actores tomen las mismas decisiones.

Lo que debe hacer es modificar sus criterios de calidad para la ruta, de modo que 'el más corto es el mejor' no es el único factor. El elemento de aleatoriedad es clave en esto, pero no tanto como para restar valor a la inteligencia para encontrar el camino (es decir, los actores toman caminos estúpidamente indirectos hacia el objetivo).

A * pathfinding es ingenuo por naturaleza, ya que generalmente supone que el actor tiene un conocimiento perfecto de toda la ruta antes de que comience. Eso siempre se verá poco realista. La solución sugirió que los objetivos intermedios elegidos están a un paso de eso: la IA está tratando de acercarse al objetivo, pero solo trata de navegar en pequeñas secciones a la vez (esto es análogo a la vida real donde solo puedes navegar tan lejos como puede ver, y mientras atraviesa más del camino, puede ver más adelante).

Quizás recomendaría una forma más simple de verlo. Cuando esté buscando caminos, no solo mantenga un solo mejor camino que he encontrado hasta ahora. En su lugar, reúne un conjunto de las mejores 5 o 10 rutas. Use un umbral para descartar valores atípicos obvios. Por ejemplo, si el mejor camino atraviesa 20u para llegar al objetivo, el siguiente mejor atraviesa 21u, y el siguiente después de eso atraviesa 50u. Establezca un umbral de 20% más grande que la mejor ruta, y deseche la ruta de 50u porque es estúpidamente más larga. Ahora tiene varios caminos para elegir, y al seleccionar aleatoriamente de ese conjunto de caminos, sus actores tomarán diferentes decisiones.

Sin embargo, no obtendrá este tipo de información con la búsqueda estándar A *, por lo que creo que tendría que modificar el algoritmo o usar otra cosa para reunir el conjunto de posibles rutas.

MrCranky
fuente
1

Si tienes un pequeño conjunto de enemigos recurrentes (o tipos de enemigos), puedes tratar de darles personalidades que afecten sus movimientos. No tienen que ser grandes cosas, solo cosas que surgen de vez en cuando. Un buen ejemplo de esto son los fantasmas de Pac-Man. Divide tu A * en varios objetivos intermedios. Tal vez un enemigo es realmente estúpido y se pierde fácilmente, yendo en una dirección aleatoria cada tercer nodo (que no sea directamente hacia atrás). Ser creativo.

Algún chico
fuente