informe tesis starcraft

55
Tesis de Licenciatura Agente Inteligente para el videojuego Starcraft Alumnos: Cristian Conde. LU: 65568 Mariano Moreno. LU: 66925 Director: Dr. Diego César Martínez Febrero 2011 1

Upload: mariano1983

Post on 14-Nov-2015

254 views

Category:

Documents


3 download

DESCRIPTION

Informe de la tesis realizada sobre el desarrollo de una gente inteligente que juegue una partida de Starcraft

TRANSCRIPT

  • Tesis de LicenciaturaAgente Inteligente para el videojuego Starcraft

    Alumnos: Cristian Conde. LU: 65568 Mariano Moreno. LU: 66925

    Director: Dr. Diego Csar Martnez

    Febrero 2011

    1

  • 1 Resumen 4

    2 Introduccin 4

    3 Bancos de pruebas de estrategia en tiempo real 4

    4 Nuestro Bot de Starcraft 5

    4.1 CLASE STRATEGY MANAGER 6 4.2 UNIT MANAGER 6

    5 Trabajo Futuro 16

    6 Anexo: Clases Comentadas 19

    6.1 CLASE STRATEGY MANAGER 19 6.1.1 Mtodos Pblicos 196.1.2 Atributos Privados 20

    6.2 CLASE UNIT MANAGER 20 6.2.1 Mtodos Pblicos 206.2.2 Mtodos y atributos privados 22

    6.3 CLASE COMPAA 27 6.3.1 Mtodos Pblicos 276.3.2 Mtodos y Atributos Privados 30

    6.4 CLASE GRUPOBUNKERS 32 6.4.1 Mtodos pblicos 326.4.2 Mtodos y atributos privados 35

    6.5 CLASE GRUPO ANTIAREO 38 6.5.1 Mtodos pblicos 386.5.2 Mtodos y atributos privados 39

    6.6 CLASE GRAFO 40 6.6.1 Mtodos pblicos 406.6.2 Mtodos y atributos privados 41

    6.7 CLASE NODO 41 6.7.1 Mtodos pblicos 416.7.2 Mtodos y atributos privados 42

    6.8 CLASE SCOUT 43 6.8.1 Mtodos pblicos 436.8.2 Mtodos y atributos privados 43

    6.9 CLASE ANALIZADOR DEL TERRENO 44 6.9.1 Mtodos pblicos 446.9.2 Mtodos y atributos privados 46

    6.10 CLASE COMPAA DEFENSIVA 47 6.10.1 Mtodos pblicos 476.10.2 Mtodos y atributos privados 48

    6.11 CLASE COMPAA DE TRANSPORTE 49 6.11.1 Mtodos pblicos 496.11.2 Mtodos y atributos privados 51

    6.12 CLASE GRFICOS 53 6.12.1 Mtodos pblicos 536.12.2 Mtodos y atributos privados 54

    7 Diagrama de clases 55

    8 Referencias 56

    2

  • 1 Resumen

    Nuestra tesis se centra en el desarrollo de un mdulo de IA que tenga la capacidad de jugar una partida de Starcraft de manera inteligente. El primer objetivo era lograr que nuestro modulo de IA sea capaz de vencer a la inteligencia provista por defecto en el juego. El objetivo principal fue generar una base para desarrollos futuros en la plataforma, con el fin de obtener un mejor comportamiento del bot, e investigar la aplicacin de tcnicas avanzadas de IA en el mismo.

    2 Introduccin

    Los juegos son un tema interesante en Inteligencia Artificial casi desde el principio de la IA como una disciplina de las ciencias de la computacin. Ms an, problemas complejos relacionados con los juegos fueron resueltos por tcnicas de Inteligencia Artificial mucho antes de la popularizacin de los videojuegos como un producto de entretenimiento [4]. Actualmente, un gnero de juegos que muy un rea muy interesante de IA es la simulacin, y en particular los juegos de estrategia en tiempo real (RTS). Estos juegos son ms complejos que los juegos tradicionales, con la ocurrencia de mltiples eventos simultneamente dentro de un entorno dinmico. Bsicamente, los juegos RTS son situaciones militares simplificadas donde el jugador debe derrotar al adversario comandando tropas virtuales dentro de un campo de batalla en tiempo real. La produccin y mejora de tropas son sostenidas por un simple modelo econmico autocontenido, usualmente basado en la recoleccin de recursos en el terreno, que pueden ser intercambiados por unidades militares. En este genero de juegos, se espera que la reaccin del jugador sea rpida, y por ende hay un tiempo limitado de razonamiento [2].Hay diferentes reas de investigacin en Inteligencia Artificial que son muy relevantes en este escenario, como el comportamiento reactivo, planeamiento, colaboracin y modelado de trabajo en equipo, razonamiento temporal y espacial, adquisicin de conocimiento y aprendizaje, solo por mencionar algunos [3]. Nosotros estamos interesados en tcnicas de inteligencia artificial aplicables a los juegos de estrategia en tiempo real. Nuestra lnea de investigacin esta centrada principalmente en el estudio de formalismos para representar el conocimiento y razonar para alcanzar pensamiento estratgico y planeamiento en dominios dinmicos. Por ende, estamos particularmente interesados en juegos RTS como un campo desafiantes del estudio de IA.

    3 Bancos de pruebas de estrategia en tiempo real

    Como es sealado en [2], la mayora de los juegos RTS comerciales carecen de interfaces de IA y, entonces, estos sistemas no pueden ser utilizados para realizar estudios de IA en tiempo real y testear resultados generales. Afortunadamente, existen algunas excepciones. En 2002, la Universidad de Alberta lanz un proyecto de programacin llamado Open Real Time Strategy, o simplemente ORTS [1]. Es un entorno de programacin para el estudio de problemas de IA en tiempo real tales como el encontrar caminos, lidiar con informacin imperfecta, programar y planear en el

    3

  • dominio de juegos RTS. ORTS es un motor de juego completo (licenciado bajo GNU Public License), con una arquitectura cliente-servidor donde el servidor simula el mundo y provee informacin a sus clientes. No hay un comportamiento de bajo nivel predefinido, entonces el cliente es responsable por cada decisin en el juego, incluyendo el encontrar caminos entre dos puntos. En 2006, se realiz la primer competencia ORTS previa a la Articial Intelligence and Interactive Digital Entertainment AIIDE 2006, con subsecuentes ediciones en 2007, 2008 y 2009.En 2010, Expressive Intelligence Studio en la Universidad de California (Santa Cruz), organiz una competencia de IA en tiempo real usando el juego comercial Starcraft. La competicin fue organizada en el marco de AIIDE 2010. Los Bots para Starcraft son desarrollados usando la Broodwar API, la cual provee un enlace con el juego. Una interface C++ habilita a los desarrolladores consultar el estado actual del mundo y dar rdenes a las unidades. La competicin consisti de cuatro torneos diferentes con diferentes desafos de IA:

    Tournament 1: Se centra en micromanagment en terrenos planos. Tournament 2: Similar al primero, solo que agrega mapas con terrenos ms

    complicados. Tournament 3: Es una variacin donde los bots se desenvuelven en un entorno

    simplificado de Starcraft con tecnologa limitada. Tournament 4: El juego completo, evala a los bots en una simulacin de un

    torneo profesional.

    La categora ms desafiante es, por supuesto, Tournament 4. El bot debe decidir que hacer en casi todos los aspectos del juego: ubicacin de los edificios, balance de tropas de acuerdo a sus caractersticas, investigacin de tecnologas, formaciones grupales y estrategia general. Como es esperado, estas decisiones se supone que sean suficientemente inteligentes para obtener la victoria sobre el rival.Nuestro bot fue construido para jugar Tournament 4. Es un agente con inteligencia modesta, centrado en inteligencia de bajo nivel, sentando las bases para futuro desarrollo como es descripto en las subsecuentes secciones.

    4 Nuestro Bot de Starcraft

    El bot se desarroll usando la BroodWar Application Programming Interface (BWAPI)1, un framework escrito en C++ open source para crear los mdulos de inteligencia artificial para Starcraft Broodwar. Nuestro bot particular para AIIDE 2010 se llama Manolobot2. BWAPI es usada para percibir el ambiente y para dar rdenes individuales a las unidades. A los mdulos de inteligencia artificial solo le revela la informacin que les es visible normalmente a jugadores humanos, esto es una buena propuesta para evitar las trampas. Manolobot est conformado por dos clases principales, Unit Manager y Strategy Manager. Estas clases son capaces de reaccionar a eventos especficos en el juego, por ejemplo:

    onStart: se dispara cuando inicia el juego. onUnitShow: disparada cuando una unidad se vuelve visible. onUnitCreate: se dispara cuando una nueva unidad, amiga o enemiga, es creada.

    1 http://code.google.com/p/bwapi2 http://code.google.com/p/manolobot

    4

  • onNukeDetect: es disparada cuando se detecta un lanzamiento nuclear. onFrame: se dispara en frame lgico del juego. Se dispara alrededor de 28 veces

    por segundo en una partida de velocidad normal.

    Estos eventos (probablemente) requieran un proceso de toma de decisiones acerca del juego en curso. Por lo tanto, las funciones son invocadas en respuesta a esos eventos.

    4.1 Clase Strategy Manager

    El Strategy Manager (SM) decide cules son las prximas metas a cumplir dada una situacin en el juego. Las metas son divididas en diferentes estados de acuerdo a la forma de planeamiento.

    1. Estado de Recoleccin: la creacin de suficientes trabajadores para obtener una tasa de acarreo aceptable.

    2. Estado de Defensa: habilita la construccin de unidades militares bsicas, como barracas y bunkers.

    3. Estado de Ampliacin Tecnolgica: habilita la construccin de unidades avanzadas y se comienza con las tareas de investigacin (tanques en modo asedio, ampliacin de armas, etc.).

    4. Estado de Refuerzo de Tropas: se definen las compaas de ataque y se las refuerza con diversas unidades.

    5. Estado Final: se habilita la construccin de los restantes edificios avanzados (Puertos Estelares y Laboratorios de Ciencias). Se considera la construccin de una segunda base para la recoleccin de recursos ya que cuando se alcanza este estado es muy probable que est escaseando el mineral y/o gas.

    La secuencia de estados es la siguiente: [Recoleccin] [Defensa] [Ampliacin Tecnolgica] [Refuerzo] [Final]

    Donde la transicin entre estados es determinada por ciertos parmetros de juego. Aunque las metas establecidas en algunos estados pueden continuar activas en estados subsecuentes. Por ejemplo, en cada estado la recoleccin de recursos contina mientras estos estn disponibles.

    4.2 Unit Manager

    Unit Manager (UM) captura la inteligencia de bajo nivel. Decide el orden en el que las metas son alcanzadas, la seleccin y ubicacin de edificios como es explicado ms abajo.

    Explorando el mundo. Una unidad especial es asignada a tareas de exploracin. El Unit Manager da rdenes al scout, quien recorre el mapa buscando enemigos y recursos. El scout es una unidad sustituible, se espera que la maten en algn momento. En primer momento se selecciona un SCV para estas tareas, cuando es posible crear Vultures, son stas las unidades asignadas a la exploracin por ser ms veloces y resistentes.

    5

  • Planificando el Barrio. La ubicacin de los edificios es un problema clsico de bajo nivel en los juegos RTS. Requiere de un anlisis de terreno para identificar obstculos, tales como montaas, minas y otros edificios. El tipo de un nuevo edificio deber ser considerado tambin, ya que influye en la distribucin general. Algunos edificios producirn unidades y necesitarn suficiente espacio disponible para proporcionar un camino de salida a las mismas. Otras edificaciones solo son requeridas para el crecimiento de la poblacin, los Depsitos de Suministros son un caso de este tipo de unidades. Los Bunkers y Torretas de Misiles son ms tiles si se las ubica en posiciones donde es ms probable que el enemigo ataque.

    Manolobot construye los Depsitos de Suministros en los bordes del mapa, dejando espacio libre en el centro de la regin.

    Para el resto de los edificios, Manolobot busca espacio disponible siguiendo un algoritmo de bsqueda en espiral a partir del Centro de Comando.

    Los Bunkers son ubicados en la entrada de la regin, formando un bloque defensivo.

    Las Torretas de Misiles son un caso especial, ya que se las ubica dentro del conglomerado de unidades que defiende la entrada de la base y adems las partes de la base que son vulnerables a los ataques areos 3

    El anlisis de terreno es realizado usando la librera BroodWar Terrain Analizer (BWTA)4.

    3 De la experiencia de juego contra el bot proporcionado por defecto en el juego Starcraft, se comprob que era necesario defender no solamente la o las entradas por tierra que tenga la base, sino tambin ciertos puntos vulnerables a ataques por parte de unidades areas enemigas, por lo que se agrego un nuevo grupo a Manolobot, el Grupo Antiareo.4 http://code.google.com/p/bwta

    6

  • Figura 1: Ejemplo de la informacin mostrada por el analizador del terreno

    Soporte Logstico. El Unit Manager organiza la recoleccin de recursos, minerales y gas. Prioriza el mineral por sobre el gas, dado que el primero es ms requerido que el segundo. Los SCV recolectores son balanceados de acuerdo a esta priorizacin. Tambin, cuando un edificio o unidad de combate mecnica es daada, el UM selecciona un SCV para realizar las tareas de reparacin.

    Formaciones grupales. Las formaciones son unos de los aspectos ms importantes de la IA en los juegos RTS. El Unit Manager agrupa las tropas, estos grupos son llamados compaas y grupo de Bunkers. Hay tres tipos de compaas Ataque, Defensa y Aerotransportada.

    Grupo de Bunkers. La lnea de defensa est formada por tres bunkers, dos torretas de misiles y tres tanques de asedio. Cada Bunker se encuentra poblado por cuatro Marines. La localizacin es seleccionada de acuerdo a cierta informacin provista por la librera BWTA. La librera identifica chokepoints, que son puntos de comunicacin entre regiones contiguas en el mapa. Por lo tanto es necesaria la defensa de esa zona ya que es una potencialmente atacable por el enemigo (es una entrada a la base). El Unit Manager calcula la orientacin correcta de la lnea de Bunkers y torretas. En la figura 1, se ilustra un grupo de bunkers completo defendiendo un puente, como es esperado. Algunos de los problemas de diseo que se encontraron en el diseo del grupo de bunkers fueron:

    o ubicar el grupo de manera que tenga alcance suficiente para atacar a cualquier unidad que desee entrar a la base. No sera til posicionar el

    7

  • grupo sobre un borde de la entrada a la base y que las unidades enemigas puedan pasar sin ser atacadas

    o orientar el grupo hacia la posicin desde donde se espera que ataque el enemigo

    o ubicar el grupo de manera que permita el paso de unidades aliadas por el chokepoint

    o evitar la superposicin del grupo en una zona donde se debera construir un nuevo centro de comando

    o posicionar cada componente del grupo de manera de maximizar el nmero de unidades capaces de atacar al enemigo en cada momento y minimizar el dao recibido (por ejemplo: los tanques en modo asedio son capaces de atacar por sobre los bunkers, pero son mas vulnerables y costosos que los mismos, por lo que se consider mejor ubicar los tanques detrs de una lnea de bunkers)

    Figura 2: Grupo de bunkers ubicado para defender la base

    Grupo Antiareo: Este grupo de unidades esta formado solamente por Missile Turrets. Cuando es creado se calculan las posiciones de la base que debern defenderse de ataques de unidades areas enemigas. Hay 4 ubicaciones posibles, al norte, al sur, al este y al oeste del centro de la regin de la base. Una de estas zonas estar defendida por el grupo de bunkers, por lo que no se ubicarn Missile Turrets. Para las posiciones restantes se tienen en cuenta algunos factores para verificar si se debern ubicar defensas en las mismas. Un factor importante es si la regin a defender esta sobre un borde del mapa, por lo que

    8

  • obviamente no ser necesario ubicar defensas en ese borde de la regin. Cada posicin defensiva, estar compuesta por un grupo de 3 Missile Turrets. Estas construcciones defensivas son muy efectivas, cuando trabajan en conjunto con el ataque lockdown del Ghost (ver Compaa Defensiva).

    Figura 3: Grupo antiareo ubicado para defender la parte inferior de la base (hay un mensaje indicando que la salida de la Factory est bloqueada y se proceder a reubicar dicha edificacin)

    Compaa de Ataque. Esta formada inicialmente por marines y medics, pero a medida que el juego avanza tanques, naves de ciencia y goliaths son agregados. Cada compaa tiene dos posiciones importantes:

    o La posicin actual: es el centro de la regin que la compaa se encuentra defendiendo.

    o El punto de reunin: es el centro de la regin inmediatamente anterior a la regin de la posicin actual. Es utilizado para enviar refuerzos, cada vez que una nueva unidad es asignada a la compaa, se le ordena dirigirse a esta posicin, una vez que se junta cierta cantidad de unidades, estas son asignadas a la compaa y se dirigen a formarse. Con esto se busca evitar que las unidades sean enviadas individualmente a la posicin actual y sean eliminadas por el enemigo por ser una formacin ms dbil.

    Las Compaas son comandadas por uno de sus miembros, ste ser el centro de la formacin y el resto de las unidades se irn ubicando a su alrededor [5]. El comandante elige el objetivo a atacar y lidera los movimientos, es usado como una unidad pivot para la formacin. La seleccin del comandante se hace de la siguiente manera:

    9

  • o Si hay un tanque en las cercanas perteneciente a la compaa, es seleccionado como comandante. Las unidades se ubicaran en crculos concntricos en torno a l, las ms cercanas al comandante sern el resto de los tanques, luego los goliaths, medics y marines.

    o Si no hay tanques cerca, un marine es seleccionado como comandante. La formacin es similar a la anterior, solo que ahora en las posiciones centrales estarn los marines, luego los medics y goliaths. Adems del orden de las unidades, lo que tambin vara es la distancia entre unidades.

    o Cuando no hay tanques ni marines, se emprende una retirada a la regin inmediatamente anterior. Esto ocasiona que las unidades all ubicadas, sean asignadas a la compaa y que se actualicen la posicin actual y el punto de reunin. Esta retirada contina hasta que se asigna un nuevo comandante o hasta que el punto de reunin es la regin inicial.

    En la figura 2 se ve un caso de la compaa de ataque en un estado inicial, donde el comandante es un marine. Algunos grficos son visibles para fines de pruebas, los marines son marcados con rectngulos rojos, el comandante es sealado con un crculo blanco. Las tropas que estn detrs son medics que estn esperando para curar a los marines heridos.El comandante selecciona el objetivo a atacar buscando dentro de su rango priorizando las unidades enemigas que puedan infringir algn dao y luego contina por los edificios. Cuando no tiene unidades a la vista, la compaa estar en estado de espera hasta que un criterio de completitud de sea satisfecho para ir a atacar a la unidad enemiga ms cercana que el scout haya detectado. Esto lo har recorriendo el camino ms corto encontrado por el Analizador de Terreno. El criterio de completitud de la compaa est basado en una cantidad arbitraria de unidades de cada tipo.

    10

  • Figura 4: Compaa de ataque en accin

    Compaa Defensiva. Este grupo de unidades est ubicado dentro de la base, es de esencial importancia para la defensa de los ataques nucleares propinados por la unidad humana enemiga Ghost, que generalmente al momento de realizar este ataque se encuentra invisible. Para esto es esencial que el UM administre y utilice una tecnologa provista por un upgrade del Centro de Comando, el Comsat, que descubre las unidades invisibles. Tambin la Compaa Defensiva ejecuta una tarea de prevencin de ataques nucleares, porque en ciertas ocasiones el Ghost enemigo es transportado en un Dropship y es desembarcado en la base. Si los marines de la compaa estn ubicados en una posicin cercana a la del desembarco, pueden destruir el dropship antes de que aterrice.La unidad Ghost al momento de realizar el disparo del misil nuclear es visible por unos pocos segundos, lo cual no daba tiempo suficiente para que los marines de la compaa defensiva eliminaran al atacante (si el Ghost que gua el ataque nuclear es destruido antes del impacto del misil se evita el dao a la base). Para lograr repeler con xito los ataques nucleares, se ide una estrategia que requera:

    o investigar el upgrade Stim Packs para los marines, ya que con esta mejora disparan y se desplazan con mayor velocidad

    o investigar el upgrade Comsat para ejecutar un escaneo de la zona donde se orden el disparo del misil nuclear

    o tener un mximo de 5 marines asignados a la compaa defensiva que estarn nicamente destinados a atacar a los Ghost enemigos o a cualquier unidad enemiga que ingrese a su rango de alcance

    11

  • Cuando se detecta el lanzamiento de un misil nuclear, se activa la compaa defensiva y se ejecutan los siguientes pasos:

    1. se detecta el Ghost enemigo mediante un escaneo del Comsat2. se asigna esa unidad como objetivo para la compaa defensiva3. se ordena a la compaa defensiva atacar a la unidad enemiga4. se aplica el Stim Pack a los marines mientras se dirigen a atacar

    Si en el paso 1 no se logra encontrar el Ghost enemigo, se ordena a la compaa defensiva ejecutar un movimiento de ataque a la posicin donde se gener el ataque nuclear. El movimiento de ataque consiste en atacar a cualquier unidad enemiga que se encuentre en las cercanas de la posicin pasada como parmetro, esto permite destruir al Ghost sin haberlo encontrado, solo que tiene una probabilidad mucho menor que de xito que si se hubiese encontrado a la unidad con el Comsat.

    La compaa defensiva dependiendo de la raza del enemigo puede estar compuesta por:

    marines, medics y ghosts, si el enemigo es Terran o Protoss marines y medics si el enemigo es Zerg

    Los medics de la compaa defensiva tienen como objetivo principal curar los daos sufridos por las unidades de la misma. Su objetivo secundario es curar cualquier unidad aliada que sea posible dentro de la base y, en caso de haber sido investigados los correspondientes upgrades, restaurar ciertos ataques enemigos como bengalas pticas, parsitos, etc.En el caso de los ghosts, su misin, nuevamente si fue investigado el upgrade, es realizar un lockdown a las unidades mecnicas enemigas que hayan entrado a la regin de la base o estn atacando a una unidad aliada dentro de la regin de la base. Este upgrade demostr ser muy efectivo para repeler ataques de unidades muy difciles de destruir como son los cruceros de batalla Terran. En juegos contra la raza Zerg, no se entrenan ghosts debido a que el ataque con lockdown solo puede realizarse contra unidades mecnicas, y los Zerg no cuentan con las mismas.

    Cada tipo de unidad de la compaa defensiva tiene un mtodo asociado para obtener el mejor objetivo posible para atacar. La funcionalidad esta totalmente encapsulada, por lo que puede reemplazarse el mtodo de bsqueda de objetivos actual por uno mejor (ya sea mas eficiente o que encuentre mejores objetivos).

    Algunos aspectos que se tuvieron en cuenta en el diseo de la Compaa Defensiva son:

    o encontrar una cantidad ptima de unidades de cada tipo para asignar a la compaa

    o buscar una forma de asignar objetivos a cada tipo de unidad. Por ejemplo los marines hacen mas dao a un tanque de asedio que a un crucero de batalla, considerar tambin factores como el estado de salud del enemigo, etc.

    12

  • o ubicar a las unidades de la compaa de modo que no ocupen posiciones que sean necesarias para construir edificaciones de la base y se ubiquen de forma de poder responder velozmente a ataques enemigos

    Figura 5: Unidades de la compaa defensiva (recuadradas en amarillo)

    Compaa de transporte. Esta compaa usa Dropships para transportar una compaa de ataque y desplegarla en la zona menos defendida de la base enemiga. Utiliza una mquina de estados finitos para determinar los estados en los que esta la compaa de transporte: esperando cargar, cargando tropas, volando, desplegando tropas, retornando a la base.Utiliza una formacin con 2 tipos de naves diferentes: Wraiths y Dropships. Los Wraiths encabezan la formacin, son naves de ataque, requieren menos recursos y tiempo para construirse que los Dropships. Los Dropships nicamente transportan tropas (ya sean marines, medics o unidades mecnicas).Para crear la compaa aerotransportada, se requiere que el Scout haya realizado una exploracin del mapa para ubicar la base enemiga. Al inicializar la Compaa Aerotransportada, se genera un camino que conecta la base de inicio con la base enemiga. El camino esta representado por un arreglo de posiciones en el mapa, de las cuales la ltima posicin es donde los Dropships debern desembarcar las tropas.El camino a seguir se calcula basndose en varios factores, como ser: ubicacin relativa de la base enemiga respecto a la base desde donde se iniciar el transporte, posicin de las defensas de la base enemiga con respecto al centro de

    13

  • su regin, etc. Teniendo en cuenta todos esos factores, se puede generar un camino seguro hacia la posicin mas alejada a las defensas de la base enemiga, lo que dar una mayor probabilidad de xito al ataque.Una vez creado el camino a seguir, se efectuar un control cada cierta cantidad de tiempo, para verificar si la compaa de ataque a transportar esta completada, si esto es verdadero, se carga las unidades en los Dropships de la compaa de transporte. Luego de que todas las unidades estn a bordo de los transportes, y se tienen suficientes naves de escolta (Wraiths) se empieza a transitar el camino hacia la base enemiga, las escoltas van a la cabeza de la formacin.Una vez que se alcanza el punto de desembarco, las naves de escolta se dirigen hacia el centro de la regin donde esta ubicada la base enemiga, con el propsito de distraer a las unidades enemigas, dejando a los Dropships desembarcar a la compaa de ataque sin recibir daos. Luego de que se completa el desembarco, todas las naves de la compaa de transporte que sobrevivan retornan a la base, para ser reparadas y ejecutar un nuevo transporte.Algunos aspectos que se tuvieron en cuenta en el diseo de la Compaa de Transporte son:

    o llevar un control del estado actual de la compaa, para ejecutar acciones asociadas al mismo

    o tener en cuenta la informacin provista por el Scout y por la librera BWTA para encontrar un camino hacia la base enemiga que trate de evitar las posiciones donde es factible encontrar unidades enemigas

    o controlar las naves para que ejecuten el transporte en formacin, para proteger las unidades mas vulnerables

    Debido a restricciones de tiempo y a ciertos comportamientos inesperados, Manolobot no utiliza esta compaa, a pesar de estar disponible.

    14

  • Figura 6: Compaa de transporte movindose hacia la base enemiga

    5 Trabajo Futuro

    Manolo fue desarrollado en poco ms de tres meses, por lo que es lgico que presente algunos comportamientos errticos y hasta defectuosos, como se menciona anteriormente, el trabajo realizado est pensado para sentar las bases para futuro desarrollo. Por ello es que para mejorar su comportamiento, el mayor esfuerzo debe centrarse en la macroestrategia, es decir, en realizar avances significativos en el desarrollo en el Strategy Manager. Algunas de las mejoras a realizar son las siguientes:

    Expansiones inteligentes. En instancias avanzadas de una partida, es posible que se necesite mayor cantidad de recursos o que los que se encuentren hayan encontrado en cercanos al Command Center inicial se hayan agotado. Por lo que es imperioso construir un segundo Command Center que posibilite que los SVC depositen los recursos recolectados en un edificio cercano. Esta solucin es el enfoque actual, pero sera de mayor utilidad contar con una mayor cantidad de centros de recoleccin de recursos, lo que posibilitara un crecimiento mayor, ya que al contar con ms recursos, se podran crear ms unidades simultneamente, lo mismo sucede con la investigacin de nuevas tecnologas.

    Percepcin precisa. Con el objetivo de mantener un seguimiento del estado actual de la partida, se mantiene un registro de la cantidad de unidades que se poseen y de las tecnologas investigadas. El problema de este acercamiento, es que solo toma en cuenta informacin propia, ignorando las acciones realizadas por el oponente. Para una mejor

    15

  • toma de decisiones de parte del Strategy Manager, la representacin del estado actual del mundo debera ser ms completa.

    Defensa ms eficiente. Mediante una optimizacin de los algoritmos utilizados se puede lograr una mayor eficiencia en la defensa de las regiones. Ms precisamente, el problema surge en regiones que tienen dos puntos de entrada, chokepoints, muy prximos entre s. En estos casos, el grupo de bunkers no logra encontrar una ubicacin ptima. Inicialmente el algoritmo trata de ubicarse en el centro del chokepoint, en ciertas ocasiones, esta ubicacin encontrada impide el paso de las unidades, dejndolas encerradas en la regin. Para solucionar esto, se hace uso de un offset que garantiza que siempre exista un camino liberado hacia la regin contigua, pero la solucin, si bien funciona en la mayora de los casos, en otros, encuentra una posicin que puede no ser vlida o que sea an peor que la original.Otro aspecto que puede admitir mejoras en el grupo de bunkers, es la forma en que se encuentra la posicin de los bunkers. Inicialmente se calcula el ngulo del chokepoint a defender y con ese dato se calcula el ngulo que tendr el grupo de bunkers con respecto a ste. Una vez obtenidos estos datos se invoca al mtodo que realiza la bsqueda de la posicin que comienza a buscar en la posicin del centro del chokepoint. Si el ngulo del grupo de bunkers es horizontal (90) intenta 5 posiciones sobre el eje X (pos - 2, pos - 1, pos, pos + 1, pos + 2, donde pos es la coordenada X del centro del chokepoint), para luego aumentar un buildTile en el eje Y, si el ngulo es vertical intenta 5 posiciones sobre el eje Y luego aumenta un buildTile sobre el eje X. La bsqueda tendr xito, si se logra encontrar una posicin que permita construir 3 bunkers alineados y 2 missile turrets detrs. Si se tuvo xito la posicin del bunker central se almacena en una variable privada en la instancia actual de la clase.Un problema que no se soluciono en forma efectiva en la compaa defensiva, es donde ubicar cada unidad de la compaa para defender en forma eficiente la base. Se consider posicionar las unidades en el centro de la regin, pero se descart esa opcin ya que las unidades obstruan la construccin de nuevas edificaciones o incluso podran llegar a quedar atrapadas en medio de las mismas. Es posible mejorar tambin el control de unidades eliminadas.

    Regreso al punto de encuentro: En el momento que un bunker es destruido se ordena a las unidades que estaban dentro del mismo moverse hacia un punto de reunin predeterminado hasta que se reconstruya el bunker. En algunos casos esto no funciona, ya que si las unidades se quedan atacando al enemigo no se mueven al punto de reunin y pueden obstaculizar la reconstruccin del bunker.

    Unificacin de Objetivos. En las clases grupo bunkers y grupo antiareo se debe lograr que todas las unidades ataquen a la misma unidad enemiga, y para seleccionar un objetivo utilizar algn criterio de acuerdo al dao o la efectividad contra la unidad atacante que tengan las unidades defensivas... Por ejemplo, las missile turrets realizan mayor dao a unidades de gran tamao que a las pequeas debido a que tienen un ataque de tipo explosivo.

    Ejecucin de transportes: Las mejoras principales que se pueden realizar a esta clase son:o mejorar la forma en que se cargan las unidades de la compaa de ataque, a veces

    quedan unidades sin cargar, y se utiliza un ciclo por lo que no es eficienteo mejorar la ruta a seguir para ejecutar el transporte

    16

  • o realizar un control para mantener una formacin durante el transporteo agregar un comportamiento para manejar eventuales ataques al grupo durante el

    transporte (se podra abortar el transporte regresando a la base o desembarcar en ese punto a la compaa de ataque)

    o mejorar el comportamiento de las naves de escolta

    Explorando el terreno: Se puede agregar algn otro modo de exploracin o mejorar los modos existentes, para acelerar la ubicacin del enemigo o tambin para explorar con mas frecuencia ciertas reas de inters en el mapa. Tambin podra designarse a la clase scout para el control del comsat de un command center adicional, ya que el primer comsat estar dedicado a la defensa de la base principal y ubicacin de unidades ocultas enemigas.

    Inteligencia militar. Las compaas se agrupan en torno al comandante, en ciertas ocasiones, si una unidad enemiga que se encuentra fuera del rango de visin del comandante ataca a un miembro de la compaa, sta unidad se separa del grupo en persecucin del agresor. Esto ocasiona que la unidad separada quede desprotegida y muy probablemente sea aniquilada al estar aislada, adems de debilitar la formacin militar.Esto se puede solucionar agregando algunos controles al mtodo que controla la formacin de la compaa.

    Estrategia-contraestrategia. Combinando la informacin obtenida por el Scout con tcnicas de minera de datos y de aprendizaje automatizado, se puede predecir el tipo de estrategia adoptada por el jugador oponente. Esto posibilitara a nuestro bot el poder planear una contraestregia que aumentar nuestras chances de ganar la partida. Para la prediccin se puede utilizar la informacin recopilada por el Expresive Inteligence Studio de numerosos torneos profesionales jugados por jugadores humanos. Precisamente fue este grupo de desarrollo quien adopt este enfoque y lo combin con la herramienta de cdigo libre Weka para la construccin de su agente de Starcraft, EISbot.

    17

  • 6 Anexo: Clases Comentadas

    6.1 Clase Strategy Manager

    6.1.1 Mtodos Pblicos

    strategy_manager(void);

    Constructor de la clase, inicializa todas las estructuras y coloca el estado en el estado inicial.

    ~strategy_manager(void);

    Destructor de clase.

    checkGoals(void)

    Actualiza el estado actual del Strategy Manager en base a la cantidad actual de unidades que posee actualmente y el avance de las investigaciones en el Arbor de tecnologas.

    int* getGoals(void);

    Retorna la cantidad de unidades meta a alcanzar.

    int* getResearchs(void);

    Retorna las investigaciones que deben realizarse en el estado actual del Strategy Manager.

    onUnitCreate(Unit *u); onUnitDestroy(Unit *u);

    Mtodos que son invocados en la ocurrencia de los eventos de creacin o destruccin de una unidad propia. Actualizan la informacin contenida dentro de la clase sobre la cantidad de unidades propias que posee.

    setResearchsDone(bool *rd);

    Actualiza la informacin que almacena la clase sobre las investigaciones completadas.

    int getEstadoActual();

    Retorna el estado actual en que se encuentra el Strategy Manager representado por un nmero entero.

    18

  • 6.1.2 Atributos Privados

    int GoalUnidades[34];

    Un arreglo de nmeros enteros que representa la cantidad de unidades de cada tipo que se deben crear para cumplir las metas del estado actual.

    int cantUnidades[34];

    Almacena la cantidad de unidades de cada tipo que actualmente se poseen.

    int GoalResearch[Utilidades::maxResearch];

    Un arreglo de nmeros enteros que representa las tecnologas que deben ser investigadas para cumplir las metas del estado actual. Para un dado ndice i, si GoalResearch[i] es 1, esa tecnologa debe ser investigada, si es 0 esa tecnologa no es parte de las metas actuales.

    bool ResearchDone[Utilidades::maxResearch];

    Un arreglo de valores booleanos, donde si para un dado ndice i, ResearchDone[i] es true, la tecnologa i ya fue investigada, si, en cambio, el valor es false, la tecnologa est pendiente de ser investigada.

    6.2 Clase Unit Manager

    6.2.1 Mtodos Pblicos

    unit_Manager(AnalizadorTerreno *analizador);

    Constructor, inicializa todas las estructuras.

    executeActions();

    Es el mtodo ms complejo de la clase. Se ejecuta en cada frame, es el corazn del Unit Manager (UM). Realiza las siguientes acciones:

    Si el analizador de terreno ha finalizado de su anlisis, designa una unidad como el scout y luego la enva a explorar el mapa. Adems encuentra la mejor localizacin para los grupos de Bunkers.

    Busca unidades ocultas cada cierta cantidad de frames. Distingue dos SCV, en caso de no estar ya designados, como las unidades

    que repararan los edificios y unidades mecnicas daadas. Luego,

    19

  • peridicamente, revisa todas las unidades, si alguna necesita reparacin, estas unidades son enviadas a realizar la tarea.

    Crea y ejecuta el mtodo onFrame de la compaa de ataque. Balancea la recoleccin de recursos, si la cantidad de minerales que se posee

    es mayor que la de gas, se envan todos los SCV que estaban recolectando gas salvo uno, a recolectar minerales. De otra manera, se asignan hasta 4 SVC a la tarea de recoleccin de gas en la refinera ms cercana no agotada y el resto sern enviados a recolectar minerales a la ubicacin ms prxima a un centro de comando.

    Se ejecuta el mtodo que habilita la creacin de todas las unidades requeridas para cumplir las metas del estado actual.

    resetBuildingSemaphore();

    Este mtodo se utiliza para resetear un semforo que no permite que se inicien dos construcciones al mismo tiempo, con esto se busca evitar la duplicacin de edificios del mismo tipo. Muchas veces, en la ejecucin suceda que la meta de un determinado estado era de slo un edificio de determinado tipo y dos SCV eran enviados a construir a diferentes locaciones la misma unidad. Con este semforo, se redujo la ocurrencia de dicho fenmeno.

    setGoals(int goals[34]); setResearchs(int researchs[Utilidades::maxResearch]);

    Actualiza las metas de cantidad de unidades y de investigaciones tecnolgicas actuales con las metas provistas por el Strategy Manager.

    asignarUnidadACompania(Unit* unit);

    Cuando una unidad militar es creada, este mtodo asigna la unidad a una de sus compaas.

    verificarBunkers();

    Controla si alguno de los bunkers que posee est siendo atacado.

    repararUnidad(Unit *u);

    Enva a las unidades designadas como reparadores a reparar la unidad u.

    onUnitCreate(Unit *u);

    Ante la ocurrencia del evento de creacin de una unidad, si la unidad u es de tipo militar, el UM decide si ser asignada a un grupo de bunkers o a alguna de las compaas.

    20

  • onUnitDestroy(Unit *u);

    Se actualiza la representacin interna de la cantidad de unidades que se poseen.

    onNukeDetect(Position p);

    Cuando un ataque nuclear es detectado, se utiliza la tecnologa provista por el upgrade del Command Center, ComSat para detectar al Ghost enemigo que realiz la accin. Puede que la unidad se encuentra visible, pero en la mayora de los casos dicho fantasma se encuentra invisible. Al encontrar la ubicacin del Ghost se instruye a la compaa defensiva para que lo ataque

    onUnitShow(Unit *u);

    Al volverse visible una unidad, si es un ghost, ocurre algo similar a la accin anterior. Se enva a la compaa defensiva a eliminarlo.

    bool* getResearchsDone();

    Retorna un arreglo de elementos booleanos que representa el rbol tecnolgico, si un elemento es verdadero, dicha tecnologa se encuentra investigada. Caso contrario est pendiente su investigacin.

    setEstadoActual(int estado);

    Actualiza el estado interno. Es una operacin deprecated, ya que esto se encuentra modelado en el SM

    ~unit_Manager(void);

    Destructor.

    6.2.2 Mtodos y atributos privados

    cantUnidades[34];

    Almacena la cantidad de unidades de cada tipo que actualmente se poseen.

    goalCantUnidades[34];

    Un arreglo de nmeros enteros que representa la cantidad de unidades de cada tipo que se deben crear para cumplir las metas del estado actual.

    goalResearch[Utilidades::maxResearch];

    21

  • Un arreglo de nmeros enteros que representa las tecnologas que deben ser investigadas para cumplir las metas del estado actual. Para un dado ndice i, si GoalResearch[i] es 1, esa tecnologa debe ser investigada, si es 0 esa tecnologa no es parte de las metas actuales.

    researchDone[Utilidades::maxResearch];

    Un arreglo de valores booleanos, donde si para un dado ndice i, ResearchDone[i] es true, la tecnologa i ya fue investigada, si, en cambio, el valor es false, la tecnologa est pendiente de ser investigada.

    Unit *reparador1, *reparador2;

    Punteros a unidades de tipo SCV distinguidas como reparadores.

    Scout* magallanes;

    Puntero a la unidad designada para la exploracin del mapa.

    Position *baseEnemiga; Region *regionBaseEnemiga; Region *regionBasePrincipalEnemiga;

    Punteros a distintas posiciones del mapa ocupadas por el enemigo, relevantes para poder tomar decisiones sobre la ubicacin y orientacin de las estructuras defensivas.

    bool primerConstruccionDescubierta;

    Variable auxiliar para encontrar la posicion del centro de comando enemigo

    bool analisisListo;

    Variable global que indica si el analizador de terreno ha completado su tarea.

    GrupoBunkers *grupoB1, *grupoB2; GrupoAntiaereo *anti;

    Punteros a los grupos de bunkers y antiareos necesarios para defender posiciones.

    TilePosition *centroComando; Unit *centroDeComando;

    Punteros a la posicin del centro de comando y a la unidad. Si bien a travs del centro de comando se puede obtener su ubicacin, se utiliza esta variable para mejorar la eficiencia.

    22

  • compania* Easy; CompaniaDefensiva* Fox; CompaniaTransporte *ct;

    Punteros a la compaa ofensiva, defensiva y de transporte respectivamente.

    Grafo *grf;

    Puntero a la estructura de grafo utilizada por el scout para recorrer de una manera ms eficiente el mapa.

    int latenciaScout;

    Una variable de tipo entero que simula un contador, ser utilizada para dar rdenes al scout cada cierta cantidad de frames.

    Player* enemigo;

    Puntero al jugador contrario.

    int SCVgatheringMinerals, SCVgatheringGas;

    Variables que llevan control de la cantidad de unidades recolectando gas y minerales, utilizadas para el balance econmico.

    std::list unidadesEnConstruccion;

    Lista de unidades que estn en construccin actualmente.

    int frameLatency; int buildingSemaphore;

    Estas dos estructuras simulan un semforo de construccin, que se bloquea cuando se inicia una construccin y se libera al finalizar la misma o cuando se alcanza cierta cantidad de frames representadas en frameLatency. Con esto se busca evitar un bug que ocasionaba que se construyeran unidades del mismo tipo al mismo tiempo, ocasionando una repeticin innecesaria de estructuras.

    AnalizadorTerreno* analizador;

    Puntero al analizador de terreno.

    int estadoActual;

    Estado actual generado por el Strategy Manager.

    23

  • buildUnit(TilePosition *pos, int id);

    Construye una unidad en una ubicacin y de un tipo pasados como parmetro.

    buildUnitAddOn(int id);

    Construye un add-on cuyo tipo se corresponde con el pasado como parmetro. Para esto localiza una unidad a la que sea posible realizarle el add-on con identificador id, si existe, y si se tienen recursos suficientes, construye la estructura.

    makeRefinery(TilePosition *pos);

    Construye una refineria en la posicion pos. Si la posicion es NULL construye en el geiser ms cercano.

    Unit* getWorker();

    Retorna un puntero al primer SCV que est ocioso o recolectando recursos.

    Unit* getUnit(int IDTipo);

    Retorna un puntero a una unidad del identificador de tipo pasado como parmetro.

    sendGatherCristal(Unit* worker);

    Enva a la unidad pasada como parmetro a recolectar minerales.

    sendGatherGas(Unit* worker);

    Enva a la unidad pasada como parmetro a la refinera ms cercana cuyos recursos no se hayan agotado an.

    void trainUnit(int ID);

    El mtodo trainUnit recibe como parmetro un identificador de tipo de unidad ID, y de acuerdo a esto, invoca al mtodo train correspondiente para la creacin de la unidad.

    void trainWorker(); void trainMarine(); void trainMedic(); void trainGhost(); void trainVulture(); void trainGoliath(); void trainTankSiege();

    24

  • Cada mtodo es invocado para crear una unidad especfica. Para eso, dependiendo de la unidad que se quiera construir, se localiza el edificio con la capacidad de creacin de la misma y que posea espacio en la cola de construccin. En caso de no poseer espacio, se contina la bsqueda de otro edificio del mismo tipo y se vuelve a intentar la creacin.

    TilePosition* getTilePositionAviable(UnitType* U);

    Obtiene una posicin (TilePosition) disponible para construir el tipo de unidad provisto por el parmetro U. Esto se realiza mediante un algoritmo de bsqueda en espiral con centro en la posicin tile del centro de comando. Luego de ejecutar este mtodo se debe ejecutar delete sobre el resultado para liberar la memoria utilizada por el mismo.

    TilePosition* getTilePositionForSupply(AnalizadorTerreno *analizador);

    Obtiene una ubicacin para la construccin de un nuevo depsito de suministros. Se podra utilizar el mtodo anterior para este caso tambin. En lugar de utilizar la bsqueda en espiral, este algoritmo trata de ubicar una posicin alejada de la entrada a la regin, tratando con esto de evitar el problema de la superpoblacin de edificios en estados avanzados del juego.

    bool isInsideRegion(AnalizadorTerreno *analizador, UnitType* U, TilePosition* P);

    Este mtodo, retorna verdadero si existe alguna unidad de tipo U, la regin a la que pertenece la posicin P. Luego de ejecutar este mtodo se debe realizar delete sobre el resultado para liberar la memoria utilizada por el mismo.

    TilePosition* getTilePositionAviable(UnitType* U, TilePosition* t);

    Metodo deprecated, reemplazado por getTilePositionAviable.

    bool isFreeOfBuildingsRightAndLeft(UnitType* U, TilePosition* t);

    Retorna verdadero si es posible construir un edificio de tipo U en la posicin t con 2 tile positions libres de edificaciones a izquierda y derecha.

    TilePosition* getPosicionDistinta(TilePosition actual);

    Metodo deprecated, reemplazado por getTilePositionAviable.

    construyendo(int ID);

    Retorna verdadero si una unidad con identificador de tipo ID se encuentra en construccin, falso en caso contrario.

    25

  • moverUnidades(TilePosition *t);

    Si hay unidades en el TilePosition t, se les ordena movilizarse a otra posicin del mapa.

    nuevaUnidadConstruccion(Unit *u);

    Este mtodo es invocado cuando el evento onUnitCreate es disparado, y agrega la unidad en construccin u a la lista unidadesEnConstruccion (deprecated).

    controlarFinalizacion();

    Retorna la primera unidad de la lista unidadesEnConstruccion que haya sido terminada de construir, NULL si no encuentra ninguna (deprecated).

    finalizarConstruccion(Unit *u);

    Enva un SCV a finalizar la construccion de la unidad u, ya que sta no fue finalizada y actualmente ninguna otra unidad se encuentra tratando de terminar esta tarea.

    ejecutarConstrucciones();

    Metodo que controla las diferentes construcciones a realizar en el juego.

    buscarUnidadesOcultas();

    Mtodo que se debe invocar cada cierta cantidad de frames, para ubicar las unidades enemigas que estan burrowed o cloacked y no se encuentren visibles.

    6.3 Clase Compaa

    6.3.1 Mtodos Pblicos

    compania(AnalizadorTerreno *at, Color ID);

    Constructor de clase, requiere un analizador de terreno para poder calcular rutas de ataque y un color para poder identificar las unidades en modo debug.

    ~compania(void);

    Destructor de clase.

    asignarUnidad(Unit *U);

    26

  • Este mtodo es invocado cuando el Unit Manager asigna una nueva unidad a la compaa, en principio es asignada al grupo de unidades que se renen en la posicin especial Punto de Reunin.

    aplicarStim(std::list lista);

    Aplica el stim_pack a las unidades pertenecientes a la compaia si no estan dentro de un contenedor (bunker, dropship).

    int countMarines(); int countMedics(); int countFirebats(); int countTanks(); int countGoliaths(); int countScienceVessels();

    Elimina de la lista correspondiente las unidades destruidas, y retorna la cantidad de unidades vivas. Devuelve como resultado un conteo de unidades vivas.

    atacar(Unit *u);

    Ordena a la compaa atacar a la unidad apuntada por u.

    onFrame();

    Este mtodo es invocado en cada frame, se realizan mltiples operaciones: Configura el comandante. Busca un objetivo dentro del rango de ataque del comandante. Controla la formacin. Releva las unidades heridas o afectadas por algn ataque especial enemigo, y los

    mdicos se encargan de realizar las curaciones correspondientes. En caso de estar bajo ataque, la nave de ciencia aplica una matriz defensiva

    sobre el comandante, si el mismo es un tanque. Se realiza el conteo de unidades.

    moverCompania(Position pos);

    Mueve la compaa a cierta la posicin pos.

    bool pertenece(Unit *u);

    Retorna true si la unidad pasada como parametro pertenece a la compaa, false en caso contrario.

    bool listaParaAtacar();

    27

  • Retorna true si en la compaia hay cierta cantidad de minima de unidades de cada tipo. Actualmente el nmero es arbitrario y est compuesto por:

    Goliath: 2 Siege Tanks: 3 Science Vessels: 1 Medics: 4 Marines: 10

    int cantidadTransportes();

    Retorna la cantidad de transportes necesarios para cargar todas las unidades de la compaa, este mtodo es til para la implementacin de la compaa aerotransportada.

    abordarTransporte(std::list *transportes);

    Da rdenes a las unidades de una compaa de abordar a la lista de transportes pasada como parmetro.

    bool companiaAbordo();

    Retorna true si todas las unidades de la compaa estn cargadas en transportes.

    onEnemyBuildingShow(Unit* enemyB); onEnemyBuildingDestroy(Unit* enemyB);

    La compaa mantiene informacin de todos los edificios enemigos conocidos en el mapa. Cuando un edificio enemigo se vuelve visible, su posicin es agregada al conjunto. De la misma manera, cuando un edificio es destruido, se quita del conjunto.

    Unit* getComandante();

    Retorna un puntero al comandante de la compaa.

    setComportanmientoEsperando(void); setComportanmientoNormal(void);

    Configura a la compaa para que espere por el transporte o para que deje de esperarlo.

    faltanMarines(); faltanMedicos(); faltanTanks(); faltanGoliaths();

    Retornar verdadero o falso, si el nmero de unidades es menor o igual que el nmero arbitrario de unidades que hacen que el mtodo ListaParaAtacar() retorne verdadero.

    28

  • 6.3.2 Mtodos y Atributos Privados

    6.3.2.1 Atributos

    Color c;

    Color especifico para resaltar las unidades de cada compaia, seteado en el constructor.

    Unit *comandante;

    Puntero al comandante de la compaa.

    AnalizadorTerreno* analizador;

    Puntero al analizador del terreno inicializado en el constructor.

    bool esperar;

    Estado de la compaa, es modificado por los mtodos setComportanmientoEsperando(void) y setComportanmientoNormal(void);

    std::list listMarines; std::list listMedics; std::list listFirebats; std::list listTanks; std::list listGoliath; std::list listScienceVessel; std::list listRefuerzos;

    Internamente, las unidades se agrupan de acuerdo a su tipo en pelotones. Salvo la lista de refuerzos, la cual est formada por diferentes tipos de unidades.

    int cantTransportes;

    Variable que mantiene la cantidad de transportes necesarios para cargar la compaia completa

    6.3.2.2 Mtodos

    setComandantes(void);

    Asigna el comandante de la compaa si es posible, esto es, si en la regin actual existe un tanque o un marine, en caso contrario, se emprende una retirada a la regin del punto de reunin.

    29

  • conteoUnidades(void);

    Mtodo deprecated, fue reemplazado por los mtodo de conteo de unidades por pelotn: countMarines(), countMedics(), countFirebats(), countTanks(), countGoliaths() y countScienceVessels().

    ponerACubierto(Unit *U);

    Mtodo deprecated, fue reemplazado cuando se decidi modelar el grupo bunker en una clase aparte.

    contarUnidades(std::list *lista);

    Mtodo que realiza un conteo de unidades de la lista que le es provista como parmetro y elimina de la misma las unidades muertas.

    asignarARefuerzos(Unit *U);

    Las unidades son asignadas en primera instancia a la lista de unidades y se renen en el punto de reunin. Una vez que la lista de refuerzos alcanza un cierto nmero de unidades (arbitrariamente cinco), son asignadas a sus respectivos pelotones.

    asignarAPelotones(Unit *u);

    Asigna la unidad u al pelotn correspondiente de acuerdo a su tipo de unidad.

    actualizarEstado(std::list *lista);

    Mtodo deprecated. Elimina de la lista las unidades que hayan sido destruidas.

    retirada(void);

    Mueve todas las tropas a la posicin distinguida, punto de retirada que pasar a ser la nueva posicin actual. Para asignar el nuevo punto de retirada, se calcula el camino ms corto entre la nueva posicin actual y la posicin inicial de la base, siendo el nuevo punto de reunin la primera regin adyacente a la actual.

    buscarDaado(std::list lista);

    Retorna un puntero a la primera unidad daada y que no este siendo atendida por un mdico de la lista pasada como parmetro.

    controlarDistancia();

    Este mtodo es el encargado de mantener las formaciones de la compaa tomando en cuenta el tipo y posicin del comandante ubicar a todas las unidades de todos los pelotones.

    30

  • void calcularTransportes();

    Recalcula la cantidad de transportes necesarios para cargar la compaia completa.

    6.4 Clase GrupoBunkers

    6.4.1 Mtodos pblicos

    GrupoBunkers(AnalizadorTerreno *a, Chokepoint *c, Region *r);

    Constructor de la clase, requiere un analizador de terreno para poder calcular posiciones defensivas, adems del chokepoint y la region a defender, para poder orientar el grupo de bunkers hacia el enemigo y no hacia el interior de la base. Adems de calcular las posiciones defensivas, se calcula un punto de reunin, donde se reunirn los marines que sean expulsados de un bunker cuando es destruido. Esto es til para poder reconstruir los bunkers rpidamente, ya que la posicin defensiva ser liberada.

    GrupoBunkers(AnalizadorTerreno *a, Region *r, Region* regionEnemiga);

    Constructor de la clase, requier un analizador de terreno para poder calcular posiciones defensivas, adems de la regin que se debe defender y una regin donde se encuentre el enemigo, a fin de orientar el grupo de bunkers hacia el enemigo. Adems de calcular las posiciones defensivas, se calcula un punto de reunin, donde se reunirn los marines que sean expulsados de un bunker cuando es destruido. Esto es til para poder reconstruir los bunkers rpidamente, ya que la posicin defensiva ser liberada.

    ~GrupoBunkers(void);

    Destructor de la clase.

    void agregarUnidad(Unit* u);

    Agrega una unidad al grupo de bunkers, este mtodo ubica la unidad en la posicin necesaria. En el caso de edificaciones, cada tipo de unidad tendr grupo de posiciones predeterminada, lo que en combinacin con la cantidad de unidades ya asignadas al grupo de bunkers, dar la posicin exacta donde ubicar la misma.Todas las unidades se agregan a listas privadas a fin de poder asignarle rdenes individuales en forma ms eficiente.

    int getCantBunkers();

    31

  • Retorna la cantidad de bunkers que hay en el grupo de bunkers actualmente. La cantidad retornada no tiene en cuenta los bunkers destruidos que sigan almacenados en la lista privada correspondiente.

    int getCantMisileTurrets();

    Retorna la cantidad de missile turrets que hay en el grupo de bunkers actualmente. La cantidad retornada no tiene en cuenta los missile turrets destruidos que sigan almacenados en la lista privada correspondiente.

    int getCantMarines();

    Retorna la cantidad de marines que hay en el grupo de bunkers actualmente. La cantidad retornada no tiene en cuenta los marines destruidos (cuya invocacin al mtodo exists() retorna false) que sigan almacenados en la lista privada correspondiente.

    int getCantTanks();

    Retorna la cantidad de tanques de asedio que hay en el grupo de bunkers actualmente. La cantidad retornada no tiene en cuenta los tanques de asedio destruidos que sigan almacenados en la lista privada correspondiente.

    TilePosition* posicionNuevoBunker();

    Retorna un objeto de clase TilePosition donde se deber ubicar el ltimo bunker agregado al grupo. Se calcula la posicin en base al ngulo que tendr el grupo, el cual fue calculado en el constructor de la clase.

    TilePosition* posicionNuevaTorreta();

    Retorna un objeto de clase TilePosition donde se deber ubicar el ltimo bunker agregado al grupo. Se calcula la posicin en base al ngulo y orientacin que tendr el grupo, el cual fue calculado en el constructor de la clase.

    TilePosition* posicionNuevoTanque();

    Retorna un objeto de clase TilePosition donde se deber ubicar el ltimo tanque de asedio agregado al grupo. Se calcula la posicin en base al ngulo y orientacin que tendr el grupo, el cual fue calculado en el constructor de la clase.

    void onFrame();

    Mtodo que se ejecuta en cada frame del juego. Realiza las siguientes operaciones Posiciona en modo asedio a los tanques de asedio

    32

  • Ordena a los marines ingresar en los bunkers (si hay bunkers con espacio libre) Mueve a los soldados a la posicin de encuentro Dibuja recuadros a las unidades en modo debug Dibuja recuadros a las posiciones defensivas en modo debug

    bool faltanMarines();

    Retorna true si hay bunkers que tienen espacio libre.

    bool faltanTanques();

    Retorna true si hay menos de 3 tanques de asedio asignados al grupo de bunkers.

    bool faltanMisileTurrets();

    Retorna true si hay menos de la cantidad de missile turrets necesaria para la defensa del grupo de bunkers.

    bool faltanBunkers();

    Retorna true si hay menos de 3 bunkers en el grupo.

    void onUnitDestroy(Unit *u);

    Mtodo que es invocado cuando una unidad es destruida. Realiza un control de todas las unidades del grupo para ver si alguna fue destruida, y en ese caso la elimina de la lista correspondiente.

    int getAngulo();

    Invoca un mtodo del analizador de terreno que calcula el ngulo de inclinacin que debe tener el grupo de bunkers. Actualmente se manejan solo 2 ngulos: 0 - vertical y 90 horizontal.El ngulo se calcula en base a la inclinacin del chokepoint a defender (para proporcionar la mayor eficacia al grupo de Bunkers) y el espacio disponible para ubicar el grupo respecto al borde del mapa.

    TilePosition* getTileBunkerCentral();

    Retorna un puntero al TilePosition donde esta o estar ubicado el bunker central del grupo.

    Chokepoint* getChoke();

    33

  • Retorna un puntero al Chokepoint que esta siendo defendido por el grupo de bunkers, el cual fue especificado en el constructor de la clase. Si no se especifico ningn Chokepoint en el constructor retorna null.

    Region* getRegion();

    Retorna un puntero a la Regin que esta siendo defendida por el grupo de bunkers, la cual fue especificada en el constructor de la clase.

    void moverSoldadosPosEncuentro();

    Mueve los soldados que estn fuera de los bunkers a un punto de encuentro, asi, en caso de que los soldados estaban en un bunker que fue destruido, liberan la zona para reconstruir el mismo.

    bool perteneceMarine(Unit *u);

    Retorna true si la unidad pasada como parmetro es un marine perteneciente al grupo de bunkers.

    int cantMaximaTurrets();

    Retorna la cantidad de missile turrets que deber tenerle grupo de bunkers para estar completo.

    6.4.2 Mtodos y atributos privados

    static const int frameLatency = 150;

    Mantiene la cantidad de frames que espera el bot para ejecutar nuevamente el control de bunkers destruidos.

    TilePosition *bunkerCentral;

    TilePosition donde esta ubicado el bunker central del grupo.

    int anguloGrupo;

    Angulo del grupo de bunkers. El valor 0 representa inclinacin vertical, mientras que el 90 representa horizontal. Por ahora se manejan solamente esos 2 valores.

    34

  • Region *reg;

    Region que ser defendida por el grupo de bunkers.

    Chokepoint *choke;

    Chokepoint que debe defender el grupo de bunkers

    AnalizadorTerreno *analizador;

    Puntero al analizador del terreno

    bool faltaMover;

    Mantiene un valor que permite controlar si los marines que ocupaban un bunker que fue destruido se posicionaron en el punto de encuentro.

    int cantChokes;

    Mantiene la cantidad de Chokepoints de la Region a defender.

    std::list listBunkers; std::list listMisileTurrets; std::list listMarines; std::list listTanks;

    Listas que mantienen punteros a cada unidad del grupo de bunkers. Esto permite acceso mas eficiente a las mismas, ya que no se tienen que buscar en las listas globales de unidades.

    bool perteneceBunker(Unit *u);

    Retorna true si el la unidad recibida como parmetro es un bunker y pertenece al grupo de bunkers.

    void controlDestruidos();

    Realiza un control para verificar si alguna unidad del grupo de bunkers fue destruida, es decir cambio su valor del mtodo exists(). En caso de encontrar una unidad que fue destruida, la elimina de la lista correspondiente.

    void resaltarUnidades();

    35

  • Dibuja un recuadro de color a las unidades del grupo de bunkers. Solo tiene utilidad a fines de debug.

    void ubicarModoSiege();

    Ordena a los tanques de asedio del grupo de bunkers que se ubiquen en modo asedio.

    bool puedoConstruir(TilePosition t, UnitType tipo);

    Verifica si los BuildTiles necesarios para la construccin del tipo de unidad recibido como parmetro son vlidos, es decir, tienen un terreno que permite construir y no hay unidades en el mismo.

    bool puedoConstruir2(TilePosition t, UnitType tipo);

    Versin con mejoras del mtodo puedoConstruir. Realiza un control ms minucioso del terreno donde se desea construir, y verifica que todas las posiciones que va a ocupar la unidad se encuentren dentro de la misma regin, es decir, no haya posiciones que pertenezcan a alguna regin no alcanzable.

    TilePosition* encontrarPosicion(int cuadrante, Position p, int angulo);

    Busca una posicin donde ubicar el grupo de bunkers, este mtodo solo se usa una vez en el constructor de la clase GrupoBunkers. Inicialmente intenta ubicar los 3 bunkers y las 2 missile turrets en la posicin p, si no tiene xito, intenta en otras posiciones iterando primero sobre el eje X y luego sobre el Y o viceversa dependiendo del ngulo del grupo de bunkers.

    TilePosition* encontrarPosicion2(int cuadrante, Position p, int angulo, bool buscarHaciaAdentro);

    Version con mejoras del metodo encontrarPosicion. Permite buscar ubicacin para construir las unidades del grupo de bunkers hacia el interior de la regin a defender, ya que en ocasiones resulta ser ms efectivo

    bool ocupado(TilePosition t, int IDTipo);

    Retorna true si el TilePosition pasado como parmetro esta ocupado por alguna construccin de tipo IDTipo.

    TilePosition* posicionPrimerBunker(Region* r, Chokepoint* c);

    36

  • Retorna la posicin donde debera ubicarse un bunker para defender el chokepoint pasado como parametro, retorna null si no pudo encontrar una posicion. Este mtodo invoca tambin al mtodo encontrarPosicion.

    TilePosition* posicionPrimerBunker2(Region* r, Chokepoint* c, bool buscarHaciaAdentro, Region* regionEnemiga);

    Versin con mejoras del mtodo encontrarPosicin. Permite manejar regiones con mltiples chokepoints.

    bool rellenarPosicionTanque(Unit *u);

    Este mtodo es utilizado cuando se quiere agregar un nuevo tanque al grupo de bunkers. Recorre la lista de tanques y si encuentra un tanque que ya no existe lo reemplaza por el nuevo tanque. Retorna true si encontro una posicion vacia, false en caso contrario.

    void dibujarPosiciones();

    Dibuja un recuadro en las posiciones donde se va a ubicar los bunkers y las missile turrets (mtodo til para debug).

    6.5 Clase Grupo Antiareo

    6.5.1 Mtodos pblicos

    GrupoAntiaereo(Region *r);

    Constructor de la clase. Recibe como parmetro la regin a defender. Calcula la cantidad de grupos de missile turrets que sern necesarios para defender la regin. De 4 posibles posiciones (norte, sur, este y oeste) descarta algunas al considerar donde est ubicado el grupo de bunkers que defiende la regin, y si la misma est ubicada sobre algn borde del mapa.

    ~GrupoAntiaereo(void);

    Destructor de la clase.

    void onFrame();

    Mtodo que se ejecuta en cada frame del juego. Actualmente solo se utiliza a fines de debug.

    37

  • bool faltanMisileTurrets();

    Retorna true si hay menos missile turrets en el grupo antiareo de las necesarias.

    void agregarUnidad(Unit *u);

    Agrega un missile turret al grupo antiareo, y calcula la posicin donde deber ser construido.

    TilePosition* getPosicionMisileTurret();

    Retorna el tilePosition donde deber ubicarse el prximo missile turret.

    int cantMaximaTurrets();

    Retorna la cantidad necesaria de missile turrets (variable cantidadNecesariaTurrets).

    void onUnitShow(Unit *u);

    Mtodo utilizado originalmente para asignar objetivos a los missile turrets. Dejo de utilizarse en la versin final por considerarse poco til.

    6.5.2 Mtodos y atributos privados

    int cantidadNecesariaTurrets;

    Mantiene la cantidad necesaria de missile turrets para defender la regin asignada.

    Unit *objetivoActual;

    Puntero a la unidad que es el objetivo actual del grupo antiareo. Este puntero era utilizado por el mtodo onUnitShow para asignar objetivos a las missile turrets.

    static const int IZQUIERDA = 0; static const int DERECHA = 1; static const int ARRIBA = 2; static const int ABAJO = 3;

    Constantes utilizadas para mantener las posiciones que deben ser defendidas por el grupo antiareo.

    std::list listMisileTurrets;

    38

  • Lista que mantiene referencias a las missile turrets del grupo antiareo junto con el TilePosition asociado a cada una.

    bool puedoConstruir(TilePosition t, UnitType tipo);

    Verifica si se puede construir el tipo de unidad en el TilePosition pasado como parmetro.

    TilePosition *encontrarPosicion(int orientacion, Position posCentral);

    Encuentra ubicacin para cada missile turret del grupo antiareo. Los parmetros son la orientacin (si el missile turret debe defender el este, oeste norte o sur de la regin) y la posicin del missile turret central de esa seccin.

    int getCantMisileTurrets();

    Retorna la cantidad de missile turrets que hay actualmente en el grupo antiareo. No tiene en cuenta las missile turrets que hayan sido destruidas.

    6.6 Clase Grafo

    6.6.1 Mtodos pblicos

    Grafo(int cantNodos);

    Constructor de la clase. Recibe como parmetro la cantidad de nodos que tendr el grafo y luego inicializa la estructura de datos. Crea adems una lista que representa el recorrido por niveles del grafo.

    ~Grafo(void);

    Destructor de la clase.

    Position* primerNodoNiveles();

    Obtiene una posicin que representa el primer nodo de un recorrido por niveles del grafo.

    Position* siguienteNodoNiveles();

    39

  • Obtiene la posicin que representa el siguiente nodo de un recorrido por niveles del grafo. Si el nodo actual es el ltimo de la lista, retorna null. El nodo actual debe estar inicializado por una llamada al mtodo primerNodoNiveles, asemejando al comportamiento de un iterador.

    void dibujarPuntosVisitar();

    Mtodo utilizado para debug, dibuja un punto en cada posicin que es representada por un nodo en el grafo.

    6.6.2 Mtodos y atributos privados

    Nodo* listaAdy;

    La representacin del grafo es mediante una lista de adyacencia, la cual es almacenada en el arreglo listaAdy.

    std::list niveles;

    Lista de posiciones que representa un recorrido por niveles del grafo.

    std::list::iterator ItNiveles;

    Iterador para el recorrido de la lista niveles

    int indiceRegion(Region *reg);

    Retorna el ndice del nodo que representa la regin pasada como parmetro en la lista de adyacencia (los nodos tienen una region asociada).

    void crearListaNiveles();

    Crea la lista con el recorrido por niveles del grafo.

    6.7 Clase Nodo

    6.7.1 Mtodos pblicos

    Nodo(void);

    40

  • Constructor de la clase.

    Nodo::Nodo(Region* reg)

    Constructor de la clase. Asocia la regin pasada como parmetro al nodo creado.

    Nodo::~Nodo(void)

    Destructor de la clase.

    Region* getRegion();

    Retorna la regin asociada al nodo.

    void setRegion(Region *reg);

    Setea la regin asociada al nodo.

    void setSiguiente(Nodo *nodo);

    Setea el nodo siguiente al nodo actual. Utilizado para crear una representacin de lista encadenando nodos.

    Nodo* getSiguiente();

    Obtiene el nodo siguiente al nodo actual. Si el nodo actual no tiene nodo siguiente, el mtodo retorna null.

    6.7.2 Mtodos y atributos privados

    Region *r;

    Puntero a la regin asociada al nodo.

    Nodo *siguiente;

    Puntero al nodo siguiente al nodo actual.

    41

  • 6.8 Clase Scout

    6.8.1 Mtodos pblicos

    Scout(Unit *unidad);

    Constructor de la clase. Setea la unidad pasada como parmetro como el nuevo scout (se mantiene un puntero al mismo como una variable privada).

    Scout(Unit *unidad, Grafo *g);

    Constructor de la clase. Setea la unidad pasada como parmetro como el nuevo scout (se mantiene un puntero al mismo como una variable privada). Adicionalmente se almacena una referencia a un grafo, que representa las regiones del mapa y sus conexiones, para realizar un recorrido del mapa siguiendo el orden dado por un recorrido por niveles del mismo.

    ~Scout(void);

    Destructor de la clase.

    bool exists(void);

    Retorna el resultado de invocar al mtodo exists() de la unidad que esta asignada actualmente como scout.

    void explorar(void);

    Ordena al scout realizar la exploracin del mapa siguiendo ya sea el camino predefinido (recorrer cada posicin donde un jugador puede iniciar el juego) o el camino definido por el recorrido por niveles del grafo de regiones. Debe ejecutarse en cada frame del juego.

    void setExplorador(Unit *u);

    Setea la unidad pasada como parmetro como el nuevo scout.

    Unit* getExplorador();

    Retorna un puntero a la unidad que esta seteada actualmente como scout.

    6.8.2 Mtodos y atributos privados

    42

  • Position* posActual;

    Posicin actual que debe visitar el scout. Se debe actualizar a medida que se ejecuta la exploracin.

    Grafo *grafo;

    Puntero al grafo de regiones utilizado por el scout.

    int tiempoMax;

    Variable que mantiene un contador de la cantidad de frames que tom llegar desde una posicin a recorrer hasta la siguiente. Si se supera el tiempo mximo permitido, se actualiza el puntero posActual a la siguiente posicin.

    bool primeraExploracion;

    Retorna true si es la primera exploracin del mapa realizada por el scout (utilizando las posiciones de inicio de los jugadores). False en caso contrario (se esta utilizando las posiciones dadas por el recorrido por niveles del grafo de regiones)

    void dibujarPosiciones(void);

    Dibuja las posiciones que recorrer el scout en su exploracin del mapa.

    void dibujarGrilla(void);

    Dibuja una grilla alrededor del scout, con diferentes colores dependiendo del terreno. Tiene 2 modos de representacin de la informacin del terreno:

    o Modo 0: muestra informacin sobre si el terreno es walkableo Modo 1: muestra informacin sobre la altura del terreno

    6.9 Clase Analizador del terreno

    6.9.1 Mtodos pblicos

    static bool analyzed;

    Indica si el anlisis del terreno del mapa fue realizado con xito.

    static bool analysis_just_finished;

    Esta variable es utilizada para saber si el anlisis del terreno finalizo en el frame anterior

    43

  • static BWTA::Region* home;

    Regin donde el bot inicia el juego.

    static BWTA::Region* enemy_base;

    Regin donde el enemigo inicia el juego.

    DWORD WINAPI AnalyzeThread();

    Mtodo que realiza el anlisis del terreno propiamente dicho, se ejecuta en un thread aparte.

    AnalizadorTerreno(void);

    Constructor de la clase, ejecuta el anlisis del terreno.

    ~AnalizadorTerreno(void);

    Destructor de la clase.

    bool analisisListo(void);

    Retorna true si el BWTA finalizo de analizar el terreno, false en caso contrario.

    Region* regionInicial();

    Retorna un puntero a la regin en la que se inicia el juego.

    Chokepoint* obtenerChokepoint();

    Obtiene el chokepoint que se debe defender desde la posicin inicial donde se inicia el juego.

    Position * obtenerCentroChokepoint();

    Devuelve la posicin del centro del chokepoint inicial que se debe defender.

    void dibujarResultados(void);

    Dibuja datos sobre el mapa (regiones del BWTA, tipo de disparos realizados, etc...).

    44

  • int calcularAngulo(Chokepoint *c);

    Calcula el ngulo que tiene el chokepoint pasado como parmetro.

    int calcularAnguloGrupo(int angulo);

    Calcula el ngulo que deber tener un grupo de bunkers para defender cierto chokepoint cuyo ngulo es pasado como parmetro.

    int getCuadrante(Position p);

    Determina en que cuadrante esta la posicin pasada como parmetro (divide al mapa en 4 cuadrantes:

    1- mitad superior izquierda del mapa 2- mitad superior derecha del mapa3- mitad inferior izquierda del mapa4- mitad inferior derecha del mapa

    int getOrientacion(Chokepoint *c, Region *r);

    Determina la orientacin de un grupo de bunkers, es decir si las missile turrets se ubican de un lado u otro de los bunkers.

    6.9.2 Mtodos y atributos privados

    bool show_visibility_data;

    Flag que indica si se van a dibujar datos acerca de la visibilidad del terreno.

    bool show_bullets;

    Flag que indica si se van a dibujar datos acerca de los disparos de las unidades.

    void drawStats();

    Dibuja en el mapa estadsticas acerca de las unidades disponibles.

    void drawBullets();

    Dibuja en el mapa los disparos de las unidades.

    void drawVisibilityData();

    45

  • Dibuja en el mapa informacin acerca de la visibilidad del terreno del mapa.

    void drawTerrainData();

    Dibuja en el mapa contornos en las posiciones de minerales, gas, ubicaciones de centro de comando, bordes de regiones y chokepoints.

    6.10 Clase Compaa defensiva

    6.10.1 Mtodos pblicos

    CompaniaDefensiva(Color ID);

    Constructor de la clase. Utiliza el color pasado como parmetro para realizar un recuadro a las unidades de esa compaa cuando se utilizan los mtodos de dibujo de la clase.

    ~CompaniaDefensiva(void);

    Destructor de la clase.

    void onFrame();

    Mtodo que se ejecuta en cada frame del juego. Realiza el control de unidades destruidas pertenecientes a la compaa, y busca objetivos para las unidades de la misma. Cuando se especifica tambin invoca a los mtodos de dibujo, los cuales deben ejecutarse en cada frame del juego.

    int countMarines();

    Cuenta la cantidad de marines vivos que hay en la compaa, elimina de la lista de marines a los que hayan dejado de existir.

    void asignarUnidad(Unit *U);

    Asigna la unidad pasada como parmetro a la compaa defensiva, y la agrega a la lista de unidades correspondiente.

    void atacar(Unit *u);

    Ordena a los marines de la compaa atacar la unidad pasada como parmetro.

    46

  • void atacar(Position p);

    Realiza un movimiento de ataque hacia la posicin pasada como parmetro, es decir, ordena a los marines moverse a la posicin p y atacar a todos los enemigos que encuentren en el camino.

    bool faltanMarines();

    Retorna true si en la compaa defensiva hay menos marines de los necesarios (la cantidad de marines necesarios se puede modificar en este mtodo, por defecto es 5).

    bool faltanGhosts();

    Retorna true si en la compaa defensiva hay menos ghosts de los necesarios (la cantidad de ghosts necesarios se puede modificar en este mtodo, por defecto es 2). El mtodo retorna false si la raza enemiga es Zerg, ya que los ghosts prcticamente no tienen utilidad en ese caso.

    bool faltanMedics();

    Retorna true si en la compaa defensiva hay menos medics de los necesarios (la cantidad de medics necesarios se puede modificar en este mtodo, por defecto es 2).

    6.10.2 Mtodos y atributos privados

    std::list listMarines; std::list listGhosts; std::list listMedics;

    Listas que mantienen referencias a las unidades de la compaa.

    Color c;

    Color especifico para resaltar los soldados de cada compaa, seteado en el constructor.

    void controlarEliminados();

    Recorre las listas de unidades y elimina las que hayan dejado de existir.

    Unit* buscarObjetivosGhost();

    47

  • Busca objetivos para asignar a los ghosts de la compaa. Los objetivos para los mismos solo sern unidades mecnicas, ya que las estas pueden ser locked down. El mtodo busca la unidad enemiga de mayor tamao que haya entrado en la regin defendida, o que este atacando una unidad aliada que este dentro de la regin defendida.

    Unit* buscarObjetivosMedics();

    Busca objetivos para asignar a los medics de la compaa, los mismos se encargan de aplicar restauracin a todas las unidades aliadas que encuentre dentro de la regin defendida por la compaa defensiva

    Unit* buscarObjetivosMarines();

    Busca objetivos para asignar a los marines de la compaa, los mismos atacan a cualquier unidad enemiga que haya entrado a la regin defendida por la compaa defensiva

    void defenderBaseGhosts();

    Invoca a buscarObjetivosGhost() para obtener una unidad objetivo y luego recorre la lista de ghosts para buscar uno que tenga suficiente energa para atacar al objetivo.

    void defenderBaseMedics();

    Invoca a buscarObjetivosMedics() para obtener una unidad objetivo y luego recorre la lista de medics para buscar uno que tenga suficiente energa para curar al objetivo.

    void defenderBaseMarines();

    Recorre la lista de marines, en caso de que ninguno esta atacando alguna unidad invoca a buscarObjetivosMarines() para obtener una unidad objetivo y ordena a los marines atacar a la misma.

    void recuadrarUnidades();

    Realiza un recuadro del color pasado como parmetro en el constructor a las unidades de la compaa defensiva.

    6.11 Clase Compaa de transporte

    6.11.1 Mtodos pblicos

    48

  • CompaniaTransporte(Position* baseEnem, Region* regEnem, compania* c);

    Constructor de la clase. Los parmetros recibidos son la posicin de la base enemiga, la regin donde esta ubicada la base enemiga, y la compaa de ataque a transportar. Invoca el metodo crearPath() para crear el camino a seguir por los transportes hacia la base enemiga.

    ~CompaniaTransporte(void);

    Destructor de la clase.

    void onFrame();

    Mtodo que se ejecuta en cada frame del juego. Realiza distintas tareas, dibuja grficos para facilitar el debug (si se invoca a los mtodos de dibujo correspondientes). Otra funcin de este mtodo es controlar la actualizacin del estado de la compaa de transporte, y realizar operaciones asociadas a cada estado. Los estados posibles son:

    esperando cargar cargando transportando desembarcando retornando a la base

    void asignarUnidad(Unit* u);

    Agrega la unidad pasada como parmetro a la compaa de transporte.

    bool faltanDropships();

    Retorna true si hay menos dropships de los necesarios en la compaa. La cantidad de dropships se corresponde con la cantidad de transportes necesarios para cargar toda la compaa de ataque.

    bool faltanWraiths();

    Retorna true si hay menos wraiths de los necesarios en la compaa (la cantidad por defecto es 2, se puede modificar en este mtodo).

    bool listaTransportar();

    Retorna true si la compaa de transporte esta lista a transportar las unidades. Para estar lista, la compaa de transporte debe tener suficientes dropships, wraiths y la compaa de ataque debe estar lista para ser transportada.

    49

  • void ejecutarTransporte();

    Realiza el movimiento hacia la base enemiga, siguiendo el camino calculado en el constructor. Cuando llega al punto de desembarco, ordena desembarcar las unidades y luego retornar a la base.

    6.11.2 Mtodos y atributos privados

    std::list listDropships; std::list listWraiths;

    Listas de unidades de la compaa de transporte.

    std::list pathBaseEnemiga;

    Lista de posiciones que representa el camino a seguir por los transportes para llegar a la base enemiga.

    Position *puntoDesembarco;

    Puntero a la posicin donde se va a desembarcar las unidades la compaa de transporte

    Position *baseEnemiga;

    Puntero a la posicin donde esta ubicada la base enemiga en el mapa.

    Region *regionBaseEnemiga;

    Puntero a la regin donde esta ubicada la base enemiga.

    void dibujarPath();

    Dibuja el camino hacia la base enemiga.

    void recuadrarUnidades();

    Dibuja un recuadro a las unidades de la compaa de transporte.

    void crearPath();

    Crea una lista de posiciones que representa el camino que deber seguir la compaa de transporte para ir hacia la base enemiga. Se contemplan varios factores en la eleccin de las posiciones a seguir, se intenta seleccionar el camino mas corto posible que vaya por los bordes del mapa, para disminuir asi la posibilidad de encontrar unidades enemigas

    50

  • mientras se realiza el movimiento. Otro factor a tener en cuenta es la posicin de desembarco, la cual para ser lo mas efectiva posible debe estar lejos de las defensas enemigas, pero dentro de la regin de la base enemiga, para encontrar la menor resistencia posible en el momento del desembarco, en el cual la compaa de transporte es mas vulnerable.

    void desembarcar();

    Ordena a los transportes desembarcar a las unidades que estn cargadas en su interior.

    void controlarEliminados();

    Controla las listas de unidades de la compaa defensiva y elimina de las mismas las unidades que hayan sido destruidas.

    std::list::iterator ItPosiciones;

    Iterador utilizado para el recorrido de la lista de posiciones pathBaseEnemiga.

    Unit *liderFormacion;

    Puntero a la unidad que es el lder de la formacin. Si hay algn wraith existente actualmente, lo asigna como lder, de lo contrario asigna un dropship.

    bool ready;

    Variable utilizada para mejorar la eficiencia, evita realizar un control en el cdigo. Su valor representa si la compaa de transporte esta lista para realizar el transporte

    compania *aero;

    Puntero a la compaa de ataque que ser transportada por la compaa de transporte.

    bool comandanteCargado;

    Variable cuyo valor representa si el comandante de la compaa de ataque esta cargado dentro de un transporte.

    static const int ESPERANDO_CARGAR = 1; static const int CARGANDO = 2; static const int TRANSPORTANDO = 3; static const int DESEMBARCANDO = 4; static const int RETORNANDO_BASE = 5;

    Constantes que representan los posibles estados de la compaa de transporte.

    51

  • int estadoActual;

    Variable que mantiene el estado actual de la compaa de transporte.

    bool seteadoPuntoDesembarco;

    Variable cuyo valor representa si el punto de desembarco fue seteado.

    int esperaDeCarga;

    Contador que determina un tiempo mximo de espera para que se carguen todas las unidades en los transportes. Si se alcanza el tiempo mximo se enva a la compaa de transporte hacia la base enemiga aunque no estn cargadas todas las unidades de la compaa de ataque.

    static const int ESPERA_MAXIMA = 500;

    Cantidad mxima de frames que se esperar a cargar la compaa de ataque

    bool desembarcoListo();

    Retorna true si todos los dropships estn vacos.

    void retornarBase();

    Ordena a las unidades de la compaa de transporte retornar a la base.

    void reasignarLiderFormacion();

    Asigna un nuevo lder al grupo de transporte, si es que hay alguna unidad existente. Primero intenta encontrar un wraith para asignarlo, y si no existe ninguno, intenta asignar un dropship.

    6.12 Clase Grficos

    6.12.1 Mtodos pblicos

    static void resaltarUnidad(Unit *u);

    52

  • Dibuja un recuadro alrededor de la unidad pasada como parmetro.

    static void resaltarUnidad(Unit *u, Color c);

    Dibuja un recuadro alrededor de la unidad pasada como parmetro, con el color pasado como parmetro.

    static void dibujarCuadro(TilePosition* p, int tilesAncho, int tilesAlto);

    Dibuja un rectngulo en la posicin y con las dimensiones pasadas como parmetro.

    static void dibujarCuadro(TilePosition* p, int tilesAncho, int tilesAlto, Color c, bool relleno);

    Dibuja un rectngulo en la posicin y con las dimensiones y color pasadas como parmetro. El parmetro relleno especifica si solo se dibuja el contorno del rectngulo o se dibuja el rectngulo de manera completa.

    static void dibujarCirculo(TilePosition p, int tilesAncho, int tilesAlto);

    Dibuja un rectngulo en la posicin y con las dimensiones pasadas como parmetro.

    static void dibujarTerreno(bool show_visibility_data, bool analyzed);

    Dibuja en el mapa los resultados del anlisis del terreno realizado por el BWTA.

    6.12.2 Mtodos y atributos privados

    static void drawStats();

    Muestra en pantalla estadsticas de las unidades propias.

    53

  • 7 Diagrama de clases

    54

  • 8 Referencias

    1. Buro, M.: Orts: A hack-free rts game environment. In: Proceedings of the Third International Conference on Computers and Games. pp. 151161 (2002)

    2. Buro, M.: Real time strategy. new ai research. In: Proceedings of the International Joint Conference on AI 2003. pp. 15341535. Acapulco, Mexico (2003)

    3. John Laird, M.v.L.: Human-level ais killer application: Interactive computer games. In: Proceedings of the 17th. AAAI National Conference on AI 2000 and 12th Ann. Conf. Innov. Appl. AI. pp. 11711178. Texas, US (2000)

    4. Shannon, C.: Programming a computer playing chess. Philosophical Magazine 41 (314) (1950)

    5. AI Game Programming Wisdom. Charles River Media. 1st Edition (February 20, 2008). Edited by Steve Rabin. pp. 61 71

    6. BWAPIhttp://code.google.com/p/bwapi/ Accedida en 12 de septiembre de 2010

    7. BWTAhttp://code.google.com/p/bwta/ Accedida en 12 de septiembre de 2010

    8. Starcraft wikihttp://starcraft.wikia.com/wiki/StarCraft_Wiki Accedida en 12 de septiembre de 2010

    9. Liquipedia: The starcraft encyclopediahttp://wiki.teamliquid.net/starcraft/Main_Page Accedida en 12 de septiembre de 2010

    10. Terran Strategyhttp://classic.battle.net/scc/terran/index.shtml Accedida en 12 de septiembre de 2010

    11. How to Outsmart Opponents at St