Ayuda con la IA del juego de estrategia

8

Estoy desarrollando una IA de juegos de estrategia (piense: Final Fantasy Tactics), y estoy teniendo problemas para diseñar la IA. Mi principal problema es determinar cuál es la mejor opción para hacerlo.

Primero permítanme describir la prioridad de qué acción me gustaría que tome la IA:

  1. Mata a la unidad de jugador más cercana

  2. Cumplir con la directiva principal (matar a todas las unidades de jugador, matar a la unidad objetivo, sobrevivir durante x turnos)

  3. Curar unidad de aliado / búfer de lanzamiento

Ahora la IA puede hacer lo siguiente a su vez:

  • Mover -> {Ataque / Habilidad / Objeto} (ya sea ataque o habilidad u objeto)

  • {Ataque / Habilidad / Objeto} -> Mover

  • Acércate (si los objetivos no están dentro del alcance)

  • {Ataque / Habilidad / Objeto} (si el movimiento no está disponible)

Notas

Las habilidades tienen varios rangos / efectos / costos / efectos. Cada unidad ai tiene entre 5 y 10 habilidades para elegir. La IA priorizará matar sobre la seguridad a menos que su directiva sea sobrevivir durante x turnos. Tampoco le importa que la habilidad cueste mucho. Si bien un jugador puede querer guardar un gran hechizo para más tarde, la IA probablemente lo usará lo antes posible.

El movimiento está en una cuadrícula (hex)

cantidad de unidades de jugador: 3-6

número de unidades ai: 3-7 o más. Probablemente max 10.

La IA y el jugador se turnan para controlar UNA unidad, en lugar de todas al mismo tiempo.

La plataforma es Android (si el programa no responde después de un tiempo, habrá una ventana emergente que le dirá a Force Quit o Wait, ¡lo cual se ve realmente mal!).

Ahora vienen las preguntas:

  • La mejor habilidad para usar obviamente sería la que golpea a la mayoría de los objetivos por el mayor daño. Pero dado que cada habilidad tiene diferentes rangos, no sabré si están dentro del rango sin explorar cada posible lugar al que pueda moverme.

  • Una solución sería ir a cada lugar posible para moverse, determinar el ataque óptimo en esa ubicación, lo que me da una lista de movimientos óptimos para cada ubicación. Luego elija el óptimo de la lista y ejecútelo. Pero esto llevará mucho tiempo de CPU. ¿Hay una mejor solución?

  • Mi idea actual es moverme lo más cerca posible hacia el grupo más grande y cercano de personas, y determinar el ataque / habilidad óptimo desde allí. Creo que esto sería mucho menos trabajo para la CPU y aún permitiría ataques de gran alcance. Es subóptimo pero la IA todavía parecerá "inteligente".

Otras notas / preguntas:

  • ¿Lo estoy pensando demasiado o lo estoy complicando demasiado? Mejor solución? Estoy abierto a todo tipo de sugerencias.
  • He echado un vistazo a la pregunta de lanzamiento de hechizos , pero no tiene en cuenta el movimiento, así que ¿quizás usar ese algo para cada posible ubicación de movimiento? La respuesta principal mencionó que no era genial para el área de efecto y las peleas grupales, ¿entonces tal vez requiera más ajustes?
  • Por favor , si menciona un gráfico / árbol, hágamelo saber básicamente cómo usarlo. Por ejemplo, Nodo significa habilidad, el nivel corresponde al daño, luego busca el nodo más profundo.
f20k
fuente

Respuestas:

8

Hay muchas aplicaciones que podrías usar para este tipo de IA. Personalmente, una de las técnicas más obvias que puede utilizar es una función de evaluación de posición. Killzone hizo uso de esta técnica y se describe en el siguiente documento:

http://www.cgf-ai.com/docs/straatman_remco_killzone_ai.pdf

En realidad, probablemente podría utilizar gran parte de ese papel, ya que describe la representación mundial, los datos de la línea de visión, las tablas de búsqueda, etc., y básicamente ya tiene un gráfico con su cuadrícula hexadecimal (solo necesita agregar nodos vecinos, que en este caso serían los hexágonos vecinos a un solo hexágono).

Otra cosa a tener en cuenta (que es bastante impresionante en este momento, pero un poco más avanzada) son los planificadores. No he leído mucho sobre las redes jerárquicas de tareas, te lo dejo a ti. Un planificador que podría ayudar es GOAP (Planificación de acción orientada a objetivos)

Este enlace tiene mucha información sobre GOAP: http://web.media.mit.edu/~jorkin/goap.html

Algo en lo que acabo de pensar con respecto a su objetivo "Sobrevivir para X número de turnos" es el uso de un mapa de influencia. Un mapa de influencia es solo una representación muy simple para su mundo donde cada nodo (hexágono) tiene un solo valor asociado (llamado influencia).

La influencia se puede calcular de varias maneras, pero un ejemplo para su caso podría ser que los jugadores generen +10 influencia en el hexágono en el que se colocan y +1 influencia en el hexágono que se designa como el rango máximo de jugador.

Entonces, por ejemplo, si tienes un grupo de jugadores agrupados, la influencia a su alrededor sería relativamente alta. Esto podría ser interpretado por la IA como una amenaza para su vida y se aleja de los puntos de mayor influencia.

Estas son solo algunas técnicas que podría usar, pero hay muchas otras. Si desea algo simple, use algo como FSM jerárquicos (más o menos FSM con cada estado que contiene otro FSM con un mayor nivel de detalle). Si desea algo complejo pero funcional y práctico, use GOAP e influya en los mapas. Realmente no importa ser honesto porque el PUNTO PRINCIPAL es hacer que la IA sea divertida, y para eso necesitas implementar algún tipo de "estupidez artificial". Nadie querrá jugar una IA que sea infinitamente más inteligente que ellos, sin importar cuánto esfuerzo le pongas. No digo que suene duro, lo digo porque es importante que la IA cometa errores, ¡porque sus contrapartes humanas lo hacen!

¡Buena suerte! :)

Ray Dey
fuente
1
Gracias por los recursos Los he visto vinculados en el sitio antes. Tendré que leerlo más a fondo ahora para ver cómo puedo aplicarlo a mi juego. Recuerdo haber leído la idea del mapa de influencia en algún lugar por aquí, y esa idea básica es lo que estaba usando para mi idea 'actual'.
f20k
5

A lo largo de los años he escrito 3 IA de juegos, todos los cuales jugaron un juego respetable.

Dos de los casos tenían opciones limitadas por turno, por lo que exploré todas las posibilidades y evalué las posiciones resultantes: modifiqué la profundidad que busqué en función de la dificultad y no se necesitaron muchas capas para hacer un oponente bastante respetable. Pude bajar un par de capas y todavía tener una respuesta en uno o dos segundos y eso fue en algunos procesadores bastante antiguos. (Todo esto fue antes de que Windows apareciera en escena). La calidad del análisis de posición es MUY importante cuando se utiliza este enfoque.

El tercer caso no permitió tal análisis ya que el número de movimientos posibles por turno podría exceder fácilmente las partículas en el universo. Era una situación algo así como Riesgo: territorio con una cantidad de ejércitos, pero se podían hacer cualquier cantidad de movimientos por turno, el factor clave era que los movimientos llevaban tiempo. Una provincia contigua generalmente tomaba 1 turno, una en el otro lado del mapa podía tomar 9.

Usé un enfoque totalmente diferente aquí. Decidí el porcentaje de las fuerzas que se asignarían a la defensa y las asigné en función del valor del territorio y la amenaza enemiga estimada (Si bien se podía ver qué fuerzas movía su oponente, no se podía ver a dónde iban; asumía que los humanos estarían concentrando sus fuerzas en alguna parte y pensaron que era mucho más probable que fuera a donde todos pudieran llegar de una vez en lugar de hacerlo de forma fragmentaria. Miré cada objetivo posible y calculé lo que se necesitaría para tener una buena oportunidad de tomarlo rápidamente (una batalla prolongada destruiría básicamente toda su producción) y generé un conjunto de órdenes de ataque para él. El valor del pedido era el valor de la provincia, el costo fue el número de ejércitos / turnos comprometidos con el ataque. Elija el valor más alto y ejecute las órdenes, repita hasta que las fuerzas disponibles no puedan tomar nada. El tiempo de ejecución fue trivial.

Espero haberte dado algunas ideas aquí.

Loren Pechtel
fuente
1
Hmm, entonces lo que puedo entender del primer párrafo: si haces un árbol de decisión realmente bien pensado, puedes hacer un ai decente en unas pocas capas y aumentar la 'inteligencia' a costa de tiempo bajando otra capa (de dificultad). Creo que probaré esto. Además, me gusta su idea de emitir comandos basados ​​en el valor de una posición.
f20k
4

Su nota sobre dejar de fumar / esperar me sugiere que está haciendo todo el trabajo de procesamiento en el hilo principal de la aplicación. Podrías, suponiendo que haya suficiente compatibilidad de subprocesos en el SDK de Android (que supongo que debe haber), descargar la parte "pensante" de tu IA a un subproceso de trabajo mientras el subproceso principal muestra una IA en el juego que está considerando. .. "UI pero de lo contrario se representa normalmente.

Por supuesto, hay buenas razones para no querer hacer eso, como no querer que la IA tarde tanto tiempo porque el jugador se aburrirá.

En cuanto a su pregunta real, aunque su "idea actual" es viable, es muy simple. Sin embargo, es un buen punto de partida. Es un sistema en el que la IA se centra exclusivamente en los resultados, tratando de maximizar un valor (daño). Otras opciones incluyen un enfoque centrado en el objetivo, donde eliges un objetivo del equipo contrario (aleatoriamente, uno con la mayor cantidad de HP, alguna combinación de los mismos, etc.), y te mueves a ese objetivo, tratando de dañarlo.

Una cosa que quizás quieras considerar es darle a cada habilidad una estadística de 'poder' o 'efectividad' que está oculta para el jugador y que solo es utilizada internamente por tu IA. Usted mismo determina los valores de esta estadística, basándose en su propio conocimiento de las habilidades como programador del juego.

Su IA luego seleccionaría su habilidad mejor calificada e intentaría usarla, si no pueden por cualquier razón, elegir la siguiente, etc. Si se construye de manera suficientemente general, podría comenzar a unir estos dos sistemas, de modo que una vez que establezca un objetivo, tenga heurística para los mejores tipos de ataques en ese objetivo (por ejemplo, ponderar un ataque que hace daño a MP como más efectivo si el objetivo tiene un alto MP).


fuente
1
Para los puntos que mencionó, tiene razón al usar ese hilo. Pensé en un hilo de soporte para los cálculos de IA, pero dado que el usuario moverá su unidad, arrojará los cálculos. Pero sí, es una buena idea. Definitivamente agregaré una heurística para que la IA probablemente elija una habilidad sobre la otra, también permite una IA 'temática' que solo hace ciertas habilidades.
f20k