Beruflich Dokumente
Kultur Dokumente
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.
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:
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.
1
2
http://code.google.com/p/bwapi
http://code.google.com/p/manolobot
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
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 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
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)
10
11
12
13
14
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
17
strategy_manager(void);
~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);
int* getResearchs(void);
Retorna las investigaciones que deben realizarse en el estado actual del Strategy
Manager.
onUnitCreate(Unit *u);
onUnitDestroy(Unit *u);
setResearchsDone(bool *rd);
int getEstadoActual();
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];
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];
unit_Manager(AnalizadorTerreno *analizador);
executeActions();
19
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]);
asignarUnidadACompania(Unit* unit);
Cuando una unidad militar es creada, este mtodo asigna la unidad a una de sus
compaas.
verificarBunkers();
repararUnidad(Unit *u);
onUnitCreate(Unit *u);
20
onUnitDestroy(Unit *u);
onNukeDetect(Position p);
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();
setEstadoActual(int estado);
~unit_Manager(void);
Destructor.
cantUnidades[34];
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];
Scout* magallanes;
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;
bool analisisListo;
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;
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;
std::list<Unit*> unidadesEnConstruccion;
int frameLatency;
int buildingSemaphore;
AnalizadorTerreno* analizador;
int estadoActual;
23
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);
Unit* getWorker();
Retorna un puntero a una unidad del identificador de tipo pasado como parmetro.
sendGatherCristal(Unit* worker);
sendGatherGas(Unit* worker);
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.
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);
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.
construyendo(int ID);
25
moverUnidades(TilePosition *t);
Si hay unidades en el TilePosition t, se les ordena movilizarse a otra posicin del mapa.
nuevaUnidadConstruccion(Unit *u);
controlarFinalizacion();
finalizarConstruccion(Unit *u);
ejecutarConstrucciones();
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.
~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);
int
int
int
int
int
int
countMarines();
countMedics();
countFirebats();
countTanks();
countGoliaths();
countScienceVessels();
atacar(Unit *u);
onFrame();
moverCompania(Position pos);
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();
abordarTransporte(std::list<Unit*> *transportes);
bool companiaAbordo();
onEnemyBuildingShow(Unit* enemyB);
onEnemyBuildingDestroy(Unit* enemyB);
Unit* getComandante();
setComportanmientoEsperando(void);
setComportanmientoNormal(void);
Configura a la compaa para que espere por el transporte o para que deje de esperarlo.
faltanMarines();
faltanMedicos();
faltanTanks();
faltanGoliaths();
28
6.3.2.1 Atributos
Color c;
Color especifico para resaltar las unidades de cada compaia, seteado en el constructor.
Unit *comandante;
AnalizadorTerreno* analizador;
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;
int cantTransportes;
6.3.2.2 Mtodos
setComandantes(void);
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);
asignarAPelotones(Unit *u);
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();
void calcularTransportes();
~GrupoBunkers(void);
Destructor de la clase.
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
int getCantMisileTurrets();
int getCantMarines();
int getCantTanks();
TilePosition* posicionNuevoBunker();
TilePosition* posicionNuevaTorreta();
TilePosition* posicionNuevoTanque();
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();
bool faltanTanques();
bool faltanMisileTurrets();
Retorna true si hay menos de la cantidad de missile turrets necesaria para la defensa del
grupo de bunkers.
bool faltanBunkers();
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.
int cantMaximaTurrets();
Retorna la cantidad de missile turrets que deber tenerle grupo de bunkers para estar
completo.
Mantiene la cantidad de frames que espera el bot para ejecutar nuevamente el control de
bunkers destruidos.
TilePosition *bunkerCentral;
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
Chokepoint *choke;
Chokepoint
AnalizadorTerreno *analizador;
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;
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.
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.
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.
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.
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.
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
Retorna true si el TilePosition pasado como parmetro esta ocupado por alguna
construccin de tipo IDTipo.
36
Versin con mejoras del mtodo encontrarPosicin. Permite manejar regiones con
mltiples chokepoints.
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).
GrupoAntiaereo(Region *r);
~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.
Agrega un missile turret al grupo antiareo, y calcula la posicin donde deber ser
construido.
TilePosition* getPosicionMisileTurret();
int cantMaximaTurrets();
Mtodo utilizado originalmente para asignar objetivos a los missile turrets. Dejo de
utilizarse en la versin final por considerarse poco til.
int cantidadNecesariaTurrets;
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.
38
Lista que mantiene referencias a las missile turrets del grupo antiareo junto con el
TilePosition asociado a cada una.
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();
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.
Nodo* listaAdy;
std::list<Position*> niveles;
std::list<Position*>::iterator ItNiveles;
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();
Nodo(void);
40
Constructor de la clase.
Nodo::Nodo(Region* reg)
Nodo::~Nodo(void)
Destructor de la clase.
Region* getRegion();
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.
Region *r;
Nodo *siguiente;
41
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).
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);
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.
Unit* getExplorador();
42
Position* posActual;
Posicin actual que debe visitar el scout. Se debe actualizar a medida que se ejecuta la
exploracin.
Grafo *grafo;
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);
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
Indica si el anlisis del terreno del mapa fue realizado con xito.
Esta variable es utilizada para saber si el anlisis del terreno finalizo en el frame anterior
43
Mtodo que realiza el anlisis del terreno propiamente dicho, se ejecuta en un thread
aparte.
AnalizadorTerreno(void);
~AnalizadorTerreno(void);
Destructor de la clase.
bool analisisListo(void);
Region* regionInicial();
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
Calcula el ngulo que deber tener un grupo de bunkers para defender cierto chokepoint
cuyo ngulo es pasado como parmetro.
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
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();
void drawBullets();
void drawVisibilityData();
45
void drawTerrainData();
Mtodos pblicos
CompaniaDefensiva(Color ID);
~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();
46
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
std::list<Unit*> listMarines;
std::list<Unit*> listGhosts;
std::list<Unit*> listMedics;
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();
void defenderBaseMedics();
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.
Mtodos pblicos
48
~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
bool faltanDropships();
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();
6.11.2
std::list<Unit*> listDropships;
std::list<Unit*> listWraiths;
std::list<Position*> pathBaseEnemiga;
Lista de posiciones que representa el camino a seguir por los transportes para llegar a la
base enemiga.
Position *puntoDesembarco;
Position *baseEnemiga;
Region *regionBaseEnemiga;
void dibujarPath();
void recuadrarUnidades();
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
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;
Unit *liderFormacion;
bool ready;
compania *aero;
bool comandanteCargado;
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;
int estadoActual;
bool seteadoPuntoDesembarco;
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.
bool desembarcoListo();
void retornarBase();
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.
Mtodos pblicos
52
Dibuja un recuadro alrededor de la unidad pasada como parmetro, con el color pasado
como parmetro.
Dibuja en el mapa los resultados del anlisis del terreno realizado por el BWTA.
6.12.2
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