Implementación del juego Bantumi

Anuncio
INTELIGENCIA DE REDES DE COMUNICACIONES
IMPLEMENTACIÓN JUEGO BANTUMI
Rosa Delgado Romero De Ávila
100063936
Sergio Rodríguez Sánchez
100032837
Álvaro D. Serrano Díaz
100032958
[email protected]
[email protected]
[email protected]
ABSTRACTO
En este documento se describe como se ha
realizado el diseño del juego Kalah, “Bantumi”
en su versión reducida, y la implementada
concretamente por nosotros. Se describe
principalmente cual ha sido la estrategia
seguida para su implementación. Se trata de
un juego Determinista basada en una
Estrategia MINIMAX.
1. INTRODUCCIÓN
1.1 NOMBRE DEL JUEGO
El nombre inglés estaba relacionado con algo
así como Conde y Captura. Esto se refiere al
hecho que no hay ningún factor de posibilidad
en el juego. La estrategia de
jugador es
dependiente de la capacidad de decidir y
contar. Ganar está basado en la capacidad de
un jugador de reclamar o capturar las fichas
del opositor.
Culturas islámicas llaman el juego según la
acción física que ocurre durante el juego. Así,
el nombre que le dan es “Mancala” que es una
palabra árabe que en inglés se traduce como
“para moverse" o “para trasladarse". [1]
Dependiendo de donde se juegue a Kalah
(Bantumi), y según la cultura en la cual esto
echó raíces, se han dado lugar a muchos y
muy diferentes nombres para referirnos a
“Bantumi”. Estos nombres se refieren al juego,
al tipo de tablero de juego usado, o a las fichas
usadas. [1]
El nombre del juego original es Mancala. Aquí
se populariza gracias a una adaptación que
hizo la empresa finlandesa Nokia con el
nombre de Bantumi, para uno de sus modelos
de móvil, el 3310. [1]
En realidad, Mancala es el nombre que reciben
un conjunto de juegos de mesa, también
llamados juegos de contar y capturar (count
and capture) o juegos de sembrar fichas
(sowing games). Aunque los orígenes de estos
juegos no están muy claros, todo apunta a que
se originaron en lo que ahora es Etiopía
alrededor de los Siglos VI y VII de nuestra era.
Existen numerosas variantes que difieren sobre
todo en las reglas del juego. Aun así, guardan
toda una serie de características comunes. [1]
Figura 1: Bantumi Tradicional Africano
En ciertos dialectos de África occidental, los
cuencos en el tablero de juego, se mencionan
como wari o awari que significa "casas" en
inglés. Por lo tanto, algunas culturas llaman al
juego “Wari”.
A menudo, las fichas que se usan en el juego
son guijarros, pelotas de marfil, monedas, etc.
En esto caso se conoce este juego como Adi en
Nigeria debido a que las fichas son las fichas
de la planta Adi.
2. KALAH (BANTUMI)
El tablero del juego tiene varios botes o casillas
dispuestos en dos o cuatro filas (tanto el
número de botes como el de las filas dependen
de las variantes). Las piezas del juego, que
reciben el nombre de fichas (seeds) o judías
(beans), se depositan en dichos botes. El
movimiento más clásico del juego es el de
siembra (sowing) o arrastre que consiste en
tomar las fichas de uno de los botes (en la
mayoría de las variantes se pueden tomar las
judías de la fila más próxima al propio jugador)
e irlas depositando una a una en los botes
contiguos en sentido antihorario. Cuando se
terminan los botes de la fila propia del jugador,
se continúa con la del adversario. El objetivo
final del juego depende de la variante aunque
en casi todos los casos consiste en capturar
más fichas que el oponente.
El juego por lo general tiene dos jugadores (el
Norte y Sur, por ejemplo), un tablero de juego
con dos filas de seis botes y dos botes
principales
contadores
llamados
Kalah
(Bantumi)s, y 60 fichas. El tablero de juego es
colocado entre los dos jugadores. Cada uno de
los jugadores toma 30 fichas y pone cinco de
ellas en cada uno de los seis botes sobre su
lado del tablero de juego. El análisis será
realizado
principalmente
sobre
Kalah
(Bantumi) (1, m) y Kalah (Bantumi) (n, 1).
2.1 DISPOSICIÓN INCIAL DEL TABLERO
DE JUEGO
1.2 BREVE INTRODUCCION A KALAH
(BANTUMI)
Kalah (Bantumi) es una variante moderna,
comercial del Mancala, que fue introducido y
puesto a disposición del público en los años 50
por una firma de la Empresa Kalah (Bantumi)
Animosa. En 1960, se creó la primera versión
automatizada del juego y muchas más
versiones tras éstas. Bell (1968) ya usó Kalah
(Bantumi) para demostrar que un juego podía
ser jugado por un ordenador, y Slagle y Dixon
(1970) usó Kalah (Bantumi) para ilustrar sus
algoritmos de búsqueda M y N. Hoy día, Kalah
(Bantumi) suele ser como un juego de ejemplo
en la informática.
1.3 DISTRIBUCIÓN
JUEGO
COMERCIAL
DEL
Bantumi fue diseñado a partir de "Mancala"
que provino en África, hace miles de años. Una
de sus variantes la creó Nokia y por ello se
hizo bastante famoso entre juegos distribuidos
comercialmente en terminales móviles. La
versión usada por Nokia tiene cuatro fichas en
cada cuenco cuando se inicia el juego. El
objetivo del juego es mover las fichas de los
cuencos en el fondo de la pantalla en su
cuenco a la derecha.
Figura 2: Tablero Virtual Bantumi
2.2 REGLAS
1. El objetivo será recoger el mayor número de
puntos posibles en el bote central derecho para
ganar el juego, este será tu bote principal.
2. Tus botes serán los 6 de la parte inferior de
la pantalla. Las fichas indican el número de
puntos que hay en cada bote.
3. El jugador puede comenzar su movimiento
desde cualquier bote no vacío de su lado del
tablero de juego. El
jugador no puede
comenzar su movimiento usando los botes del
lado del opositor del tablero de juego. Pinche
en el bote deseado y las fichas se repartirán en
los botes consecutivos en el sentido contrario
a las agujas del reloj.
4. Si las fichas terminan de repartirse en tu
bote principal obtendrás otro turno extra.
5. Al repartir las fichas se depositaran en todos
los botes menos en el bote principal del
oponente.
6. Si acabas en uno de los botes vacíos,
capturaras las fichas del bote opuesto del
oponente.
7. Si una ficha aterriza en el bote principal de
dicho jugador, su contador suma 1 y él
conserva el derecho de seguir jugando.
8. Si la última ficha no termina en el bote
principal de dicho jugador, el jugador pierde
su turno.
9. Las fichas que son capturadas o las que han
entrado en los botes de ambos jugadores, no
entran de nuevo en el juego. El valor principal
de este juego, depende de la configuración de
las fichas activas o las fichas que no son
capturadas.
10. Ganara el juego aquel jugador que obtenga
mayor número de puntos en su bote principal.
2.3 Inteligencia Del Juego
A la hora de diseñar un juego como éste, hay
que tener muy presente los problemas de
búsqueda donde interviene al menos un
adversario, es decir, los movimientos del
jugador por sí solos no aseguran la victoria, es
necesaria una estrategia de oposición, en
nuestro juego, jugamos contra el ordenador, el
cual tiene su propia estrategia de oposición. En
nuestro juego, no existe un temporizador que
controle el tiempo disponible de cada
movimiento, por lo tanto podría servir la fuerza
bruta. Esto sería una posible mejora a
implementar.
Este juego es claramente DETERMINISTA, ya
que no interviene el azar.
La Estrategia seguida es Mini-Max. Esta
estrategia consiste en elegir el mejor
movimiento
para
uno
mismo
(MAX)
suponiendo que el adversario (MIN) escogerá
el mejor para sí mismo (que también juega a
ganar). Los pasos a seguir serán: General el
árbol de juego, alternando movimientos de
MAX y MIN, y asignándole valores (pesos)
apropiados según la estrategia de juego que se
desee aplicar. En segundo lugar se debería de
calcular la función de utilidad de cada nodo
final, recorriendo recursivamente los nodos
hasta el estado inicial. Y por último, elegir
como
jugada
a
realizar
aquel primer
movimiento que conduce al nodo final con
mayor función de utilidad. [2]
La estrategia del juego, ha sido implementada
mediante una estructura en árbol con un nodo
raíz. De cada nodo salen 6 hijos, que
representan los 6 posibles movimientos en
cada partida, y así sucesivamente. Según se
baja de nivel en profundidad en el árbol.
Se han definido 3 niveles de complejidad en el
juego:
•
•
•
Fácil
Normal
Difícil
Figura 3: Seleccionar Nivel Dificultad
Para ello se utiliza un árbol de decisión de la
siguiente manera, dependiendo del nivel de
complejidad que se selecciona en cada partida:
Figura 4: Árbol de Decisión
FÁCIL: Solo se tiene en cuenta la situación
actual, es decir, un solo nivel del árbol con las
6 posibles jugadas.
Se mira por tanto el
primer nodo.
NORMAL: En este nivel, se tienen en cuenta,
tanto nuestra posible jugada, como las posibles
jugadas en la jugada siguiente de nuestro
contrincante en respuesta a nuestra jugada. Se
mira el segundo nodo.
DIFICIL: En este último posible nivel de
juego, se tiene en cuenta hasta el cuarto nivel
del árbol (quedando sin utilizar por tanto el
tercero). Esto quiere decir, que se procesa
nuestra posible jugada, las posibles jugadas
del contrincante en respuesta a la nuestra, y
los 2 posibles jugadas (nuestra y del rival)
siguientes a nuestra jugada más la respuesta
del rival. Se mira, por tanto, hasta el cuarto
nodo.
mayoría de juegos, generar el árbol completo
es inviable en recursos de memoria). La
solución: no examinar todos los estados. En
nuestro juego, al definir los 3 niveles de
complejidad, en el peor de los casos, el “nivel
difícil” tendrá 6^4 estados, es decir, 1296
estados a examinar. En el nivel fácil,
únicamente 6 estados a examinar y en el nivel
normal, 36 estados.
2.4 Los
Resultados
Movimiento
Algunas notas
resultados de
siguientes:
Š
Si caes en el bote principal, sumas cinco
Š
Si caes en un bote vacío, sumas 1 de la
ficha que metes y además sumas el
número de fichas que comas
Š
También sumamos un punto cada vez
que pasamos por el bote principal y
metemos un punto
Estos pesos se aplicarían igualmente al
humano pero todos ellos con signos negativos
un
en relación a los posibles
los movimientos son las
La casa o el Kalah -movimiento- Si la
última ficha aterriza en su bote, el
jugador podrá jugar otra ronda de
nuevo.
Š
La captura - Si la última ficha aterriza
en un bote vacío sobre el lado del
jugador en tablero de juego, se añade a
su total y cualquier ficha en el bote del
contrario se añade también. En este
caso, finalizará la ronda de este
jugador.
Š
La Captura Nula - Si la última ficha
jugada acaba en un bote vacío sobre el
lado del jugador y el bote del opositor
que esta justamente en frente es
también vacío. En este caso, la última
ficha todavía permanecerá en el
Bantumi del jugador, y se finaliza esta
ronda.
Š
Si la última ficha cae en otra parte, la
jugada acaba directamente.
Š
Final de Partida – Hay tres posibles
finalizaciones del juego:
o
El problema de la estrategia MINIMAX es el
número de estados del juego es exponencial al
número de movimientos (esto es, en la
de
Š
Cada nivel del árbol se basa en una iteración
más de nuestra simulación, es decir,
se empezará simulando el movimiento del
ordenador,
después
juega
el
humano,
ordenador y por ultimo el humano otra vez.
Los pesos para evaluar el mejor movimiento
son los siguientes:
Posibles
Ganar: Obtiene mas fichas en tu
bote principal que el oponente.
En la figura 5 se puede ver la
imagen del tablero cuando se
gana al ordenador.
2.5 Observaciones
Algunas observaciones adicionales respecto a
la inteligencia del juego implementado son las
siguientes:
Y El valor del juego disminuye en cada
vuelta en la que cualquiera de los dos
jugadores consigue acertar.
Figura 5: Ganas Partida
o
Empatar:
Ambos
jugadores
obtienen el mismo número de
fichas en sus botes principales.
En la figura 6 se puede ver la
imagen del tablero cuando se
empata con el ordenador.
Figura 6: Empatas Partida
o
Perder: El contrincante obtiene
mayor puntuación que el jugador
en su bote principal. En la figura
7 se puede ver la imagen del
tablero cuando se pierde contra
el ordenador.
Figura 7: Pierdes Partida
Y El contador del jugador se incrementa
en al menos 1 para cada captura que él
hace.
Prueba:
La regla define que el jugador puede
conseguir capturar la ficha del opositor
o fichas frente al bote de la última ficha
conseguida, si la última ficha aterriza en
un bote vacío sobre su lado. Hay
básicamente dos partes en esta prueba
para
los
casos
que
han
sido
investigados. Los casos que serán
investigados son Kalah (Bantumi) (1,
m) y Kalah (Bantumi) (n, 1). Para
ambos los casos, estas dos partes de la
prueba se aplican:
Suponemos que la última ficha del
jugador aterriza en un bote vacío sobre
su lado:
a) El bote del opositor que está
frente al bote donde han caído
las últimas fichas del jugador,
está también vacío.
En este caso, el jugador será
capaz de capturar su propia
ficha. Esto demuestra que si este
caso sucede, el
jugador será
capaz de capturar una ficha. Así,
la observación es válida.
b) El bote del opositor que está
frente al bote donde han caído
las últimas fichas del jugador
contienen al menos una ficha.
En este caso, el
jugador
consigue capturar una ficha (yo
= 1) y la ficha del opositor (la j ³
1) m = el número de fichas
capturadas = i+j ³ 1+1 ³ 1 Así,
la observación sería válida.
Y Para concluir cada captura que un
jugador hace aumentará el contador del
jugador por al menos 1.
(Bantumi), o un movimiento de
las fichas que están más
cercanas a su Kalah (Bantumi).
e) Movimiento
Arbitrario
–
Define cualquier otro movimiento
distinto
a
las
intenciones
descritas de los anteriores.
2.6 Objetivo Del Juego
Y En el caso de juego normal, si el
jugador 1 moviendo fichas, terminará
en su casa, él llevaría a cabo al menos
otra jugada. De esta manera, él podría
optimizar sus posibilidades de ganar
llevando a cabo al menos otro
movimiento de forma estratégica.
Hay cinco tipos de movimientos que
un jugador puede hacer:
a) Movimiento Captura - Este es
un movimiento para capturar al
menos por sí mismo (1 ficha) si
el bote del opositor frente al
bote
del
jugador
donde
aterrizaron sus últimas ficha
estaba vacío.
Si el bote del opositor no
estuviera vacío, el
jugador
podrá capturar al menos 2
fichas.
b) Movimiento Defensa - Este es
un movimiento para prevenir
una captura de una ficha que
corra riesgos en el movimiento
inmediato
que
el
opositor
pudiera hacer.
c) Refleje el movimiento del
opositor
Este
es
un
movimiento donde el
jugador
imita los movimientos hechos
por su opositor.
d) El movimiento para irse a
casa – Este es un movimiento
donde la última ficha del
jugador aterriza en su Kalah
Ganará el jugador con el número más alto de
fichas en su Bantumi/Cuenco/Bote Principal.
2.7 Variaciones
1. Por lo general, el juego comienza con 4
fichas en cada cuenco, pero también son
posibles otras cantidades (2, 3, 5, 6). Nuestro
caso, está implementado con 5 fichas iniciales.
2. Lo normal es que el juego tenga dos
jugadores, pero hay variantes que permiten a
uno o tres jugadores es para jugar el juego.
En nuestro caso, tenemos 2 jugadores, aunque
unos de ellos es el propio ordenador.
3. La Captura de Flujo - Esto consiste en la
captura de las fichas (fichas) de algunos botes
(cuencos) durante tu jugada en curso. De estar
permitido, tanto el jugador como el opositor
podrán usar dicha técnica. La captura de flujo
puede capturar fichas (fichas) sólo en tu propio
territorio.
3. IMPLEMENTACIÓN
3.1 Interfaz gráfica
La implementación de esta aplicación se ha
realizado utilizando el lenguaje javascript. La
interfaz está compuesta por una tabla de 3
filas por 6 columnas en la cual se han
integrado las imágenes correspondientes a los
instantes iniciales del juego así como un fondo
para el juego.
Los puntos correspondientes a cada bote del
tablero estarán almacenados en una posición
del array tabla_real.
Mientras la CPU posea el turno de juego se
repetirá este proceso.
En la parte superior derecha del tablero hay 3
botones para seleccionar la dificultad del juego.
Cuando clickeamos sobre ellos, se ejecuta el
método cambiarNivel que cambia el valor de la
variable nivel (0 = fácil, 1 = normal, 2 = difícil)
que se usará en el programa.
3.3 Métodos auxiliares
Para la realización
implementado
los
auxiliares:
o
También existe un botón en la parte inferior
izquierda para comenzar una nueva partida. Al
pulsar este botón se llamará al método
nuevaPartida, que reseteará las imágenes y los
puntos de la tabla Para_real para comenzar de
nuevo la partida.
3.2 Comienzo del juego
Para empezar a ejecutar el juego basta con
que el jugador haga click sobre cualquiera de
sus botes, lo que llama al método jugar
pasándole como parámetro la posición de la
tabla seleccionada para el movimiento. Este
método consta de dos partes:
-
Realiza el movimiento del jugador:
En primer lugar se comprueba si la casilla
seleccionada está vacía, en cuyo caso se pedirá
al jugador que seleccione otra. A continuación
se realiza la modificación de las puntuaciones
en la tabla_real siguiendo las reglas del juego.
Por último se comprueba a quién corresponde
el siguiente turno y la finalización de la partida.
-
Realiza el movimiento de la CPU:
Se simularán (método simular) los cuatro
siguientes movimientos del juego de la misma
forma que se realizan los movimientos del
jugador. Durante la simulación la aplicación irá
rellenando todos los nodos del árbol de
decisión. Posteriormente y en función del nivel
de dificultad seleccionado, que corresponde a
la profundidad que tendremos en cuenta en el
árbol de decisión, se realizará el movimiento
de la CPU correspondiente a la celda con
mayor peso (mejor movimiento posible).
del juego
siguientes
se han
métodos
actualizar(destino,valor)
Busca la imagen destino y la actualiza con la
imagen correspondiente al nuevo valor de la
celda.
o
cambiarPanel(resultado)
Al finalizar la partida se modifica el fondo del
tablero en función del resultado obtenido en la
partida (ganar, perder o empatar).
o
cambiarNivel(nuevoNivel)
Actualiza
la
imagen
correspondiente
a
nuevoNivel, cambiando su color de relleno para
indicar cual es el nivel seleccionado.
o
comprobarFinPartida()
Comprueba si los botes, tanto del jugador
como de la CPU, están vacíos y en caso de que
esto ocurra se llama a cambiarPanel.
o
mover(posicion)
Realiza
el
movimiento
de
la
casilla
correspondiente a posición siguiendo las
reglas.
o
copiarTabla(origen,destino)
Copia los valores de la tabla origen en una
nueva tabla destino.
o
mover_virtual(posicion,tabla)
Método similar a mover pero sin consecuencias
sobre la tabla_real, actua sobre tabla
árbol de decisiones. Disponemos de
cuatro tablas de este tipo, cada una se
corresponde a un nivel de profundidad
en el árbol.
(tabla_virtual). Se utiliza para hallar los pesos
durante la simulación de los movimientos de
CPU.
o
simular()
Genera el árbol de decisiones que se usa para
la elección del movimiento óptimo de juego,
para
ello
hace
referencia
al
método
mover_virtual().
o
o
pesos: Array que almacena los pesos
correspondientes al movimiento de cada
una de las casillas. Disponemos de
cuatro tablas de pesos, cada una se
corresponde a un nivel de profundidad
en el árbol.
o
maximo: Almacena el valor de peso
máximo obtenido después de la
simulación del árbol de decisiones.
o
indice: Indica la casilla seleccionada
para el movimiento tras la decisión del
maximo peso.
jugar(posicion)
Método principal de nuestra aplicación que se
encarga de realizar el movimiento tanto del
jugador como de la CPU.
o
nuevaPartida()
Inicializa todas las variables del juego para
comenzar una nueva partida.
4. CONCLUSIONES
3.4 Variables
Las variables usadas por la aplicación han sido
las siguientes:
o
turno_jugador: Almacena el siguiente
turno de juego. Valor true corresponde
al jugador y false a la CPU.
o
turno_jugador_virtual:
Similar a
turno_jugador pero usada durante la
simulación del árbol de decisión.
o
fin_partida:
Indica
si
se
ha
alcanzado el final de la partida con valor
true.
o
nivel: Indica el nivel de juego
actualmente
seleccionado
por
el
jugador. Se inicializa a nivel fácil (cero).
o
tabla_real: Array que almacena los
puntos correspondientes a cada bote
del tablero.
o
tabla_virtual: Similar a tabla_real,
pero utilizado durante la simulación del
Tras el diseño e implementación de un juego
determinista como es el Bantumi, y siguiendo
una estrategia MIN-MAX, como se ha descrito
en apartados anteriores, el principal aspecto
sobre el que merece la pena extraer
conclusiones es sobre el uso de arbole de
decisión para su implementación.
Una de las principales conclusiones a las que
se puede llegar durante la implementación de
un juego como éste, es que los árboles de
decisión demuestran ser un método muy
efectivo en ésta y otro tipo de prácticas. Dan
claridad a los problemas y a las opciones que
pueden ser cambiadas, permiten analizar
completamente
todas
las
posibles
consecuencias de las decisiones que se tomen
en cada jugada durante la partida, en función
del nivel de dificultad seleccionado para jugar.
Aunque no haya sido utilizado aquí, también
pueden ofrecer un marco de trabajo que nos
ayude a cuantificar los valores de los
resultados y las probabilidades de alcanzarlos.
En la implementación de juegos, ayudan a
hacer las mejores decisiones de acuerdo a la
información existente, y básicamente podrían
ser usados en conjunto junto con el sentido
común.
6. REFERENCIAS
5. AGRADECIMIENTOS
A Julio Villena, profesor de Inteligencia en
Redes de Comunicaciones. El lo ha hecho un
poco más fácil.
[1] Wee Ee Ching, Academic Supervisor Associate Proffesor
Tay Tiong Seng. Analysis of Kalah. Department of
Mathematics National University of Singapore 2000-2001.
[2] Julio Villena 2007. Apuntes Inteligencia Redes de
Comunicaciones, Tema Resolución de Problemas, curso
2007-2008.
Descargar