Este documento presenta un trabajo final sobre el desarrollo de un juego de Abalone implementado en C++ con interfaz gráfica de usuario desarrollada en GTK+. El trabajo explica las reglas básicas del juego de Abalone, los posibles movimientos, y las situaciones especiales como Sumito y Pac. También describe el algoritmo utilizado para la lógica del juego, el cual implementa los movimientos de línea y de lado, y la división entre la lógica del juego y la interfaz gráfica. Finalmente, comenta aspectos como la int
APORTES Y CARACTERISTICAS DE LAS OBRAS DE CORBUSIER. MIES VAN DER ROHE
AbaloneR: Simulador de juego Abalone en C
1. Universidad Cat´olica
“Nuestra Se˜nora de la Asunci´on”
Sede Regional Asunci´on
Facultad de Ciencias y Tecnolog´ıa
Departamento de Ingenier´ıa
Electr´onica e Inform´atica
Lenguajes de Programaci´on I
Ing. Carlos Cardozo
Ing. Rodrigo Villalba
Ing. Vicente Gonz´alez
Colm´an, Alberto <albertocolman81@gmail.com>
Ram´ırez, Pedro <pedroramirez22@gmail.com>
Trabajo Final
AbaloneR
1 · 0
27 de junio de 2011
3. 1 Introducci´on 3
1. Introducci´on
Por m´as de 3000 a˜nos los juegos de mesa se juegan por los seres humanos.
Ellos juegan el uno contra el otro, una de las maneras de divertirse y formar su
pensamiento estrat´egico.Uno de estos juegos es abalone. Fue inventado en 1987
por Laurent Levi y Lalet Michel. Abalone pertenece al grupo de los cl´asicos jue-
gos de mesa. Hoy en d´ıa es muy popular. Los torneos se celebran regularmente,
pero hasta ahora no hay muchas investigaciones realizadas en este juego.
Hoy en d´ıa los juegos de tablero son a´un famosos. La variedad de juegos
diferentes aumenta m´as y m´as y va desde los juegos de cartas y juegos con
dados de m´as extenso juego de sal´on que puede contener peones, azulejos, dados
y cartas. Para jugar estos es para divertirse en grande, pero tambi´en es una
competencia entre los jugadores. Una meta es desafiar a los oponentes y ganarles
por trabajo estrategias sofisticadas e inteligentes. A menudo, el juego contiene
los aspectos del azar, por ejemplo, tirar los dados o tomar una carta de una
baraja. Uno no puede prever exactamente lo que suceder´a. As´ı, el juego puede
ser m´as emocionante.
Una categor´ıa especial de juegos son los juegos cl´asicos, llamada placa. Estos
son juegos para dos jugadores en el que ambos jugadores tienen informaci´on
perfecta, es decir, no hay cartas ocultas o alguna informaci´on oculta a otros.
Otro aspecto importante es que no contienen ning´un tipo de acciones basadas
en la suerte. Por lo tanto, los jugadores tienen un control absoluto sobre sus
acciones. Sobre todo, el juego puede ser descrito en algunas frases. Las reglas
son simples. Sin embargo, el n´umero de diferentes movimientos posibles es alto,
lo que hace que el juego se vuelva complejo y un reto. Ejemplos famosos de estos
juegos son el ajedrez y Go y por supuesto el abalone.
4. 2 Abalone 4
2. Abalone
En esta secci´on el juego ser´a explicado en detalle. En primer lugar, se da
alguna informaci´on b´asica. Despu´es los posibles movimientos y luego en el juego,
situaciones especiales se discuten.
2.1. Conceptos b´asicos
El abalone es un juego de dos jugadores estrat´egico. El tablero de juego tiene
una forma hexagonal con 61 campos. Cada jugador tiene 14 canicas. Un jugador
tiene el rojo los, el otro las azules. Los dos jugadores tienen que moverse en las
curvas. El jugador rojo comienza el juego.
El objetivo del juego es para expulsar canicas del oponente en el juego bordo.
El jugador que primero expulsa 6 canicas del oponente gana el juego. Hay varias
formaciones de inicio de los m´armoles. Los dos m´as populares cu´ales son la
formaci´on est´andar que se propone por los inventores del juego. El segundo se
llama Daisy belga. Esta es una formaci´on de uso frecuente en torneos, porque
las posiciones son m´as bien ofensiva a principios del juego.
Estas dos formaciones se ilustran en las figuras de abajo.
(a) Standard (b) Belgian Daisy
Figura 1: Formaciones de inicio del abalone
2.2. Movimientos posibles
En cada turno el jugador puede mover uno, dos o tres canicas de su col-
or. M´ultiples canicas s´olo se puede mover si est´an adyacentes. Adem´as, todas
las canicas se deben mover en la misma direcci´on. Es posible mover en l´ınea
m´armoles, lo que significa que a lo largo de el eje de su posici´on actual (v´ease la
figura 2.3). Otra posibilidad es hacer un paso de costado, es decir, una decisi´on
que no a lo largo del eje de las canicas, pero hacia los lados (V´ease la figura
2.4).
5. 2.3 Jugadas Sumito y Situaciones Especiales 5
(a) L´ınea (b) Lado
Figura 2: Movimientos posibles
Independiente de si un movimiento en l´ınea o un movimiento de costado
se lleva a cabo el jugador s´olo puede mover los m´armoles un campo m´as. Un
movimiento que se sigue permitiendo incluso si una fila de canicas del mismo
color se divide por el movimiento.
S´olo se mueve si los campos de las canicas que se mueven est´an vac´ıas. El
movimiento en l´ınea es posible con una de las dos condiciones siguientes de
requisito: O bien el campo detr´as de la canica ´ultima est´a vac´ıa o el jugador es
capaz de realizar un movimiento Sumito. El movimiento Sumito es aquel en los
que las canicas del oponente son empujadas.
2.3. Jugadas Sumito y Situaciones Especiales
Un movimiento Sumitoes un movimiento en donde unas cuantas canicas del
oponente son impulsados por los m´armoles del propio jugador. Una situaci´on
Sumito se alcanza en caso de que hay una fila de canicas, donde en un lado s´olo
hay m´armoles negros y en otro lado hay m´armoles blancos. Entre los m´armoles
no debe haber una brecha. Si el n´umero de canicas de un jugador supera el
n´umero de la otra m´armoles jugador se encuentra en una situaci´on de Sumito.
Para determinar esta situaci´on para cada jugador a lo sumo tres canicas de
cada jugador se tienen en cuenta ya que un jugador no puede moverse m´as de
tres canicas por turno. En realidad, hay s´olo existen tres diferentes situaciones
Sumito:
√
dos canicas contra uno
√
tres bolas contra uno
√
tres canicas en contra de dos
En la figura 3 todas las posibles situaciones de Sumito se ilustran. El jugador
negro puede elegir uno de ellos moviendo una fila de sus canicas a la derecha.
6. 2.3 Jugadas Sumito y Situaciones Especiales 6
Figura 3: Situaciones Sumito
Otro t´ermino importante en el abalone es la situaci´on llamada Pac. En
esa situaci´on de ninguno de los jugadores es capaz de realizar un movimiento
Sumito, porque el n´umero de canicas del mismo color son iguales. Por lo tanto,
existen tres diferentes situaciones Pac:
√
una canica contra una
√
dos canicas en contra de dos
√
tres canicas contra tres
En la figura 4 algunas situaciones y pac-pac, como se ilustra:
Figura 4: Situaciones Pac
Los m´armoles en la parte superior del tablero se disponen en una situaci´on
pac simple de 2 contra 2. Los m´armoles en el centro se encuentran en una
situaci´on Pac tambi´en. Aunque hay 4 canicas negro contra 3 bolas blancas es
una situaci´on Pac. Esto se debe a que a un jugador se le permite mover 3 canicas
como m´aximo. Por lo tanto, es una situaci´on Pac de 3 en 3.
7. 2.3 Jugadas Sumito y Situaciones Especiales 7
La configuraci´on de canicas en el fondo hay situaci´on Sumito, porque no hay
no hay espacio libre detr´as del m´armol blanco. Para lograr el objetivo del juego,
se debe expulsar seis canicas del oponente fuera del tablero, el jugador tiene que
realizar un movimiento Sumito en una posici´on en donde el oponente est´a en el
borde del tablero de juego. Despu´es de este movimiento una de las canicas del
oponente se pierde.
Figura 5: Situaci´on de ataque, muestra un movimiento de expulsi´on
8. 3 Algoritmo de juego utilizado 8
3. Algoritmo de juego utilizado
Primeramente explicaremos la parte l´ogica de nuestro juego, como se real-
iz´o una divisi´on o abstracci´on de la parte l´ogica y la interfaz gr´afica el cual fue
realizado en GTK+.
3.1. Parte l´ogica de la soluci´on
B´asicamente se utiliz´o una matriz donde se representaban mediante carac-
teres las bolillas rojas(R) , azules(A), espacios vacios(O) y las posiciones inv´ali-
das( ); se realiza la carga de la matriz mediante un archivo de texto, con el cual
se puede elegir el inicio tipo Standard y tipo Belgian Daisy descrito anterior-
mente, una vez concretado esto lo que se realiza es buscar la manera de que se
cumplan los movimientos que se realizan en el abalone.
3.2. Movimiento de l´ınea
En esta parte del trabajo lo que realizamos es definir un inicio y un final,
con el cual acotabamos la zona de an´alisis, por lo tanto al tener un inicio o
sea alguna bolilla roja o azul(representado por “R” y “A” en nuestra matriz
respectivamente) y un destino(optamos siempre que el destino es un espacio
vac´ıo “O”) se podr´ıa analizar lo intentado y ejecutar o no tal movimiento. La
l´ogica utilizada se podr´ıa resumir en un lenguaje sencillo de la siguiente manera:
1. Capturo posici´on inicial, toda vez que sea“R” o “A”.
2. Capturo posici´on final o destino toda vez que sea un lugar vac´ıo “O”.
3. Llamo a la funci´on que analiza si se encuentra dentro de los l´ımites acept-
ables, es decir como m´aximo tres bolillas de un color con dos bolillas del
otro color, esto hace como m´aximo cinco posiciones incluyendo el destino.
4. Si se encuentra entre los l´ımites, obtengo la zona a analizar, aqu´ı cuento
la cantidad de rojos “R”, azules “A” y espacios vac´ıos “O” encontrados,
si los rojos y azules est´an todos adyacentes entre s´ı, si la cantidad de
espacios vac´ıos encontrados es cero y si la cantidad de la bolilla a querer
mover(condicionado por el turno del jugador sea rojo o azul) es mayor
ejecuto la jugada.
El algoritmo es algo sencillo, inicio, fin, analizador y ejecutor; el anal-
izador nos arroja un true o false de acuerdo a lo descrito y el ejecutor tan solo
actualiza la matriz logrando el objetivo, adem´as de esto el algoritmo utiliza un
tipo de orientaci´on, es decir hacia donde se debe analizar, definida por la zona
capturada, esta orientaci´on se da de seis formas, superior, inferior, derecho,
izquierdo, y las combinaciones de estas.
9. 3.3 Movimiento de lado 9
3.3. Movimiento de lado
Este caso es muy similar a lo descrito anteriormente, s´olo que aqu´ı nos vale-
mos de una se˜nal del entorno gr´afico de GTK+, primero ablaremos de la l´ogica,
b´asicamente el jugador se posiciona sobre una bolilla(origen) y utiliza el scroll
para seleccionar de izquierda a derecha con la cantidad de scroll dados se eje-
cuta un contador el cual tiene como l´ımite superior tres e inferior uno, con la
cantidad de scroll dados se da la secuencia de selecci´on 1-2-3-2-1-2-3-2-1, es de-
cir toda vez que el usuario se posicione sobre una bolilla y haga scroll ver´a que
las bolillas se seleccionan con esta secuencia; en el fondo de la l´ogica esto es un
movimiento simple(un origen y un destino), s´olo que al obtener la cantidad de
scroll dados se analiza la zona a querer mover sean espacios vacios, al hacer
scroll sobre la posicion de destino se verifica que el destino sea un espacio vac´ıo,
y las adyacencias de izquierda a derecha tambi´en, dadas por la cantidad que el
contador tiene. En resumen, se tiene:
1. Capturo inicio toda vez que sea una bolilla “R” o “A”
2. Cuento scroll dados por el usuario, con la secuencia indicada
3. Capturo destino toda vez que sea un espacio vac´ıo “O”
4. Analizo el origen y destino(movimiento simple) y las adyacencias(de izquier-
da a derecha) dadas por el valor del contador
5. Realizo o ignoro la jugada a querer realizar con lo devuelto por el item
anterior
El algoritmo es de vuelta muy sencillo, esta vez vali´endonos del GTK+ y las
se˜nales del scroll, se tiene inicio, cantidad de scroll, destino, analizador,
ejecutor, de vuelta analizador arroja un true o false aceptando o no la jugada
y ejecutor tan s´olo actualiza la matriz.
10. 4 Elaboraci´on del entorno gr´afico 10
4. Elaboraci´on del entorno gr´afico
El entorno gr´afico como se comento fu´e realizado en GTK+, es un caso men-
cionar que nos valimos de herramientas para la elaboraci´on de esta, comentando
y analizando entre el compa˜nero de grupo nos hicimos la siguiente pregunta, al
querer crear paginas web nos topamos con editores para ello(introducci´on a la
inform´atica), al crear una base de datos sencillo nos topamos con editores para
MySql(teor´ıa y aplicaci´on a la inform´atica I), y al querer realizar entornos gr´afi-
cos..Es por ello que un primer enfoque fue descargar tutoriales y ejemplos de
c´odigos en GTK+, el cual nos ayudo bastante para entender el funcionamento
del mismo, como maneja las se˜nales, los eventos, los empaquetamientos ,etc.
Pero al intentar realizar esto a gran escala se nos volvi´o algo tedioso escribir
tantas l´ıneas de c´odigo para ello, por lo tanto en el tiempo de investigaci´on
encontramos a GLADE, es un programa que permite crear, manipular, person-
alizar entornos gr´aficos en GTK+, de manera totalmente gr´afica, fue de bastante
ayuda para la elaboraci´on de todo el trabajo. As´ı que vale la pena recomendarlo
en su versi´on 2.12, pu´es las 3.x utilizan el lenguaje xml para su elaboraci´on si
bien es lo mismo porque s´olo se deben utilizar librer´ıas de glade para utilizar-
los, se escogi´o los 2.x en donde el c´odigo generado es totalmente en C, una vez
obtenido esto tan s´olo resta manejar las se˜nales y los eventos de manera ´optima.
4.1. Entorno gr´afico y l´ogica
Bueno una vez concretado la parte l´ogica del juego nos enfocamos al en-
torno gr´afico y c´omo “mezclar” de la mejor manera ambas, primero generamos
el tablero con gtk table atach, con el cual representamos una matriz de 21*11,
y a las posicones v´alidas del juego(bolillas rojas, azules y vacios), relacionamos
una caja de eventos, que saltan s´olo con los click y el scroll mencionado, para
llevar a cabo movimiento de linea y lado respectivamente, as´ı a cada caja de
eventos, relacionamos una posic´on de nuestra matriz, y cada se˜nal generada por
el usuario nos sirve para manipular nuestra matriz y utilizarla como material de
memoria, en realidad el GTK+ lo manejamos como un vector de 231 elemem-
tos, en el c´odigo se ver´a la funci´on mat2celda y la funci´on celda2mat que
realizan las conversiones de la matriz al vector de GTK+ y viceversa, adem´as
se encontrar´a la funci´on posici´on valida que arroja true o false si la posicion
es v´alida o no, es decir como se tienen s´olo 61 celdas v´alidas en el abalone, y
utilizamos una matriz de 21*11 que totalizan 231 elementos existe esta funci´on
que indica si tal posici´on es del abalone o una parte del entorno gr´afico con-
siderado como inv´alido, esto nos sirve para la carga de im´agenes, si es inv´alido
carga una imagen gris, si en tal posici´on se encuentra una “R”, se carga una
imagen que simula una bolilla roja, si en tal posici´on se encuentra una“A”, se
carga una imagen que simula una bolilla azul, y si se encuentra una “O”, se
carga una imagen que da la ilusi´on de una posici´on vac´ıa.
11. 4.2 Manejo de se˜nales y eventos 11
4.2. Manejo de se˜nales y eventos
Como se mencion´o, mediante la funcion posicion valida se relacion´o los 61
campos del abalone a una caja de eventos, si el usuario hace click sobre una de
estas posiciones, se genera una se˜nal que es atrapada y analizada para realizar
una jugada de l´ınea, si el usuario realiza scroll’s, estas se˜nales son atrapadas y
analizadas para llevar a cabo el movimiento de lado, con esto logramos separar
l´ogicamante las jugadas mencionadas para atacar al problema de la forma “di-
vide y vencer´as”, entonces se hace click en un campo que contiene la caja de even-
tos, luego esto es transformado a las coordenadas de la matriz(celda2mat) y se
analiza a la matriz con la l´ogica implementada, si existe algo favorable(jugada
aceptada, bolillas seleccionadas, etc) son enviados de vuelta a GTK+ mediante
la funci´on mat2celda, es decir estas funciones son el traductor entre GTK+ y
nuestra l´ogica ya sea para manipular la matriz o actualizar el GTK+.
4.3. Ilusi´on o que cosa
Ahora veremos como el usuario puede darse cuenta c´omo se seleccionan las
bolillas, al hacer un click sobre una bolilla, se realiza en el GTK+ un cambio de
imagen, que da la ilusi´on que est´a seleccionado, s´olo se cambia la imagen, esto
tambi´en se realiza cuando se realiza cualquier tipo movimiento, todo esto sin
dejar de lado a nuestro elemento de memoria, la matriz al encontrar una bolilla
rojo “R”, se cambia por una imagen verde para dar la ilusi´on de selecci´on, y a
la matriz se lo carga con “V” para recordar que esa bolilla est´a seleccionada, lo
mismo ocurre para deseleccionar.
12. 5 Inteligencia Artificial 12
5. Inteligencia Artificial
La inteligencia artificial que realizamos tiene tres niveles de complejidad,
easy, medium, hard, esto se describe a continuaci´on.
5.1. B´usqueda Monte Carlo
La idea general es simular un cierto n´umero de juegos a partir de la actual
situaci´on real sobre el tablero de juego. Para cada posible movimiento una serie
de juegos son simuladas y los resultados de cada uno de estos juegos son puntu-
ados. Despu´es de todas simulaciones terminadas, la inteligencia artificial toma
la decisi´on con el mayor puntuado ya que es probablemente el movimiento m´as
prometedor.
Para mayor comodidad en la b´usqueda de Monte-Carlo se explica[1] por
medio de seudo c´odigo.
1. Obtener todos los movimientos posibles en la situaci´on actual del juego
2. Para cada uno de estos movimientos:
Tomar el movimiento actual
Simulaci´on de una serie de juegos con la situaci´on real
Evaluar el resultado de cada juego simulado que acumulan ellos
3. Tome la decisi´on con el mayor valor para el juego normal los jugadores
que eligen al azar de un movimiento de todos los movimientos posibles se
utilizan en la b´usqueda simple de Monte-Carlo.
5.2. Implementaci´on de la IA
Con lo mencionado anteriormente se implementa la b´usqueda tipo monte-
carlo para que la IA realice su mejor jugada, lo que se hace es sencillamente se
punt´ua las bolillas de acuerdo a la distancia del centro del tablero del abalone,
as´ı mientras m´as alejado se est´a del mismo esta ser´a la jugada a realizar, pues
mientras se aleje del borde del tablero es m´as dif´ıcil hecharlo del tablero, una
vez hecho esto se da una puntuaci´on grande a una judada de empuje y una
mayor a´un a una jugada para hechar fuera del tablero, es decir, si se tiene una
situaci´on de ir al centro, empujar o hechar fuera del tablero, la l´ogica opta por
esta ultima, pu´es su objetivo principal es hechar toda vez que pueda las canicas
como primera opci´on. Esto se lleva a cabo con un archivo de texto en el cual
est´an puntuados radialmente del centro las bolillas, as´ı por cada jugada simula-
da se eval´ua las situaciones, se las punt´ua y despu´es de todas las simulaciones
se toma una decisi´on.
13. 6 Implementaci´on M´aquina versus M´aquina 13
6. Implementaci´on M´aquina versus M´aquina
El juego entre dos ordenadores se llev´o a cabo mediante las especificaciones
en xml dadas por los profesores, los parsers para llevar a cabo esto fueron inves-
tigados y luego implementados mediante tutoriales encontrados en la web, he
aqu´ı nuestra fuente de conocimiento el cual lo explicar´a mejor de lo que nosotros
lo har´ıamos, por favor pinche aqu´ı.
7. Puntos fuertes del algoritmo
La jugada de l´ınea la realiza una sola funci´on, lo mismo para la jugada de la-
do; una buena separaci´on entre los dos tipos de jugadas, un entorno gr´afico bien
estudiado y bastante amigable a nuestro criterio, con opciones de elecci´on del
tipo de tablero que desea jugar(standard, belgian), opciones de reinicio de juego,
opciones de elecci´on del tipo de juego(humano versus humano, humano versus
m´aquina y m´aquina versus m´aquina), adem´as una ayuda o help para ayudar a
entender el juego al usuario, como tambi´en los acerca de o about de los creadores
del juego, efectos de selecci´on y deselecci´on de las bolillas, opciones de nivel de
juego sea easy(f´acil), medium(medio) y hard(experto) en el tipo de jugada hu-
mano versus m´aquina, mensajes de advertencia al intentar cerrar las ventanas,
pantalla de bienvenida al juego abalone(splash), opciones muy amigable de se-
lecci´on de turno, carga de nombre de jugador, selecci´on del directorio donde se
guardar´an los archivos xml, en el tipo de juego m´aquina versus m´aquina, opci´on
de juego humano versus humano que es para una pr´actica del juego, as´ı como
se practica el ajedrez contra “uno mismo” esta opci´on est´a disponible en el
abalone.
8. Puntos d´ebiles del algoritmo
Una no muy buena implementaci´on del tipo de juego m´aquina versus m´aquina,
por falta de tiempo para una comprensi´on completa del xml(a profundidad),
funciona pero falta mejorar, es lo que se llama the first approx :).
14. 9 Dificultades principales encontradas en el desarrollo 14
9. Dificultades principales encontradas en el de-
sarrollo
La dificultad principal que encontramos entre miles de l´ıneas de c´odigo es que
al jugar el juego humano versus m´aquina de repente se mataba el programa; si,
de la nada explotaba, nos llev´o dos d´ıas encontrar el error, cuando las esperanzas
estaban por el piso un compa˜nero recordo las palabras sabias de un profesor,
“es importante utilizar fclose”, si es as´ı, por m´as que el sistema operativo se
encarga de cerrar ´estos una vez finalizado el programa, esto no ocurre en el
tiempo de ejecuci´on; el dolor de cabeza de d´ıas era porque se nos olvid´o cerrar
un archivo(el de puntuaci´on), de la nada y sin aviso previo el programa se
cerraba, y la soluci´on era s´olo eso un fclose, as´ı que gracias Carlos Cardozo.
Adem´as de esto hubo inconvenientes menores, como que se llegaba a un
punto en donde se deb´ıa cambiar gran parte de la estructura constru´ıda por no
encontrar una soluci´on, un cambio casi completo de la forma de cargar el tablero
abalone, utilizando los elementos de memoria auxiliar como el archivo de texto
con el cual se logr´o el estilo belgian y standard.
Y vale la pena mencionar que se nos facilit´o la realizaci´on del entorno gr´afico
utilizando el GLADE 2.12 el cual nos ahorr´o miles de l´ıneas de c´odigo, una
amigable interfaz, etc.
Referencias
[1] Master Thesis, Implementing a Computer Player for Abalone using Alpha-
Beta and Monte-Carlo Search, Pascal Chorus.
[2] Abalearn: Eficient Self-Play Learning of the game Abalone, Pedro Campos
and Thibault Langlois.
[3] Multi-Player Games: Algorithms and Approaches, Nathan Reed Sturte-
vant.
[4] Inteligencia Artificial, Un Enfoque Moderno, Stuart J. Russell y Peter
Norvig.
Ultima revisi´on 27 de junio de 2011