Modelado del Daimyo artificial. Optimizando la extracción de recursos en juegos RTS.

No comments »

Una de las tareas principales de un juego RTS es la de recolectar los recursos que
necesitamos para desarrollar nuestra estrategia de crecimiento a todos los niveles: tecnologías, efectivos, edificios y cualquier otro elemento que pueda intervenir en el juego.

El Daimyo era la figura en el entorno feudal japonés que poseia un terreno y se encargaba de administrarlo. Cuando no estaban en guerras con el resto de Daimyos era porque uno de ellos habia asumido el rol de Shogun o repartidor de palos máximo, en cuyo caso el resto tenian que dar buena cuenta de lo que se cocía en su territorio. De cualquier modo, la visión del daimyo que reparte la pana en su tierra y que debe cumplir con una serie de peticiones del Shogun en materia de tributos es la que nos interesa a nosotros. Nos vamos a dedicar a construir un Daimyo para nuestro sistema de entretenimiento de estrategia en tiempo real. Veamos que tenemos que tener en cuenta para crear el azote de los recolectores.

Daimyo Taisho

Respecto a los que habeis seguido la distribución de comportamiento mediante comandantes que ya hemos visto en otros artículos vereis que aqui vamos a tratar acerca del Comandante de Recursos. El que va a encargarse de distribuir las responsabilidades entre las unidades de recolección y de proveer al resto. Temas como la creación de unidades o la distribución de las mismas serán problemas a tener en cuenta.

Antes de nada hay que diferenciar entre el análisis desde el punto de vista de una inteligencia artificial que sigue las reglas establecidas y una que no. La primera se refiere a aquella que tiene la misma información que el usuario de modo que juega ‘limpio’ teniendo en cuenta que la IA no tiene la capacidad de un cerebro humano por lo que ya jugar limpio implica que los oponentes tienen capacidades muy diferentes, es decir, juegarían en diferentes categorias. Aqui lo que queremos es dar una visión del enfoque científico donde las pirulas no se deben tener en cuenta. Sin embargo, para estar a la orden del dia en lo referente al ámbito comercial, le vamos a dar un repaso al tema del trampeo en lo que se refiere al tema de minado de recursos.

>> Introducción a la extracción de recursos.

Como en la vida real, de la correcta disponibilidad de los materiales dependerá la velocidad de desarrollo del juego y el desempeño de nuestra estrategia. Extraer recursos es una tarea que implica un nivel de organización amplio y que requiere de una serie de estructuras que soporten la posibilidad de que la lógica del sistema vaya creciendo sin que el acoplamiento y las dependencias entre los diferentes elementos crezcan de una forma inapropiada.

Para llevar a cabo las tareas, se tienen en cuenta varias necesidades. Por un lado la necesidad de calcular con exactitud el número y la proporción de recursos necesarios para llevar a cabo la estrategia. Por otro, la necesidad de determinar los elementos necesarios para llevar a cabo la extracción con un ratio tiempo/unidades válido. Y finalmente la distribución y comando de las unidades asignadas a recursos o energías no renovables.

>> Número óptimo de unidades

Para calcular el número óptimo de unidades necesitamos tener una medida de lo que estas deben llevar a cabo. En términos generales se pretende que a partir de una medida de los requisitos de cada uno de los elementos que controlan la lógica del sistema (comandantes de construcción, de exploración, de guerra o cualquier otro que definamos), generemos una solución que permite obtener los recursos necesarios en un tiempo determinado.

El administrador de recursos será la pieza clave en todo el desarrollo y cumplirá con las tres tareas principales que hemos visto: calcular recursos, crear unidades de recolección y distribuirlas. La forma en la que trabaja este elemento lógico es
adquiriendo peticiones, ejecutando acciones para llevar a cabo la adquisición y traspasando estos recursos obtenidos.

Vale la pena comentar que el administrador o comandante de recursos está apoyado por el comandante de exploración que se ha definido anteriormente y que marca un mapa interno con las posiciones de los recursos a minar. Pequeños ajustes en este comandante harán que este administrador disponga de más o menos opciones a la hora de distribuir las unidades.

>> La proporción exacta de cada elementos. La petición del material.

En nuestro sistema, será posible disponer los diferentes elementos en muchas configuraciones y estructuras diferentes. Para este tipo de sistemas, la distribución jerárquica es muy apropiada por lo que distribuiremos el comportamiento bajo este paradigma. Como se ha visto anteriormente en el artículo de “Comandantes y Subcomandantes para el control de comportamiento”, para cada comandante hay un superior que monitoriza las acciones y determina la estrategia de la partida, este es el Comandante General o General a secas.

De el General cuelgan de forma jerárquica los diferentes comandantes. Para simplificar vamos a considerar 3 de ellos. El subcomandante de exploración, el de extracción de recursos y el de batalla. Ya podemos identificar que los 3 tienen necesidad de recursos.  El lugar idoneo para colocar un gestor de los mismos es en el General. De este modo cada subcomandante comunica a su superior los recursos que necesita para llevar a cabo su estrategia. El modelo jerárquico permitirá que varias capas de jerarquía vayan aglutinando los recursos necesarios conforme se sube en el escalafón hasta llegar al nivel superior que determina la estrategia general, el Shogun que comentabamos antes.

Cada clase subcomandante, por lo tanto,  tendrá una función que vincula al General y se resume en:
–> peticionDeRecursos(proporción tipo0, proporción tipo1 … proporción tipoN)
Por ejemplo; peticionDeRecursos(100, 200, 100);

// 100 unidades de oro, 200 de madera y 100 de piedra.

Una pequeña variación de comandante será esta:

La clase General tendrá una estructura que permite anotar estos requisitos y facilitarlos cuando sea necesario. Vemos como.

>> Como repartir los recursos entre los diferentes elementos lógicos.

Cuando tenemos registradas las peticiones de cada subcomandante podemos abordar el problema desde dos puntos de vista diferentes.

El primero de ellos es seguir una estrategia general y suministrar los recursos en base al estado de la partida (fase inicial, desarrollo, defensiva o ataque… o cualquier otra distribución). De este modo se asigna un porcentaje concreto de distribución de recursos que varía constantemente conforme varía el estado de la partida.

Repartiendo el pastel

El segundo punto de vista es el de las ‘Proporciones dinámicas’. En este caso, el cálculo se hace en base a la suma de todas las peticiones realizadas por los diferentes comandantes de modo que si la suma de de los recursos de un material se dobla, los esfuerzos a realizar por las diferentes unidades también se doblarán.

Una estrategia diferente es la de llevar una lista de las peticiones de cada subcomandante y servirlas de forma ordenada conforme se van adquiriendo los recursos. Esta opción es más costosa de modificar en caso de cambio de estrategia por lo que se utilizará en aquellos
casos que no representen una complejidad importante o en el que los estados de juego no varien de forma importante.

>> Parámetros para la creación de unidades de recolección óptimas.

Uno de los elementos clave es la creación de unidades y su distribución. Podemos hacer cálculos sencillos definiendo un porcentaje fijo de los recursos que extraemos y creando un número concreto de cada unidad de juego o podemos estimarlas en base a un cálculo más ‘inteligente’.

Para un cálculo más elaborado tendremos que tener en cuenta una serie de medidas que pueden estar o no disponibles y que ajustaremos acorde a nuestro sistema.

–> Total de las demandas de cada subcomandante. Ct
–> Recursos disponibles actuales cedidos por el General. Rd
–> Coste de las unidades de recolección, simplificamos con una. Ur
–> Velocidad de desplazamiento de las unidades. Vu
–> Tiempo de recolección de las unidades. Trec
–> Tiempo de construcción de cada recolector. Tc
–> Distancia Euclidea media a cada tipo de recurso (simplificamos a un solo tipo). De1
–> Tiempo estimado de consecución de los objetivos actuales. Te

El número de trabajadores será, escalado a cada proporción de recursos respecto el total Cd (suponemos solo un tipo):

Suponemos que el Te = (Tiempo de construcción TiC) + (Tiempo de minado total TiM). Este es el peor de los casos ya que podemos construir en paralelo mientras vamos minando, sin embargo es una buena aproximación.

Sea el tiempo de recolección que requiere un trabajador para minar todos los recursos (tiempo en llegar, recolectar y volver medio).
T1t = Ct/(Trec+Tdesp);

Tiempo de desplazamiento medio:
Tdesp = De1 / Vu; (x = vt <– ¿suena esta?)

Se calcula el TiM (Tiempo que tenemos disponible para minar) como:
TiM = Te – TiC; //En un primer paso no conocemos el tiempo de construcción ya que no sabemos cuantos construiremos por lo que marcamos un determinado porcentaje del tiempo esperado de recolección que inicialmente representa un estimador de la velocidad que queremos darle a la extracción y por lo tanto al juego. de este modo:

TiM = factor*Te; //Iniciamos con un factor alto y vamos disminuyendo, por ejemplo 0.8. Quiere decir que tenemos la espectativa de dedicar el 20% del tiempo a construir en un primer plano.

Y marcamos el número de trabajadores inicial como Nt:

Nt =  TiM / T1t;

Desde este punto monitorizaremos la entrada de recursos y ampliaremos o disminuiremos en función de la carga de los recursos y la disponibilidad de los mismos. Seguiremos una política prudente para no disponer de un número excesivo de efectivos.

Una vez conocemos el Nt podemos calcular el tiempo de recolección esperado como:

TeCalculado = Tc*Nu + TiM;

Si este supera en un determinado porcentaje a nuestras espectativas de Te ajustamos el parámetro y volvemos a calcular. El proceso es único para cada paso de la partida y será rápido. De cualquier modo no deja de ser un estimador y debe de ser calculado constantemente para ajustarse a las variaciones del juego.

>> Control de los trabajadores y cálculo del recurso idoneo

El parámetro principal es la distancia a la base desde el recurso. Cuando la mínima distancia al recurso es superior a un determinado parámetro, se debe crear nueva base de recolección más cercana. Esta responsabilidad será del comandante constructor.

Nosotros mandaremos a nuestras unidades al recurso más cercano y al tipo concreto y tantas como el recurso sea capaz de asimilar sin que las unidades interfieran entre ellas. El algoritmo de selección del recurso idóneo para cada unidad será:

para cada unidad
min = +infinito;
para cada base
para cada recurso libre
distanciaParcial = calculoDistanciaEuclidea (baseActual, recurso);
si distanciaParcial < min
marcaRecursoActual();
finsi
fin
fin

recursoMarcado.numeroDeMineros++;
Si recursoMarcado.numeroDeMineros > máximoDeMinerosPorRecurso
recursoMarcadoExtraidoDelCálculo;
finsi

MonitorPathFinding(unidad, recurso, base);
fin

En términos generales el algoritmo busca el recurso más cercano y lo asigna. Si hay muchas unidades asignadas lo saca del cálculo. Este está simplificado pero para el cálculo algo más complejo tendremos en cuenta la posición de la unidad actual para reasignarla primero a los más cercanos a su posición. Por otro lado podemos tener en cuenta el tipo de recurso filtrando en el caso de que haya más de uno.

Cuando la unidad notifica el fin de recursos a su comandante se reasigna. Si recibe ataque o cualquier otro evento también notifica y se le reasigna.

>> Recursos renovables VS No renovables. El comercio de comodín.

El tipo de recursos en muchos de los juegos RTS puede caracterizarse en tres tipos por norma general: renovables, no renovables y auto-generables.

En el último caso no es necesario preocuparse por la distribución ni la estrategia a largo plazo, sin embargo, los otros dos representan un problema, la disponibilidad. Este aspecto lo tendremos en cuenta en la definición de la estrategia general en el ‘General’ haciendo una estimación en base al mapa en el que nos encontremos y a la densidad de recursos. Esto produce una solución dependiente del problema.

Otra solución que no permitirá aprovechar la distribución de los recursos desde el inicio será la de una estrategia adaptativa. Mediante esta orientación, vamos solventando de forma progresiva las peticiones de los subcomandantes conforme vamos adquiriendo material. El ‘comandante General’ puede tener acceso a la lógica de sus subcomandantes de
forma conceptual asignando determinados porcentajes de recursos de modo que ell subcomandante ‘conozca’ la situación del minado de los recursos de forma indirecta. De este modo, el subcomandante puede decidir ajustarse al tipo de unidad que más se adapta a la producción en curso y a su cuota asignada. Los elementos que intervendrían en resumen:
producción de cada tipo, porcentaje de la producción asignada a cada subcomandante y en sistemas avanzados, estimadores en base a las previsiones de generación de recursos.

El comercio toma una baza significativa en muchos sistemas actuales, siendo el único modo de adquirir determinadas materia primas o recursos y en muchas ocasiones la más efectiva. En nuestro subcomandante de recolección podemos definir una cuota asociada al desarrollo a largo plazo del elemento de comercio. Si bien puede permanecer inactiva en las fases iniciales
del juego, conforme se desarrolla puede tomar mayor importancia. Las adquisiciones se harán en base a valores absolutos que recibe el jefe, es decir, el General.

>> Defensa de los recursos.

Los recursos son casi tan importantes como las bases por lo que nuestra estrategia a largo plazo implicará defenderlos y afianzar las posiciones de las minas u otros recursos. En este caso interviene el ‘Posicionamiento de las unidades de defensa’ y es una tarea que debe llevar a cabo el Subcomandante de Defensa. La ventaja de haber distribuido la lógica por funcionalidad y tipo de tareas es que en lugar de tener que preocuparnos de buscar recursos o de defenderlos, tenemos que ir a la materia, recogerlos.

Los scouts o exploradores estarán gestionados por el subcomandante de exploración que en la fase correspondiente se encargará de posicionarlos de forma correcta para prevenir ataques sobre las minas. Cuando se detecta una intrusión o un ataque inminente, el Subcomandante de Exploración se encarga de avisar al General con su posición y el General de comunicar a los diferentes Subcomandantes que actuan en un radio de seguridad determinado de una alerta. Si el sistema de control o subcomandante de Recursos recibe una orden de peligro del General, deberá aplicar las maniobras necesarias. En este caso podemos mover las unidades a un punto seguro (la base o los puntos de seguridad concretos) o podemos plantear una mabiobra evasiva. De cualquier modo esperaremos la señal de fin de alerta del General para volver al trabajo.

>>Trampeando para mejorar la competitividad

Una vez hemos visto como lo hacemos bien y de forma organizada, nos bajamos al mundo real en el que tenemos que disponer de un sistema competitivo y que plantee retos a los niveles más avanzados de usuarios. En este caso, podemos trabajar la IA y ajustarla de forma que mediante muchos estados de juego y muchas optimizaciones quizá lleguemos a obtener un buen desempeño, o bien podemos tomarnos la licencia de hacerle un pequeño feo al jugador, claro está este no debe percibirlo, por eso es una trampa.

Cheating_in_Exam

Lo que se hace en general es inyectar soluciones que influyan directamente en la economía del sistema sin que los enemigos lo perciban. ¿Donde metemos mano? Pues muy facil, en todo lo que se menea y en lo que no. Costes de unidades y edificios, capacidad de extracción de recursos de las unidades, tecnologías adicionales y en definitiva todo aquello que no pueda ser percibido directamente.

Un conocido ejemplo entre los insiders es el del Starcraft, donde en la modalidad Insane, la máquina se ‘atribuye’ 2000 de mineral y de gas, haciendo que la partida sea dura (Por supuesto esto no se extrae a través de un comunicado oficial :P ):
> http://www.shamusyoung.com/twentysidedtale/?p=1597

>> En resumen

Hemos visto en detalle los elementos que se deben tener en cuenta a la hora de extraer recursos
con un punto de vista estratégico, desde la cantidad hasta el control de las unidades. Hemos comprobado como en ocasiones, es necesario añadir ‘ventajas’ competitivas sobre los jugadores y hemos distribuido la lógica del sistema de recolección y su comunicación con el resto de elementos del juego. Se ha visto que en función del estado en el que nos encontremos, aplicaremos una estrategia diferente y que en lo referente a la defensa y a la exploración, daremos por hecho que cada elemento cumple con su objetivo. En caso de detectar
cualquier problema, sabremos donde ir a solucionarlo.

Otra pieza más del RTS. A disfrutarla!

Artesania del control de exploradores en juegos de estrategia.

No comments »

Una de las tareas principales que un jugador o un sistema de estrategia en tiempo real debe llevar a cabo es la de conocer su entorno para poder plantear un desarrollo adecuado.

En este artículo vamos a ver en detalle algunos de los conceptos que tienen que ver con el descubrimiento y la observación del terreno incluyendo las tácticas de exploración más comunes. Dado que trataremos la mayor parte de las técnicas necesarias, empezamos a nivel conceptual por aquellas que tienen lugar primero: las de scouting.

Explorador Nathan Drake

En primer lugar tendremos que decidir si queremos que nuestro sistema de inteligencia artificial sea piratilla y trabaje basado en trampas o si por el contrario queremos desarrollar un sistema realista. De antemano ya os digo que muchos de los juegos que se comercializan actualmente hacen trampas y saben exactamente a donde dirigirse, tanto en materia de recursos como en posiciones de enemigos. Muchos hacen la trampa de la sorpresa, hasta que no los atacas parece que desconocen tu posición, sin embargo podeis hacer la prueba y ver en cuantos juegos de RTS (real time strategy) podeis permanecer ‘ocultos’ despues de un ataque por sorpresa. Generalmente recibireis un generoso contraataque si la máquina está en condiciones.

De cualquier lugar aqui apostamos por crear sistemas realistas, entendiendo por realistas los que disponen de la información que les proporcionan sus unidades y no de otros parámetros externos al juego. Las dos opciones son válidas puesto que como es lógico, en ocasiones la rigurosidad de los sistemas viene determinada de forma inversamente proporcional al grado de presión que ejerza el game designer. Nosotros nos centraremos ahora en la solución en la que vale la pena discutir el tema, sin trucos.

> Scouting basics.

Sin entrar en detalle de los algoritmos que vayamos a emplear a nivel interno (pathfinding, comandantes, autómatas … etc), trataremos el tema desde un punto de vista mayormente teórico. La única preocupación que debemos tener es la de generar puntos del mapa bajo determinadas trayectorias.

Scout Age of Empires

El primer elemento a identificar es la unidad de scout. De entre todas las unidades disponibles en el ejercito, lo más probable es que una de ellas sea la más adecuada por su ligereza, su bajo coste, su resistencia moderada y rango de visión. Esta o estas serán las unidades de exploración.

> Objetivos

Lo que buscamos con el explorador no es solo descubrir el terreno sino mantenerlo libre de enemigos y disponer de información precisa de lo que pasa. Se identifican algunos de las metas a alcanzar.

>> Encontrar recursos
>> Identificar unidades enemigas en el territorio propio y en el enemigo
>> Encontrar la posición de la base del enemigo
>> Marcar puntos de interés (pasos elevados, cuellos de botella, etc.)
>> Táctica del oponente. Preveer movimientos y ataques en camino.
>> Llevar a cabo ataques estratégicos.

Algunos de estos objetivos son únicos en el tiempo puesto que el mapa no variará respecto al tiempo. Otros requerirán de un monitorizado constante y de ajustes continuos.

De cualquier modo no se presenta como una solución absoluta sino como un primer enfoque más profundo de lo que es necesario en materia de exploración y sobre el que añadir nuevas tácticas y varias objetivos.

> Fase I. La puesta en marcha

Nos ponemos en la piel de un jugador de RTS y vamos a poner de ejemplo una partida de Age of Empires. En ella nuestro explorador es un jinete a caballo rápido y con puntos de defensa y ataque limitados.

Nuestros objetivos principales son, identificar fuentes cercanas de abastecimiento y descubrimiento radial del entorno. Fijaremos con punto inicial de referencia el de la base propia y generaremos trayectorias radiales de diámetro creciente hasta un cierto punto que fijaremos en función del mapa.

Age of Empires fog of war

Una vez identificadas las fuentes de suministros mínimas fijadas desde el planificador o el comandante de exploración segun el control de comportamiento que llevemos, pasaremos a seguir con las tácticas de medio juego.

> Fase II. El desarrollo de la partida.

Una vez hemos identificado las fuentes de recursos y descubierto el entorno más próximo. El siguiente nivel es ampliar el rango de exploración para detectar el resto de elementos relevantes: recursos, enemigos y puntos de interés.

Seguiremos una estrategia radial del mismo modo. Iremos marcando posiciones al explorador siguiendo un radio creciente y marcaremos cada fuente de recursos encontrada y la posición de los enemigos así como la de su base en caso de encontrarla.

Foto base enemiga

Los puntos de interés son zonas elevadas y pasos estrechos. Estos los conoceremos por nuestro grafo de claridad que se ha visto en detalle anteriormente. Como resumen, llevamos un estado de los espacios de cada posición del mapa al obstáculo más cercano, lo que nos permite saber si determinadas unidades pasarán o guiar los algoritmos de pathfinding. Nos interesa por tanto los puntos en los que pasan pocas y los marcaremos como cuellos de botella. En estrategia de combate que veremos más adelante veremos como nos pueden ser de ayuda.

En lo referente a las bases enemigas, una vez localizadas intentaremos dirigir la búsqueda o exploración hacia áreas alejadas con la finalidad de reducir la probabilidad de que el scout reciba un ataque.

Una vez localizado el enemigo y algunos grupos de recursos adicionales, la exploración toma otro matiz.

>Fase III. La fase de convergencia

Esta fase se alcanza una vez conocemos suficiente sobre el entorno estático (para simplificar recursos, enemigo y puntos de interés) Una vez disponemos de esa información los exploradores pasan a tener otro cometido, el de estudiar el avance del enemigo y el de garantizar la integridad del territoriio. Eventualmente pueden colaborar en la estrategia de combate pero eso lo veremos más adelante. No tengas prisa pequeño saltamontes, todo lo bueno llega.

–> El Patrullado es una de las tareas principales de los exploradores en esta fase de desarrollo del juego. No podemos simplemente asignar y distribuir los exploradores por el territorio sin más y substituirlos cada vez que son eliminados ya que esto representaria un comportamiento predecible y el usuario podría detectar un comportamiento repetitivo y por lo tant aburrido en muy poco tiempo.

La estrategia en este caso varía. A priori se deben tener en cuenta dos temas básicos dentro del patrullado. El primero de ellos es  el posicionamiento de los exploradores. En este caso la distribución óptima vuelve a ser radial, sin embargo el ángulo de colocación de los exploradores no tiene porqué ser el de máxima difusión, de otro modo, el usuario puede detectarlo y acabar regularmente con todos ellos. Es más apropiado generalmente distribuirlos de forma semialeatoria en un rango que varie de la máxima difusión en pequeños porcentajes. Por ejemplo, si desde la estrategia general se asignan recursos como para disponer de 6 exploradores, la máxima difusión suponiendo que estamos emplazados en el centro inferior y tomando como ángulo 0 la linea inferior que delimita la pantalla, colocariamos de forma de máxima difusión los 6 exploradores para abarcar un sector de 180 grados por lo que estarán en los ángulos 0, 30, 60, 90, 120, 150 y 180 respectivamente con un radio de patrullado determinado (pongamos 20 grados). Una posible colocación y comportamiento sería inicialmente definir un radio de patrullado aleatorio y una colocación +- un 20%, de este modo la distribución es menos predecible. La distancia del radio a la base será definida de forma dinámica calculando la distancia al edificio más lejano como medida de simplificación y añadiendo un determinado factor. Soluciones más complejas darán lugar a una mejor distribución y adaptación al terreo, utilizando mapas de influencia por ejemplo describiremos con mayor precisión el area en la que debemos situar los exploradores. De cualquier modo se trata de tener en cuenta estos conceptos cuando abordemos un trabajo del estilo.

–>Otro de los temas a tener en cuenta es el de la evasión. Una vez localizado al enemigo debemos iniciar la táctica de evasión y comunicar al comandante el avistamiento. Si utilizamos cualquier otra forma de control de comportamiento deberemos igualmente incluir una función
que comunique el evento. POdemos o bien iniciar la evasión simple, vuelta a la base y espera de un tiempo concreto o bien iniciar el seguimiento desde la distancia del enemigo localizando el enemigo más cercano y manteniendo una distancia prudencial. Esta última estrategia generalmente dará como lugar la eliminación del explorador pero aportará más información sobre las intenciones del enemigo. En cualquuier caso el explorador
debe estar monitorizado.

–>La inclusión de tácticas de comando en el area enemiga. Estas maniobras irán destinadas a descubrir los avances y las posiciones del enemigo por lo que iniciaremos tareas de acercamiento progresivo al area del enemigo alternando maniobras de exploración con maniobras de evasión. Esta será una táctica arriesgada que dará lugar en muchas ocasiones a la eliminación del scout. En este aspecto se asumen los costes en favor de un bien mayor
ya que con la información obtenida podemos informar a los comandantes de combate, constructor y científico acerca de los progresos y que ellos actuen en consecuencia. Cualquier otro enfoque dará lugar a corregir de algun modo las construcciones, la creación de unidades y el desarrollo científico para el correcto uso de la información que hemos obtenido con el scout.

–>La maniobra Tora Tora Tora! Es la que pretende acercarse al corazón del enemigo en una maniobra kamikace que da lugar a la eliminación prácticamente segura del scout pero aporta mucha información acerca del grado de desarrollo del enemigo. Muchos de los jugones aqui presentes habrán hecho sacrificios similares para ver como va el tema en casa del malo. El caso es que aqui no podemos guardar antes de liarla y volver a cargar una vez sabemos donde estan las defensas y los edificios más importantes.

Hay más elementos tácticos que son importantes en lo referente a esta fase del juego pero para empezar y tener un buen conocimiento de los elementos que
se tienen en cuenta en el juego ya está muy pero que muy bien. Desarrollar a nivel técnico lo que aqui se escribe a nivel conceptual representa un buen
reto para cualquier desarrollador de sistemas de IA por lo que tenemos trabajo que hacer.

> Conceptos matemáticos involucrados.

Hemos hablado aqui bastante de generar trayectorias radiales sobre las que ir explorando o  colocando a los exploradores pero que demonios es una trayectoria radial y cómo la calculo? De eso nos vamos a encargar ahora. Porque aqui y no arriba cuando las necesitabamos? POrque una vez sabemos para que las vamos a utilizar nos podemos poner manos a la obra mucho más agusto.

En primer lugar, una trayectoria radial se refiere al hecho de que un determinado elemento sigue un camino definido en base a un punto que representa el centro de un circulo y un radio concreto de distancia a ese círculo. Pongamos que si quisieramos mover una unidad de forma radial por una rueda de bicicleta, dariamos puntos muestreados que coincidirian en la cubierta. Más sencillo, dibuja un círculo y las unidades se moverán por un sector determinado de ese círculo.

El centro de la trayectoria es generalmente un punto de una malla, no bajamos a nivel de pixel para no complicar nuestros algoritmos
de pathfinding (si esto lo llevas verde dale un vistazo a los artículos de pathfinding, tenemos para todos los públicos). Por lo tanto
tendremos un punto X y otro Y que definen la posición en X y en Y respectivamente. Los llamaremos Xc e Yc a partir de ahora.

Otro elemento será el radio R que definirá la distancia a la que deberán moverse o posicionarse las unidades. Por supuesto que cuando le pasemos las posiciones finales al algoritmo de pathfinding, el mismo buscará las trayectorias más adecuadas. Si queremos un movimiento
claramente radial deberemos obtener muchas muestras y pasarselas a nuestro pathfinder. De cualquier modo no te preocupes de esto porque lo definiremos como Nm (número de muestras).

Otro de los elementos a tener en cuenta son los grados de posicionamiento (Gp). Con este elemento posicionamos en la circunferencia el elemento. Una unidad situada a 10 pasos de radio y a 90 grados se posicionará enfrente. A 0 grados se moverá en linea recta hasta la derecha y a 180 se moverá a la izquierda.

Teniendo todos los elementos ahora, como calculamos la posición X e Y definitiva. Mucho más sencillo de lo que puede parecer a priori, utilizando senos para la componente vertical y cosenos para la horizontal. Dado que nuestra posición en el mapa será arbitraria, simplificaremos suponiendo que al empezar es lógico explorar toda la circumferencia de la base, sin embargo, algoritmos sencillos pueden estimar y determinar que rango de grados deben ser explorados en casos como por ejemplo si aparecemos en una esquina del mapa. Vamos por partes.

Trayectoria radial

En la imagen vemos desde un pun to C los puntos abarcables con un determinado radio.

–> Primero calculamos la posición X e Y donde debe ir la unidad para un grado concreto y un radio determinado. El valor en X será el coseno del ángulo por el radio y el de Y el seno del mismo ángulo por el radio.

Senos cosenos trayectoria radial

Seno coseno
–> Segundo calculamos la correspondencia a nuestra malla de los valores obtenidos. Sabiendo el tamaño en X y en Y de nuestra malla (no siempre igual), el cálculo del elemento al que tenemos que ir se obtendrá dividiendo el valor obtenido por el propio tamaño correspondiente. De este modo si habiamos obtenido en el primer paso
X = 2.2 e Y = 4.6 y tenemos tamaños de malla igual a 1 en X e Y, la posición pasará a ser (x,y) = 2, 4. Y ya se la podemos pasar al algoritmo de pathfinding que para ser eficiente trabajará con la malla.

–> Tercero. Vistas las posiciones absolutas planteamos un muestreo desde un grado inicial de la circumferencia a un grado final de la misma.

Teniendo el parámetro número de muestras (Nm) calcularemos los incrementos de grado que le vamos a pasar a nuestra función de cálculo de posiciones construida a partir de los pasos 1 y 2 asi:

incGrados = (GradoFinal – GradoInicial) / Nm;

Una vez tenemos el incremento de grados para cada paso del algoritmo iteramos.

iteracion = 1;
Desde 1 Para cada Nm
(x, y) =CalcularPosición(GradoInicial + (incGrados*iteracion);
pathfinding(x, y);
iteración ++;
Final

Es decir, calculamos, movemos y repetimos el proceso.

> El enfoque hacia objetivos

Se ha tratado un enfoque basado en fases de juego en los que pasar de una fase a otra dependía de la consecución de diferentes metas como encontrar al enemigo o descubrir una parte del terreno. El enfoque hacia objetivos varía respecto a la propuesta anterior por el hecho de que las unidades scout se generan y se comportan exclusivamente para cumplir determinados objetivos.

La diferencia respecto a la anterior propuesta es sutil pero a nivel interno el cambio es más importante. Vemos un ejemplo que lo dejará más claro. Nuestro procedimiento será ahora crear tantos exploradores como sean posibles, encontrar N fuentes de recursos. Una vez encontrados revelar un porcentaje concreto del mapa. Una vez hecho esto buscar al enemigo. Cuando esté localizado determinar 3 puntos de interés, sino pasa un tiempo determinado damos por supuesto que no hay más y seguimos con el revelado del mapa. Hecho esto protegemos y patrullamos la base. La diferencia radica en el enfoque, mientras que en el modelo anterior se va trabajando segun la fase, aqui se motiva este cambio de forma progresiva y secuencial en función del objetivo. En el modelo anterior se cambiará de fase cuando se completen unos determinados puntos, en este último seremos nosotros los que busquemos la consecución inmediata de estos aunque esto no sea la estrategia más adecuada a largo y corto plazo.

> Respuesta a inconvenientes.

–> Es atacado. El scout es detectado y está siendo atacado. En este caso se puede dirigir
a la base o considerar el movimiento alejandonos de ella. En una primera valoración puede parecer lógico llevarlo al abrigo de nuestras unidades, sin embargo puede que no nos sea beneficioso guiar al enemigo a nuestra posición.

Run for your life

Conceptos más laboriosos son los que involucran bases de apoyo secundarias que pueden proteger de forma eventual problemas de este tipo.

–> Encuentra un grupo de aldeanos

En este caso existe la posibilidad de iniciar maniobras de hostigamiento. Mientras el enemigo no ponga vigilancia, será posible golpear y huir a los aldeanos provocando molestias y pérdidas al jugador. Generalmente será contrarrestado con un destacamento de protección. Hecho que también puede ser aprovechado para atacar la base en extremos opuestos, a sabiendas de que hay unidades alejadas que antes defendian y ahora no.

> Pincelada de estrategia de combate usando exploradores.

Como veremos en artículos de estrategia de combate. Una de las tácticas más efectivas es la de la distracción. Desde que los humanos peleábamos con garrote las tácticas de distracción han sido extremadamente útiles. En este caso se trata de mandar al scout a una zona de minado de recursos del enemigo lo más alejada posible y de forma casi simultanea enviar tropas de ataque por el lateral contrario de la base enemiga. Las inteligencias artificiales en su práctica totalidad enviarán unidades y desplazarán algunas de las producidas. Puede ser efectiva o no, en cualquier caso si los aldeanos no se protegen serán menguados y su ritmo de producción caerá, lo que ya es positivo. Si defienden correctamente la protección en la zona se verá disminuida por lo que podremos aprovechar el ataque con más garantías.

Esto es estrategia de combate y de la complejidad y riqueza de las mismas haremos disfrutar y sufrir al jugador dándole un buen nivel al juego.

> En resumen

Hemos visto los elementos más importantes a tener en cuenta en materia de exploración para tener una inteligencia
artificial competitiva. Se han tenido en cuenta los conceptos matemáticos para generar una trayectoria radial respecto
a un punto concreto y definir el grado de precisión a pasarle al pathfinder. Finalmente se han tratado algunos modelos
más sencillos y se ha adelantado un pequeño concepto de combate. Ahora toca ponerlos en práctica.

Algunos de los juegos actuales incluyen unidades espia. La función de éstos es básicamente la del explorador con funcionalidad
añadida como el sabotaje o la contaminación de edificios. Muchas de los conceptos aqui detallados son aplicables a la
unidad espia.

Suerte y ánimo con ello.

Sun Tzu 2.0 El Arte de la guerra en los juegos de Estrategia

No comments »

Como creadores de inteligencia artificial orientada a los juegos de estrategia, debereis ser conocedores de las más antiguas técnicas estratégicas. Para ello vamos a echar mano de uno de los mejores generales y estrategas del pasado, Sun Tzu. El aspirante a Samurai Informático deberá conocer las enseñanzas del maestro a través de su célebre libro ‘El arte de la Guerra’.

El Maestro Sun Tzu dijo: “Un ejército victorioso gana primero y entabla la batalla después; un ejército derrotado lucha primero e intenta obtener la victoria después.”. Aqui veremos como crearlo.

PocketSunTzu

En la mayoría de juegos de estrategia estaremos condicionados a conseguir determinados objetivos que se verán por regla general amenazados por uno o varios enemigos de diferente índole. En este artículo vamos a ver en detalle que conceptos intervienen en el enfoque estratégico y táctico de una partida genérica de un juego de estrategia en tiempo real. Muchos de estos conceptos son extrapolables a otro tipo de juegos como los basados en turnos o los que
están orientados al crecimiento del jugador sin oponentes. Sin embargo, serán muy útiles especialmente en los RTS.
Nuestro objetivo como creadores de inteligencia artificial es claro, crear una máquina mortífera capaz de destruir al jugador oponente, ya sea humano u otra máquina. Por otro lado tenemos que garantizar la posibilidad de dominar a la bestia, haciendo que sea todo lo efectiva que queramos, es decir, permitir que diferentes niveles de jugador puedan enfrentarse.

Detallaremos los conceptos que son necesarios para modelar nuestro propio Gengis Kan, tu Napoleon o tu Jerjes, cada uno con sus gustos. Una vez hayamos terminado aqui sereis especialistas estrategas en lo que al mundo virtual se refiere.

> Empezamos.

Un buen sistema de estrategia se focalizará en todos los elementos que toman parte en el desarrollo del juego. Tendremos en cuenta de este modo, tanto recursos como unidades, tecnología o terreno.

En primer lugar hay que marcar el camino que queremos seguir en materia algoritmica. Poemos elegir principalmentedos opciones cada una de ellas apropiada para cada caso. La primera de ellas es usar estrategias preconcebidas.
Esta modalidad implica que tenemos que dotar de un conocimiento previo a nuestro sistema para que responda de forma correcta y se oriente a llevar a cabo una serie de soluciones. Un ejemplo de este modelo será el desarrollo clásico de una partida de estrategia: recoletar, fortificarse, contruir ejército y atacar/defenderse. A un nivel más detallado podemos incluir reglas concretas como favorecer la ocupación de lugares altos o crear una determinada proporción de unidades de diferentes tipos. Estas etrategias vendrán por lo tanto muy ajustadas al entorno en el que estamos creando la inteligencia artificial y serán difícilmente rehusables en otros.

La segunda de nuestras opciones será más compleja e implicará técnicas de Ninja Informático como algoritmos de modelado del jugador mediante machine Learning. Estas soluciones suelen requerir algunas partidas para ajustar los parámetros principales y se adaptan al nivel del jugador. Sin embargo, son más complejas de diseñar y adaptar por lo que en la mayoría de las ocasiones se opta por definir un comportamiento concreto como el fijado en el primer punto
y se crea un autómata de estados finito jerárquico para controlarlo. De cualquier modo, una vez dominados los algoritmos de aprendizaje, pueden utilizarse con mayor sencillez para tipos de juego similares.

Anibal-Alpes

Una vez escogido el modo en el que vamos a llevar a cabo nuestro desarrollo, deberemos profundizar en el uso de estratagemas más propias de táctica y estrategia general que de cuestiones tecnológicas. Vamos a ver ahora en qué áreas y qué tiposd de estrategias vamos a llevar a cabo en cada una.

> Areas a tener en cuenta

Cada área de las que tendremos en cuenta a continuación suele presentarse casi de forma obligatoria en los juegos de estrategia en tiempo real. Añadir complejidad en el comportamiento de nuestra sistema en las mismas hará que el usuario tenga una mejor
experiencia de juego y se le presente una inteligencia artificial no encorsetada en la misma reacción. Esto es lo que realmente añade riqueza a la inteligencia artificial ya que conforme las estratgemas y mecanismos aumentan, más dificil es para el jugador preveer el comportamiento. No se trata de hacer que el sistema sea invencible sino de que sorprenda al usuario. Una regla de
oro en el desarrollo de sistemas de inteligencia artificial para juegos es que la IA nunca debe ser más ‘lista’ que el jugador pero si tanto o más pícara por caracterizarla con una palabra políticamente correcta. Se me ocurren otras palabras para describir el comportamiento que debe tener la IA con más exactitud pero no las diré aqui. Queda a la imaginación de cada uno. Piensa mal y acertarás :p

Vamos a ir viendo en detalle las áreas que siguen a continuación. De la correcta creación y desempeño de cada una de estas áreas dependerá la calidad de nuestro ‘Warlord’ Artificial.

>Inteligencia artificial para la recolección
>Inteligencia artificial para la construcción.
>Inteligencia artificial para la tecnología.
>Inteligencia artificial para la exploración.
>Inteligencia artificial para el ataque.
>Inteligencia artificial para la defensa.

Cada una de ellas es una pieza clave en el correcto desarrollo del juego, Mejorarlas y añadiendo complejidad respetando la regla de oro anterior es hacer que nuestro sistema sea cada vez más rico e interesante. Las veremos en detalle una a una.

Ahora, el general que gana una batalla hace muchos cálculos en su cuartel, considera muchos factores antes de que ésta se libre. El general que pierde una batalla hace pocos cálculos en su cuartel, considera pocos factores antes de que ésta se libre. Muchos cálculos llevan a la victoria, pocos cálculos llevan a la derrota.

> Dificultad exacta

Un factor importante que se ha comentado anteriormente es el de limitar las capacidades de nuestro sistema de IA. Es necesario que de un modo u otro, el usuario pueda desarrollar los objetivos sin desesperarse en exceso. Si bien es bueno que nuestro sistema plantee un reto considerable, no es preferible que el usuario acabe lanzando la consola o el pc por la ventana.

Para definir y acotar el nivel de dificultad tenemos infinidad de mecanismos, sin embargo, unos de los más empleados son los que se comentan a continuación. En primer lugar, al no disponer de un nivel de proceso concreto como el aplicado en algoritmos de teoría de juegos como el minimax, no es sencillo definir de forma numérica el desempeño del algoritmo. Lo que haremos en este caso es relajar los objetivos. Con relajar se entiende ralentizar la obtención de elementos (recursos, tecnologías, unidades), disminuir el grado de desempeño de las unidades y bajar el nivel de coherencia de las acciones (gastos en tecnologías que no ofrecen sinergias, producción de determinados tipos de unidades en exceso o insuficientes…etc). Esto será muy sencillo si definimos los objetivos de forma que en cada estado del juego pueda medirse el grado de consecución de los mismos.

Este es solo un enfoque del estudio del ajuste de la dificultad a los diferentes niveles de juego previstos. Otro enfoque se basa en dificultar el desempeño en las diferentes áreas que hemos visto anteriormente haciendolas más ineficientes. En esta variante intentaremos definir nuestros algoritmos internos (pathfinding, distribución, scouting…etc) de forma que podamos parametrizar lo máximo posible su grado de eficiencia. De este modo creariamos algoritmos flexibles en desempeño, en el caso de los algoritmos de pathfinding la eficiencia máxima corresponde al mínimo camino entre la fuente y el destino. En el caso de un algoritmo de scouting la eficiencia máxima puede darse cuando se busca magnificar el área descubierta con la máxima velocidad.

Visto el ajuste de dificultad por relajación de los objetivos y el ajuste por areas, vamos a ver un concepto diferente, el modelado del jugador.

> Modelar al jugador

Una vez que planteamos el ajuste de la dificultad de forma interna en el juego, podemos hacer dos cosas. O bien permitir que el usuario ajuste la dificultad y a partir de niveles concretos (fácil, medio, dificil…) traduciendo internamente a las diferentes áreas u objetivos.
O bien podemos modelar nosotros mismos a partir del desempeño del jugador y hacer un autoajuste. Existe mucha documentación referente al modelado del jugador, por lo que este tema puede verse con mucho detalle.

Un ejemplo de modelado sería el siguiente. En primer lugar estableceremos una correspondencia entre los elementos que intervienen en el juego
y la dificultad que esto plantea al usuario a nivel medio. Una vez disponemos de esta información el monitorizado será una constante durante el
desarrollo de la partia. Cada cierto tiempo austaremos nuestros valores internos mediante los mecanismos de ajuste de dificultad vistos anteriormente y
en función de los parámetros observados en el usuario. Esto, sin embargo plantea un problema desde el punto de vista en el que necesitamos valores
del usuario a los que teóricamente no tenemos acceso como jugadores y por esto desde el punto de vista de la inteligencia artifical estamos haciendo
trampas. Esto es más que usual en el desarrollo de juegos comerciales, sin embargo, aqui estamos buscando soluciones que impliquen una inteligencia
artificial ‘real’.

una solución al problema anterior es echar mano de algoritmos de aprendizaje. En este caso, los algoritmos irán tomando decisiones y observando la
recompensa o la pérdida que estas decisiones le reportan ajustando los diferentes parámetros. Para ello, será necesario interactuar con el usuario
inicialmente sin conocer sus capacidades y las primeras partidas pueden ser un tanto desastrosas. Solo los Grandes Maestros Ninjas Informáticos se
atreven a ofrecer soluciones comerciales de este tipo. Uno de los pocos ejemplos es el Black And White de LionHead Studios que apostó por algoritmos de este
tipo y salió más que bien parado.

Black and White IA

Para los más interesados podeis profundizar en temas de redes neuronales, algoritmos de computación evolutiva y machine learning en general. De cualquier
modo el tema es tan extenso como interesante por lo que no perdais ni un minuto. Yo diría que entre todos los conceptos de computación, los que están
en estas áreas son los que me han resultado más interesantes.

> Trampas de los creadores de inteligencia artificial

Para terminar el tema de la estrategia es necesario y más que recomendable echar un vistazo a los pequeños trucos de Ninja Informático que utilizan los creadores de inteligencia artificial orientada a los juegos de estrategia. Puede parecer que esto es un insulto a la integridad de vuestro sistema de IA y a vuestras capacidades, sin embargo, cuando los tiempos de entrega aprietan y se hace necesario disponer de un sistema competitivo, os acordareis de esta sección.

Ninja Informatico

La primera de las trampas es jugar con los recursos. La cantidad de recursos y el tipo de los mismos que tu minas por unidad de tiempo con una unidad determinada no siempre tiene que ser igual a la que tiene vuestro oponente artificial. Esto se llama generalmente ‘dopar’ a las unidades.

Otra de las trampas más utilizadas es el monitorizado de la creación de unidades de los oponentes. El sistema observa los tipos de Unidades que se están creando y construye las más apropiadas para combatir el ejército enemigo. La velocidad de construcción y de minado cuando es posible tambien se modifica, haciendo que el desarrollo sea más rápido. El resto de unidades estar tambien dopadas.

Otro truco es modificar los costes de las unidades y del resto de elementos del juego. Con lo que tu obtienes X, el sistema de inteligencia artificial puede obtener 2X, ¿fácil no?.

Uno de los más recurridos es el de la omnipresencia (Disabled fog of war), mediante el que el oponente máquina puede ‘ver’ unidades, edificios y demás elementos en cada momento. Con esto puede percibir y prepararse para ataques o incluso fortificarse para evitar asaltos.

Independientemente de la estrategia de desarrollo tecnológico que se haya establecido, algunos sistemas de inteligencia artificial actualizan la tecnología para que esté acorde con la del jugador, teniendo mayor ventaja y estando mejor preparado frente a los ataques del mismo.

Parecido al anterior sería el conocimiento de los detalles del jugador. Se sabe en todo momento los recursos, las unidades, los edificios y las tecnologías de modo que se trabaja en consecuencia para neutralizar los avances y se inyectan los recursos (y en ocasiones unidades) necesarios.

Si conoces a los demás y te conoces a ti mismo, ni en cien batallas correrás peligro; si no conoces a los demás, pero te conoces a ti mismo, perderás una batalla y ganarás otra; si no conoces a los demás ni te conoces a ti mismo, correrás peligro en cada batalla.

Como veis, los chicos encargados de las inteligencias de cada juego se han aplicado el cuento de 3000 años de antiguedad.

> En Resumen

Hemos visto la profundidad con la que podemos llegar a tratar un tema que aparentemente centra su complejidad en el apartado técnico y que resulta ser más conceptual que otra cosa. Se han visto las diferentes áreas que intervienen en el desarrollo sentando las bases de un estudio más profundo sobre cada área.

Se a establecido la importancia de modelar al usuario y permitir diferentes grados de dificultad. La regla más importante será en este aspecto que la IA nunca puede ser más ‘lista’ que el usuario. Aplicar técnicas de modelado del usuario puede ser muy útil aunque plantea una complejidad importante.

Finalmente hemos comprobado que cuando los tiempos de desarrollo aprietan, independientemente de lo riguroso y comprometido que sea uno con el entorno de la inteligencia artificial en el ámbito científico, las cosas tienen que salir bien y rápido. Por
esto muchos sistemas de entretenimiento recurren al uso de ciertas trampas hacia el usuario, lo que implica que no se puede considerar una inteligencia artificial ‘real’ u honesta. En un conflicto similar con parámetros realistas no tendriamos acceso a estos mecanismos.

Comparte tu conocimiento táctico tanto en este artículo general como en cada una de las áreas que vamos a tocar.

Que lo disfrutes!