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:
Mata a la unidad de jugador más cercana
Cumplir con la directiva principal (matar a todas las unidades de jugador, matar a la unidad objetivo, sobrevivir durante x turnos)
- 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.
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í.
fuente
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