Sie sind auf Seite 1von 55

Tesis de Licenciatura

Agente Inteligente para el videojuego Starcraft


Alumnos: Cristian Conde. LU: 65568
Mariano Moreno. LU: 66925
Director: Dr. Diego Csar Martnez
Febrero 2011

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 19
6.1.2 Atributos Privados 20
6.2 CLASE UNIT MANAGER 20
6.2.1 Mtodos Pblicos 20
6.2.2 Mtodos y atributos privados 22
6.3 CLASE COMPAA 27
6.3.1 Mtodos Pblicos 27
6.3.2 Mtodos y Atributos Privados 30
6.4 CLASE GRUPOBUNKERS 32
6.4.1 Mtodos pblicos 32
6.4.2 Mtodos y atributos privados 35
6.5 CLASE GRUPO ANTIAREO 38
6.5.1 Mtodos pblicos 38
6.5.2 Mtodos y atributos privados 39
6.6 CLASE GRAFO 40
6.6.1 Mtodos pblicos 40
6.6.2 Mtodos y atributos privados 41
6.7 CLASE NODO 41
6.7.1 Mtodos pblicos 41
6.7.2 Mtodos y atributos privados 42
6.8 CLASE SCOUT 43
6.8.1 Mtodos pblicos 43
6.8.2 Mtodos y atributos privados 43
6.9 CLASE ANALIZADOR DEL TERRENO 44
6.9.1 Mtodos pblicos 44
6.9.2 Mtodos y atributos privados 46
6.10 CLASE COMPAA DEFENSIVA 47
6.10.1 Mtodos pblicos 47
6.10.2 Mtodos y atributos privados 48
6.11 CLASE COMPAA DE TRANSPORTE 49
6.11.1 Mtodos pblicos 49
6.11.2 Mtodos y atributos privados 51
6.12 CLASE GRFICOS 53
6.12.1 Mtodos pblicos 53
6.12.2 Mtodos y atributos privados 54
7 Diagrama de clases 55
8 Referencias 56

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:

1
2

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.

http://code.google.com/p/bwapi
http://code.google.com/p/manolobot

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.

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.

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

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

o
o
o
o

grupo sobre un borde de la entrada a la base y que las unidades enemigas


puedan pasar sin ser atacadas
orientar el grupo hacia la posicin desde donde se espera que ataque el
enemigo
ubicar el grupo de manera que permita el paso de unidades aliadas por el
chokepoint
evitar la superposicin del grupo en una zona donde se debera construir
un nuevo centro de comando
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:

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 Comsat
2. se asigna esa unidad como objetivo para la compaa defensiva
3. se ordena a la compaa defensiva atacar a la unidad enemiga
4. 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 eficiente
o mejorar la ruta a seguir para ejecutar el transporte

16

o realizar un control para mantener una formacin durante el transporte


o 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<Unit*> 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
void
void
void
void
void
void

trainWorker();
trainMarine();
trainMedic();
trainGhost();
trainVulture();
trainGoliath();
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<Unit*> lista);

Aplica el stim_pack a las unidades pertenecientes a la compaia si no estan dentro de un


contenedor (bunker, dropship).

int
int
int
int
int
int

countMarines();
countMedics();
countFirebats();
countTanks();
countGoliaths();
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<Unit*> *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
y setComportanmientoNormal(void);

setComportanmientoEsperando(void)

std::list<Unit*>
std::list<Unit*>
std::list<Unit*>
std::list<Unit*>
std::list<Unit*>
std::list<Unit*>
std::list<Unit*>

listMarines;
listMedics;
listFirebats;
listTanks;
listGoliath;
listScienceVessel;
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(),
countGoliaths() y countScienceVessels().

countTanks(),

ponerACubierto(Unit *U);

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

contarUnidades(std::list<Unit*> *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<Unit*> *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<Unit*> 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<Unit*> listBunkers;
std::list<Unit*> listMisileTurrets;
std::list<Unit*> listMarines;
std::list<std::pair<Position*, Unit*>> 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
static
static
static

const
const
const
const

int
int
int
int

IZQUIERDA = 0;
DERECHA = 1;
ARRIBA = 2;
ABAJO = 3;

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

std::list<std::pair<TilePosition*, Unit*>> 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<Position*> niveles;

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

std::list<Position*>::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 walkable
o 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 mapa
3- mitad inferior izquierda del mapa
4- 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<Unit*> listMarines;
std::list<Unit*> listGhosts;
std::list<Unit*> 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<Unit*> listDropships;
std::list<Unit*> listWraiths;

Listas de unidades de la compaa de transporte.

std::list<Position*> 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<Position*>::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
static
static
static
static

const
const
const
const
const

int
int
int
int
int

ESPERANDO_CARGAR = 1;
CARGANDO = 2;
TRANSPORTANDO = 3;
DESEMBARCANDO = 4;
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. BWAPI
http://code.google.com/p/bwapi/
Accedida en 12 de septiembre de 2010
7. BWTA
http://code.google.com/p/bwta/
Accedida en 12 de septiembre de 2010
8. Starcraft wiki
http://starcraft.wikia.com/wiki/StarCraft_Wiki
Accedida en 12 de septiembre de 2010
9. Liquipedia: The starcraft encyclopedia
http://wiki.teamliquid.net/starcraft/Main_Page
Accedida en 12 de septiembre de 2010
10. Terran Strategy
http://classic.battle.net/scc/terran/index.shtml
Accedida en 12 de septiembre de 2010
11. How to Outsmart Opponents at Starcraft
http://www.wikihow.com/Outsmart-Opponents-at-Starcraft
Accedida en 12 de septiembre de 2010
12. How to Improve Your Skills on Starcraft
http://www.wikihow.com/Improve-Your-Skills-on-Starcraft
Accedida en 12 de septiembre de 2010

55

Das könnte Ihnen auch gefallen