2010-06-28 21 views
15

Estoy implementando una estrategia basada en cuadritos basada en turnos en las líneas de las tácticas de Final Fantasy.AI para un juego final de táctica de fantasía

¿Tiene alguna idea sobre cómo puedo acercarme a la selección de objetivos, el movimiento y el proceso de selección de habilidades?

Estoy considerando la posibilidad de desconectar las decisiones, pero todas estas 3 decisiones están en gran parte acopladas. (por ejemplo, no puedo decidir a dónde moverme a menos que sepa a quién voy a atacar, y qué rango usaré, y viceversa, no puedo decidir a quién atacar a menos que sepa cuántas vueltas me llevará alcanzar cada objetivo)

Quiero avanzar hacia un sistema unificado, pero probar cosas de la investigación de campo potencial utilizada de una manera como en el Killzone 1 AI me tiene atascado en los máximos locales.

actualización === 1

actualmente estoy tratando de utilizar campos potenciales/influencia mapas para generar los datos que tomo decisiones sobre.

No tengo ni idea de cómo manejar muchas habilidades y habilidades que no causan daño, sino que suavizan/debilitan o alteran el mundo.

Alguien en otro lugar sugirió usar Monte Carlo Tree Search, que se usa actualmente en los juegos Go.

Creo que el espacio que mis actores usarán no es bueno para él, ya que muchos movimientos en el juego no resultan en una posición desde la que atacar y afectar al mundo (estoy en un mundo más grande que Final Fantasy Tactics)

en Final Fantasy Tactics podría ser aplicado con éxito, aunque el factor de ramificación es mucho más grande que el de 9x9 Ir (por lo que entiendo)

===

Gracias de antemano Xtapodi.

ps.1 - Un problema es que para saber con precisión qué tan lejos está un enemigo, tendría que encontrarlo, porque aunque el enemigo está cerca, un acantilado infranqueable podría estar separándonos, lo que lleva 4 giros. O peor, una unidad está bloqueando el camino, digamos un puente, por lo que no hay forma de contactarlo.

Respuesta

12

Un enfoque que he usado es hacer un sistema de dos pasos.

Primero, averigüe a dónde puede llegar su unidad. Usa A * o lo que sea para marcar el terreno para ver qué tan lejos puede moverse la unidad este turno.

Una vez que sepa eso, siga las tácticas disponibles (ataque cuerpo a cuerpo, unidad amiga de curación, lo que sea) y asigne una función de aptitud para todos los usos disponibles de la táctica. Si pasas por el terreno señalado, puedes determinar rápidamente cuál es tu espacio de posibles tácticas.

Esto le brinda una lista de las tácticas disponibles y sus funciones de acondicionamiento físico para cada movimiento. Seleccione el mejor o al azar desde la parte superior. Si no hay ninguna táctica disponible, repita el proceso marcando el terreno para dos movimientos, y así sucesivamente.

Lo que quiero decir con la función de aptitud física es decidir sobre el "valor" de realizar la táctica en una determinada unidad o ubicación. Por ejemplo, tu fase de decisión táctica de "sana una unidad amiga" podría pasar por todas las unidades amigas. Si una unidad amiga está dentro del rango (es decir, se puede alcanzar desde una ubicación a la que puede llegar su unidad), agréguela a la lista de posibles tácticas y déle una calificación de aptitud igual a, digamos, 100 * (1.0 unidad de salud), donde la salud de la unidad varía de 0 a 1. Por lo tanto, curar a un personaje con solo un 10% de vida restante valdría 90 puntos, mientras que una unidad con solo un 5% solo valdría 5, y la unidad ni siquiera consideraría curar un daño unidad. Las unidades especiales (es decir, las unidades de escenario "proteger al jefe" necesarias para conservar las condiciones de victoria) podrían recibir un número de base mayor, para que las unidades amigas les presten más atención.

De forma similar, su fase de decisión de "ataque cuerpo a cuerpo" pasaría por todas las unidades enemigas alcanzables, calcularía el posible daño y lo compararía con la salud de la unidad.Dale a cada unidad la "deseabilidad" para atacar, y multiplícala por el porcentaje de salud restante que probablemente tengas, y tienes una función de acondicionamiento físico bastante detallada que favorece la eliminación de unidades cuando puedes, pero aún persiste después de un alto valor objetivos.

Usando un proceso como este, obtendrás una lista de opciones como "Mover a la ubicación A y curar la unidad amiga B: 50 puntos", "Mover a la ubicación C y atacar a la unidad hostil D: 15 puntos", etc. De repente, es muy fácil elegir una táctica.

Se pueden agregar más detalles al multiplicar la aptitud de la táctica por una forma física para el camino que debería tomar para implementarla. Por ejemplo, si el lugar al que tendrías que mudarte para sanar a una unidad amiga te pone en grave peligro (es decir, de pie en un espacio de lava o algo así), puedes factorizarlo multiplicando la aptitud de esa táctica por .2 más o menos, para que la unidad aún pueda considerarlo, pero solo si es realmente importante. Todo lo que se necesita es escribir un algoritmo para evaluar la aptitud de una ubicación determinada, y podría ser tan simple como un número precomputado de "deseabilidad del terreno" o tan complejo como mantener "mapas de amenazas" de unidades enemigas.

La parte difícil, por supuesto, es encontrar las medidas adecuadas para que el motor sea inteligente. Pero esa es la parte divertida de tu sistema para modificar.

+0

Muchas gracias cc por tu respuesta detallada. A menudo me acerqué a lo que describes, lo que es una gran idea es que amplías tu espacio de búsqueda si no encuentras nada intersting. ¿Cómo tomarías posiciones en cuenta sin ninguna acción que ofrezca una ventaja táctica? Por ejemplo, si tiene un caballero y 2 arqueros, el caballero cargará muy lejos del alcance, los arqueros pueden ser de ayuda en su modelo. A la inversa, si agregas aptitud para estar parado en algún lado, entonces, ¿cómo decidirías expandir tu espacio de búsqueda? – Xtapodi

+0

Manipúlalo dándole forma física al terreno que favorezca el comportamiento que deseas. Para los luchadores cuerpo a cuerpo, los lugares cercanos al enemigo que tienen un nivel de forma física más elevado mueven al luchador más cerca, pero al agregar "unidades cercanas" se mantienen juntas tus unidades. Capa de suficientes consideraciones de fitness, y sus unidades se vuelven inteligentes, incluso si no mira hacia adelante un turno. También es fácil caer en tácticas específicas con este sistema. Si tiene un nivel con un puente levadizo levantado, agregue una función de aptitud para el camino al mecanismo de descenso. –

1

Una buena pregunta las respuestas pueden estar por todas partes. Personalmente, no tengo mucha experiencia con esto, pero establecería una estrategia en torno al concepto, no a la distancia.

Va a crear una máquina de estados para cada NPC. Predicará un personaje para atacar a través de algunos ajustes.

Por ejemplo, un NPC se marcará como Ataque más débil o Ataque más fuerte o Ataque más dañado. Luego trataría de colocarlos de manera que puedan dañar el objetivo deseado.

Si también tiene curanderos, puede hacer lo mismo en reversa para el objetivo del sanador.

El cambio de objetivos también será una parte importante de este sistema. Entonces querrás pensar en eso. Una versión simple es reevaluar el cambio de objetivo a un porcentaje dado de los giros.

Y, por último, agregaría posibilidades al azar en el sistema.Por ejemplo, un personaje podría estar configurada de la siguiente

ataque más débil 0,25 más fuerte ataque 0,50 Ataque mayoría de los heridos 0,25

Cambio de destino 0.1

Cuando es el momento de atacar. Generas un número aleatorio de 0-1. Si está debajo de ti Cambia objetivos, cambia el objetivo generando otro número aleatorio de qué objetivo atacar.

Puede comenzar a factorizar la distancia en su sistema al aumentar los porcentajes del modo de ataque. Por ejemplo, si tomaría 3 turnos atacar a los más heridos. Disminuya su porcentaje de ser objetivo dividiendo ese valor por 3 y distribuyendo la diferencia a las otras dos posibilidades.

+0

Gracias por la gran entrada madmik3. Me gustan muchas de las ideas que propones, mi mentalidad actual se basa en un algoritmo codicioso que siempre elige la mejor acción en este turno, que puede ser muy defectuosa cuando se ve desde un jugador. En su último párrafo, la cosa es que podría estar cerca de un oponente pero en realidad separado por un río que tiene 3 vueltas para cruzar, ¿sugeriría buscar para cada posible objetivo (caro) en la selección del objetivo, pero mantener el objetivo ¿La selección ocurrirá cada turno para equilibrar la carga de ejecución? – Xtapodi

+0

@Xtapodi: los juegos de estrategia en tiempo real implementan rutinas de ruta para todas sus unidades sin mucho problema. El costo de implementar rutinas de ruta para la cantidad mucho menor de unidades en un juego basado en turnos, estilo FFT, donde el tiempo de computación es mucho menos problemático, me parece bastante despreciable, incluso si está revisando las rutas. a todos los posibles objetivos. De hecho, te sugiero que lo hagas así, porque luego puedes calcular, en función de otros factores, como la salud de la unidad de jugador, etc., si las unidades enemigas deberían moverse a otra parte en lugar de enfocarse en la unidad de PC más cercana. – JAB

+0

@JAB: Gracias por tu comentario. Lo que dices sobre RTS puede ser cierto (dependiendo del juego) pero también tomó algunos meses de trabajo de personas que ya tenían mucha experiencia. Sí, estar basado en turnos me da mucho más tiempo para procesar. ¿Sugeriría que ejecute un Dijkstra de cada unidad de jugador (actualmente 4 - 5) y luego dejar que la IA trabaje con esos datos? – Xtapodi

3

Si el terreno donde ocurre la batalla está predeterminado, o no demasiado ancho, there es un artículo sobre el razonamiento del terreno en FPS que se puede utilizar como base para un juego por turnos.

En resumen, calcula previamente para cada celda del mapa un conjunto de valores, como la idoneidad para disparar en una dirección determinada, protección, visibilidad ... y así sucesivamente. la IA puede usar estos valores para elegir una acción correcta. Por ejemplo, el luchador caminará lo más rápido posible hacia el enemigo, usando protección si está disponible, mientras que el ladrón tomará un camino donde la visibilidad desde la dirección del enemigo sea lo más baja posible, con el objetivo de atacar desde el flanco o la retaguardia.

si el terreno es aleatorio y/o demasiado ancho, sin embargo, el precálculo puede ser demasiado largo para ser útil.

respecto Guillaume

+0

Gracias, Guillaume por la respuesta, todavía estoy leyendo el documento y pensando en cómo y si puedo aplicarlo. Tengo la sensación de que para algunas cosas tener datos aproximados puede parecer realmente malo en este tipo de juego, por ejemplo, la línea de visión. – Xtapodi

+0

sí y no. no tienes línea de vista, solo el hecho de que la celda en la que se encuentra el enemigo tiene una baja visibilidad a la izquierda. Por lo tanto, puedes usarlo para restringir tu búsqueda de ruta a este lado del enemigo. Otro ejemplo: sabiendo que el enemigo tendrá que pasar por un área y sabiendo que la posición de disparo es muy buena para esta área (es decir, buena visibilidad para esta área, gran cantidad de pequeños obstáculos en esta dirección, bajo acceso o visibilidad en otra dirección).) puede ser útil para un francotirador de IA :) Pero efectivamente debes verificar la línea de visión real –

Cuestiones relacionadas