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 100063936@alumnos.uc3m.es 100032837@alumnos.uc3m.es 100032958@alumnos.uc3m.es 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.