1 jul 2015

Descarga y Manual de uso de TerrariaServer GUI


TerrariaServerGUI es una interfaz gráfica basada en Java que permitirá a los usuarios (principalmente a aquellos que jueguen a Terraria y/o monten servidores público y/o privados del juego) gestionar de forma fácil e intuitiva su propio servidor. Esta herramienta, no solo permite realizar las tareas más comunes de gestión, sino que además permite programar mensajes automáticos, ejecutar comandos "in game" e incluso publicar online el estado del servidor. Estad atentos, muy pronto estará disponible la descarga gratuíta de la misma así como la funcionalidad que traerá consigo y como utilizarlo.

ES COMPATIBLE CON LA VERSIÓN 1.3.0.2 (1/7/2015)

Pending:
Dejo pendiente la actualización de la aplicación para que incluya soporte para las nuevas opciones de configuración, como la dificultad experto, el uso de Steam y otras cosas que aún debo comprobar. En cualquier caso, he probado a ver si generaba los nuevos mundos (OJO! No son compatibles con versiones anteriores de Terraria!) y en principio todo funciona bien. Tambien tengo que darle una revisión al código para ver si puedo agregar nuevas funciones o mejorar algo.

Change Log:
v1.0.1.1:
-Ahora, al programar el apagado del servidor, se muestran mensajes cada minuto cuando quedan 5 (es decir, aparecerá el aviso a los 5, 4, 3, 2 y 1 minutos). Antes solo se mostraban cuando quedaban 5 y 1.
-Añadidos dos nuevos comandos "In Game": /setTimer y /timer, para poder configurar y activar el temporizador de auto-apagado (ver detalles en sección 5.6).
v1.0.1.0:
-Incluída versión .exe que permite ejecutar con privilegios de administrador.
-Corregido un bug en el analizador de mensajes que hacía que al escribir en la consola say, kick, ban u otros comandos finalizase inesperadamente.
-Corregido problema con las rutas de worldsBackup, que en ciertos casos impedía iniciar el servidor y no mostraba código de error.
-Eliminadas las tildes de los mensajes del temporizador de auto-apagado, ya que el juego no interpreta bien esos caracteres.
-Añadida comprobación automática y manual de actualizaciones con posibilidad de descargarla directamente del repositorio.
v1.0.0.3:
-Añadida internacionalización (español e inglés).
-Ahora los baneos se guardan en un fichero externo junto al .jar.
-Corregidos los mensajes de aviso de cierre del servidor que no mostraban el tiempo correcto.
-Ahora se permite establecer como tiempo mínimo 1 minuto para el temporizador.
-Añadido al javascript la posibilidad de mostrar la versión del servidor.



Manual de Usuario:

CONSEJO: Usa Control+F para buscar la entrada del índice.


Índice:


1. Introducción
2. Requisitos
3. Descargas
4. Instalación y ejecución:
    4.1. Solución de problemas: no puedo ejecutar el .jar
5. Funcionalidad:
    5.1. Configurar el servidor. Uso de las herramientas de testeo.
    5.2. Mensajes del día (M.O.T.D.)
    5.3. Iniciar/Finalizar el servidor
    5.4. Gestionar a los jugadores (expulsar y banear)
    5.5. Ejecutar comandos manualmente en el servidor
    5.6. Ejecutar comandos "In Game" (desde el chat del juego)
    5.7. Programar la emisión de mensajes publicitarios
    5.8. Programar auto-apagado del servidor
    5.9. Programar auto-generación del Javascript
6. Tareas avanzadas (usando Dropbox):
    6.1. Publicar el estado del servidor en una página web (ejemplos HTML y JS)
    6.2. Compartir el host de un servidor entre varios usuarios
7. Problemas conocidos y soluciones propuestas


1. Introducción

TerrariaServerGUI es mi aplicación Java más reciente. Tiene como objetivo facilitar, a los jugadores de Terraria, el poder montar y publicar sus propios servidores del juego, así como también gestionarlos de una manera fácil, rápida y accesible gracias a la interfaz gráfica que lo implementa. También los provee de nuevas funcionalidades que de serie no traen: como la posibilidad de cerrarlos en un tiempo límite o la publicación automática de mensajes publicitarios.

Estas son solo algunas pinceladas de su potencia y te invito a que pruebes de forma gratuita esta sencilla herramienta.


2. Requisitos

Debes disponer de los siguientes elementos para que todo funcione correctamente:
-S.O. Windows (el servidor solo funciona en este)
-Librerias .NET Framework y XNA (incluídas con Terraria, las usa el servidor)
-Java Runtime Environment (JRE) actualizado (requisito para que funcione la interfaz)
-Conexión a internet (si se desea que el servidor sea público)

Los enlaces a las librerías y la aplicación los encontraréis en la sección "Descargas" de esta entrada.


3. Descargas

Puedes conseguir todas las librerías y material necesario de los siguientes enlaces. Descarga solo aquello que necesites o de lo que tengas dudas de si lo tienes o no instalado.

Op. A: TerrariaServerGUI (exe)https://drive.google.com/file/d/0B3BQx7qHw1SadENJel83QkhTNUU
Op. B: TerrariaServerGUI (jar)https://dl.dropboxusercontent.com/.../TerrariaServerGUI.jar
TerrariaServer - http://www.terraria.org/index2.html
J.R.E. de Java - http://www.java.com/es/download/
.NET Framework 4 - http://www.microsoft.com/es-es/download/details.aspx?id=17851
XNA 4 Redistributable - http://www.microsoft.com/en-us/download/details.aspx?id=20914

Como mínimo te será necesario tener las JRE actualizadas y el ejecutable TerrariaServer.exe que se incluye con el juego y que será indispensable para poder gestionar tus servidores de juego mediante la interfaz.

NOTA: se ha añadido la versión ejecutable (.exe) de TerrariaServerGUI. Si tienes problemas al ejecutar los .jar, puedes optar por descargar la versión .exe. Esta versión siempre será la misma que la de los .jar, pero tiene como finalidad facilitar la labor de ejecución y corregir problemas que surjen al lanzar el jar en ciertos PCs.

4. Instalación y ejecución

TerrariaServerGUI esta creada en Java, por tanto no requiere mas que descargar la aplicación y ejecutarla haciendo doble click sobre el fichero .jar. Es necesario tener Java instalado en la máquina para que funcione.

El resultado será una ventana como la siguiente:


4.1. Solución de problemas: no puedo ejecutar el .jar
A menudo, instalamos ciertas aplicaciones que sobreescriben el programa con el que ejecutamos ciertas extensiones de archivos. Los ficheros .JAR son archivos comprimidos, como el RAR o el ZIP y al instalar estos descompresores, es posible que los JAR tambien se comporten como archivos comprimidos al hacer doble click sobre ellos.

Para que al hacer doble click sobre la interfaz, esta no se abra como comprimido, sino como una aplicación ejecutable, debemos configurar nuestro S.O. para tal efecto.

Para ello:
-Hacemos click derecho sobre TerrariaServerGUI.jar
-Pinchamos sobre Propiedades.
-En la sección "Abrir con:" pinchamos sobre el botón "Cambiar".
-Buscamos la localización "C:\Program Files\Java\jre7\bin\" (tanto 32 como 64bits)
-Seleccionamos el programa "javaw.exe".
-Marcamos la casilla de "Abrir siempre con ese programa".
-Aceptamos todo.

El icono cambiará al de la taza de café de Java. Si ahora le hacemos doble click, debería salir la interfaz del programa, como se mostró en la imagen anterior.

Como alternativa puedes descargar TerrariaServerGUI.exe, que además proporciona la posibilidad de ejecutar con derechos de administrador (útil si el servidor esta guardado en carpetas externas al Home).

5. Funcionalidad:

5.1. Configurar el servidor. Uso de las herramientas de testeo.
La configuración del servidor debe realizarse antes de iniciarlo desde la pestaña Configuración.


Podrán verse distintas opciones, todas ellas son las mismas que se pueden utilizar al iniciar TerrariaServer.exe, con la salvedad de que no es necesario ejecutar comandos o escribir ningún fichero, tu eliges que datos añadir!

Los campos de la izquierda permited escoger la ruta del ejecutable TerrariaServer.exe, sin él, el programa no puede crear servidores. También puedes personalizar el MOTD manualmente o de forma automática (ver sección 5.2 sobre los M.O.T.Ds). El resto de campos son, por ahora, predefinidos y usan rutas relativas. Esto significa que la carpeta "worlds" (por ejemplo) estará en el mismo directorio donde se ejecute TerrariaServerGUI.jar. Lo he hecho así para poder usar el sistema de compartición de host vía dropbox.
La carpeta de "worldsBackup" tiene lugar en tu carpeta personal "C:\Users\<tu_usuario>". Cuando ejecutes el servidor, los mundos se crearán y actualizarán en dicha carpeta, y cuando lo finalices, serán movidos a la carpeta "worlds". Esto evita que si se ejecuta dentro de una carpeta compartida en dropbox, actualice continuamente los datos en la red, aumentando el lag a los jugadores.

Cada vez que modifiques los datos, deberás pinchar en "Guardar", sino no te dejará iniciar el servidor.

Si no estas seguro de si tu partida será visible al resto de jugadores, en el menú "Herramientas" dispones de 2 tests. El primero de permite ver tu IP pública (la que es visible desde internet). La otra te permite probar un puerto o lista de puertos.


Simplemente, haz una lista separada por comas con el nº de puerto a probar y presiona Enter. El programa irá una a una viendo si es o no visible desde el exterior de tu red local. Si te sale un mensaje de OK, entonces puedes usar ese puerto en la pestaña de "Configuración" para montar tu servidor público.

NOTA: si al ejecutar el servidor recibes una excepción en la consola de que no se ha podido iniciar porque el socket está ocupado, cierra el programa y vuelve a ejecutarlo. Hay veces que sucede si por alguna razón, al chequeo no se le da cierto margen de tiempo para que cierre los sockets de los puertos y se lanza el servidor muy seguido. Tened cuidado con eso!


5.2. Mensajes del día (M.O.T.D.)
Los mensajes del día o MOTD son frases muy sencillas, generalmente graciosas o de bienvenida a los nuevos jugadores. Aparece cuando uno se acaba de conectar a la partida. Puedes configurarlos de 3 formas:
-Sin hacer nada: por defecto aparecerá "Server powered by <tu>".
-Manualmente: editando el cuadro de texto de la pestaña "Configuración".
-Aleatoriamente: se escoge la frase de forma aleatoria de un fichero.

Para el modo aleatorio, crea un archivo de texto junto al fichero "TerrariaServerGUI.jar" llamado "motds.txt" (ver ejemplo):


Sabrás que esta bien colocado si cada vez que inicias el programa (que no el servidor) aparece en el cuadro de MOTD una frase diferente.


5.3. Iniciar/Finalizar el servidor
Para iniciar el servidor, en la pestaña inicial "Servidor" dispones de un apartado dedicado al arranque y finalización del servidor. 



Solo se permite una instancia del servidor, por esa razón cuando pinches sobre "Iniciar" la opción se deshabilitará y se activarán el resto. 
Para finalizarlo, pincha sobre "exit-nosave" o "exit". Como ya os habréis dado cuenta aquellos más duchos en el tema, los botones tienen el mismo nombre que el comando al que hacen referencia. De esta forma, exit-nosave finaliza el server sin guardar el mundo y exit, lo finaliza guardándolo. También, si queréis guardarlo durante la partida, pinchad sobre "save". Cualquier resultado se mostrará sobre la consola de salida.


5.4. Gestionar a los jugadores (expulsar y banear)
La gestión de los jugadores se realiza desde un listado en la pestaña "Servidor".


Dicho listado divide entre los jugadores actualmente jugando y los que han sido baneados (en rojo). Al banear, el programa apunta el nombre del jugador y su IP de conexión, de forma que no pueda entrar con ese mismo personaje (ni nadie con su mismo nombre) ni tampoco con la misma IP. No evita del todo que la gente con malas intenciones acabe entrando, pero al menos se ponen la mayor cantidad de traba posibles con tal de mejorar la experiencia de juego al resto. Por supuesto, podréis kickear (echar) a un usuario sin banearlo del todo.

NOTA: la lista de baneados se limpia al cerrar la aplicación. En un futuro quizás haga que sea permanente, según si la gente lo solicita o no.


5.5. Ejecutar comandos manualmente en el servidor
La ejecución de comandos manuales se realiza desde el cuadro de texto "Input" de la pestaña "Servidor". Simplemente escribe tu comando y pulsa Enter o el botón Enviar. Se mostrará en la consola el resultado de tu orden.


5.6. Ejecutar comandos "In Game" (desde el chat del juego)
Esta es posiblemente una de las innovaciones que he agregado al juego de forma indirecta. Ahora podemos ejecutar los comandos más tipicos (de cambio de horario, baneo y kickeo) simplemente escribiéndolo en el chat del juego. Para ello, durante la partida presiona enter y escribe "/comando parametros":


Al presionar Enter para enviar el mensaje, el programa analizará el comando y lo ejecutará solo si estas conectado desde la ip 127.0.0.1 (un mecanismo de seguridad que impide que cualquier otro que no sea el host envie comandos). Ten cuidado de no banearte a ti mismo! xD

Comandos disponibles:
/kick <personaje>
/ban <personaje>
/unban <personaje>
/dusk
/noon
/midnight
/dawn
/settle
/setTimer <minutos>
/timer (start|stop)


5.7. Programar la emisión de mensajes publicitarios
Al igual que en otros juegos, he añadido la posibilidad de que el servidor mande un mensaje cada cierto tiempo. Esto se puede configurar antes de iniciar el servidor desde la pestaña "Avanzado".


Para ello, habilita los mensajes del servidor, escribe el mensaje que quieres que envíe a todos los jugadores conectados y el tiempo entre mensajes, que va desde 15 minutos hasta 2 horas. Cuando inicies el servidor, tras pasar los X minutos que hayas escogido se mostrará un mensaje del servidor con el contenido que hayas puesto. Es una buena forma de publicitar webs, usuarios o lo que sea!


5.8. Programar auto-apagado del servidor
Esta opción de la pestaña "Avanzado" solo esta disponible cuando el servidor está online.


Una vez lanzado, puedes programar el auto-apagado del mismo. El tiempo lo eliges tu (en minutos) y cuanto más se aproxime el momento de cierre, más a menudo aparecerá el mensaje de que el servidor finalizará en X tiempo. Cuando el contador llegue a 0, el servidor guardará el mundo y se cerrará. El programa segurá abierto.


5.9. Programar auto-generación del Javascript
Otra funcionalidad añadida al programa es la posibilidad de generar un sencillo código javascript que permita a los host publicar su servidor en una web. La generación de este código se configura antes de lanzar el servidor en la pestaña "Avanzado".


Simplemente, habilita la opción, escoge la ruta donde se guardará el código (por defecto es en la misma donde esta el fichero TerrariaServerGUI.jar) e introduce cada cuantos minutos quieres que se actualice el código. Básicamente, lo que hará el programa será recuperar la información actual del servidor, generar un archivo y guardarlo. En la sección 6.1, se explica el mismo ejemplo que he creado para este blog, que como veréis, arriba a la derecha he añadido un widget donde se muestra el estado del servidor.


6. Tareas avanzadas (usando Dropbox)

6.1. Publicar el estado del servidor en una página web (ejemplos HTML y JS)
La publicación del estado del servidor en mi blog la realizado usando la función javascript que me genera TerrariaServerGUI (ver sección 5.9), un código html muy sencillo que he creado y dropbox.

Para ello, he configurado TerrariaServerGUI para que guarde el javascript en la carpeta compartida de dropbox, de forma que siempre que se actualice sea accesible desde internet . La carpeta en cuestión esta en https://www.dropbox.com/sh/g9i4y14akb2m9de/5SkkoTApbE. En ese enlace se muestra el javascript "statusServer.js". 

Lo que he hecho ha sido copiar el siguiente código HTML https://dl.dropboxusercontent.com/u/62477074/HTML.txt a la zona de mi web donde me interesaba, que para mi caso era crear un nuevo widget de tipo HTML/Javascript y simplemente escribir los datos que quería que se mostrasen (es decir, pegar el código anterior).

NOTA: el código HTML tiene en la primera línea una ruta web donde se indica donde buscar el código Javascript. La ruta que se muestra es la de mi propio Javascript, por lo que deberéis sustituirla por la vuestra (la ruta se puede obtener haciendo click derecho sobre el fichero statusServer.js y pinchando sobre la opción "Compartir enlace a dropbox").

Si deseas realizar tu propio código HTML, a continuación están las funciones Javascript así como el tipo de dato que devuelven y para que sirven:

String getHostName(): devuelve el nombre de la persona que hace de host (su username de Windows).
String getServerVersion(): devuelve la versión del servidor. Si no coincide con la de los clientes, no podrán conectarse.
String getServerIP(): devuelve la IP pública del servidor.
String getServerPort(): devuelve el puerto de conexión al servidor.
String getTimeOnline(): devuelve el tiempo que lleva online el servidor.
String getWorldName(): devuelve el nombre del mundo.
Integer getMaxPlayers(): devuelve la cantidad máxima de jugadores permitidos.
Integer getNumberOfPlayers(): devuelve el nº de jugadores actualmente jugando.
Boolean hasPassword(): devuelve si el servidor tiene contraseña (no la publica) o no.
Boolean isOnline(): devuelve si el servidor esta online o no.
Boolean isSecured(): devuelve si tiene seguro anti-trampas o no.
List_of_Objetcs getPlayersList(): devuelve la lista de jugadores actualmente jugando.

Ante cualquier duda o ayuda que necesitéis sobre el código HTML o Javascript, no dudéis en consultármelas ;)


6.2. Compartir el host de un servidor entre varios usuarios
Este mecanismo es el que actualmente utilizo junto a mis amigos para en caso de que uno no pueda hostear, el resto pueda seguir jugando al mismo mundo compartido. Para ello, es necesario que todos aquellos que vayan a hacer de host, instalen dropbox y compartan la misma carpeta. Recomiendo seguir la siguiente estructura de archivos en esa carpeta:

Una vez compartida esa carpeta y que todos la hayan sincronizado (véase el tick verde junto a cada fichero), basta con ejecutar el .jar y configurar el programa para que use el mismo nombre del mundo (si se llama world1, todos deben configurarlo para que cargue el world1, para ello basta con editar el cuadro de texto del nombre en la pestaña de "Configuración").

El programa además evitará que dos usuarios ejecuten a la vez el servidor, dando un aviso al segundo indicando que el otro ya lo está ejecutando y proporcionándoles los datos de acceso (si tiene pass, deberá pedírsela).

NOTA: si por algún casual el host cierra de forma abrupta el servidor (por ejemplo se le apaga el PC de golpe sin posibilidad de cerrar manualmente el servidor), notaréis que se ha creado un fichero en la misma carpeta llamada online.txt. Borradla o no os dejará ejecutar el servidor!


7. Problemas conocidos y soluciones propuestas

Esta sección queda reservada para cualquier problema que surja con el programa. Si tiene solución (o incluso si no la tiene), será publicada aquí. Recomiendo mirar los posibles problemas que existan antes de postearlas.

Problema al iniciar el servidor: no arranca tras configurar la ruta de TerrariaServer.exe
Se ha comprobado (gracias a $|_!D3R) que al configurar la ruta de TerrariaServer.exe en la pestaña de Configuración, el .jar no consigue arrancarlo, y no se muestra mensaje de error ni nada.

También puede deberse, según he comprobado, a los privilegios con que se ejecuta el programa. Si usas Vista o Win7, recomiendo descargar la versión .exe y ejecutarla con Privilegios de Administración (click derecho y la opción con el escudo de windows). Esto solo es necesario en una carpeta de solo lectura.

Opción A: Una solución consiste en ejecutar el .jar desde una ventana de consola CMD, usando el comando "java -jar TerrariaServerGUI.jar", que por lo visto no le afecta igual el nombre de las rutas.

Solución: La versión 1.0.1.0 ejecutable (.exe) soluciona cualquier problema que pudiese dar el programa al iniciar el servidor, y si lo diese, ejecutar este con los máximos privilegios.


Problema al cerrar el servidor que no guarda el mundo (desaparece)
Esto sucede cuando se ejecuta TerrariaServerGUI desde una ruta en la que no tiene derechos de escritura. El servidor lo inicia correctamente, genera el mundo y permite conectarte, pero al cerrar, simplemente el mundo no puedo copiarlo y desaparece en el olvido.

Solución A: dar derechos de escritura sobre la carpeta donde esta TerrariaServerGUI, para ello haced click derecho sobre la carpeta y eliminar el tick de la opción Solo Lectura.

Solución B: descargar la versión ejecutable .exe, click derecho sobre la aplicación y "Ejecutar como administrador".


El servidor kickea a usuarios por "spam projectile"
Este bug no es cosa de TerrariaServerGUI (en la consola se muestra la razón). En los foros de TerrariaOnline (oficial) se han reportado casos en los que esto sucede. La razón viene causada por el sistema anti-trampas que implementa el servidor, y que llega a expulsar a los usuarios por razones como usar un arma automática con munición que genera muchos sprites (minishark+crystal bullets).

Pueden evitarse esta clase de kickeos desactivando el sistema anti-trampas, aunque en ciertas ocasiones sigue originándose. Así que hasta que Re-Logic mencione nada, recomiendo no usar esas combinaciones de armas-munición durante las sesiones online.

23 oct 2014

Cambios en los servidores

Recientemente he recibido un aviso de Wuala indicando que para finales de año todas las cuentas free dejarán de tener soporte, lo que viene a traducirse como que serán eliminadas junto a todos los archivos que contengan.

Dicho ésto, simplemente comentar que actualmente ando revisando aquellos posts más importantes con el fin de resubir los archivos a otros servicios de hosting. Si alguien se da cuenta de que algún archivo no se puede descargar correctamente o bien encuentra un enlace a Multiupload (si, aún es posible que aparezca algún enlace que no debería a ese servidor) que me lo haga saber mediante un comentario (da igual si es anónimo o no) en la entrada que corresponda para que lo modifique/resuba cuanto antes.

Sobretodo me interesa arreglar lo del tema de Multiupload, que parece ser que cuando lo tumbaron los enlaces comenzaron a redirigir a webs de anuncios y mierdas similares que no llevaban al fichero de descarga (obviamente, como que ya no existen). No descaraguéis desde cualquier enlace en el que aparezca dicho servidor u otro de Descarga Directa similar al que no dé soporte (actualmente solo trabajo con Dropbox y Google Drive).

Repito lo dicho, si alguien nota algún enlace de ese tipo o a Wuala que esté caído, que me lo haga saber mediante un comentario ;)




Saludos y gracias.

1 oct 2014

AI MasterMind [Python]

Tras mucho tiempo sin publicar nada nuevo, traigo de mi propia mano un nuevo proyecto donde poder practicar vuestras dotes de programación en Python, así como poner a prueba algoritmos de inteligencia artificial aplicados al famoso juego de MasterMind.

Para el que no lo conozca, MasterMind es un pequeño y sencillo juego de mesa que consiste en tratar de adivinar, en el menor número de pasos (a ser posible), una contraseña codificada por colores.


Tablero de MasterMind (la contraseña se oculta en la parte inferior).


En lugar de limitarme a implementar el juego, he tomado como base la idea general del juego y la he llevado más allá, dando la posibilidad de incrementar el tamaño de las contraseñas e incluso añadiendo un modo multijugador.

Mi idea no es que los jugadores humanos jueguen MasterMind en sí, sino que jueguen a desarrollar algoritmos más o menos complejos y los pongan a prueba contra otros algoritmos creados por otras personas. Una buena forma de mejorar las dotes de optimización y uso de estructuras de datos básicas, así como de aprender o refrescar los conocimientos en Python.

El juego difiere ligeramente del modelo original. A continuación podréis ver la lista de características que trae consigo:
  1. Capacidad para 1 o más jugadores IA.
  2. Configuración del tamaño de contraseña (nº de dígitos)
  3. Configuración del rango de valores que pueden tomar los dígitos.
  4. Dos modos de juego: Equilibrado y Aleatorio.
  5. Monitoreo y almacenamiento de estadísticas de los jugadores.
  6. Control de tiempos de ejecución, intentos y victorias.
  7. Posibilidad de realizar N partidas consecutivas. 


El juego está compuesto por los siguientes ficheros:

Lista de ficheros del proyecto.

main.py: código fuente principal del juego. Posee todas las funciones de configuración del mismo (tamaño de las contraseñas, configuración de los jugadores, modos de juego, etc) además de ser el encargado de dibujar en pantalla la interfaz.

Incluye los siguientes controles de teclado para manipular parte de la ejecución del juego sin tener que editar algunas variables:
  • Q: finaliza la aplicación.
  • R: resetea las estadísticas y reinicia el juego (como si acabase de iniciarse).
  • S: inicia la partida y se para cuando alguien gana.
  • A: igual que el anterior, pero finaliza cuando se ejecutan N partidas.
  • C: cambiar entre modo de juego Equilibrado y Aleatorio.
  • D: cambiar entre modo de visualización ASCII y Entero (solo la salida por pantalla).

Para agregar nuevos jugadores o eliminar otros tantos, primero hay que importar el fichero correspondiente a la IA (import ai_player_N) y luego agregarlos como en las siguientes líneas:

Código fuente de main.py: añadiendo nuevos jugadores.


aimastermind.py: incluye la clase AiMasterMind, que se encarga de implementar las reglas de juego así como funciones para mostrar las estadísticas de los jugadores y la partida. Es el núcleo mismo del juego.


ai_player_N.py: códigos fuente que implementan las IAs de cada jugador. Es necesario implementar tantos ficheros como jugadores quieran jugar, y luego añadirlos a la lista de jugadores en main.py como se ha mostrado previamente. Incluyen dos métodos a implementar:
  • generarSolucion(pass_len, digit_size): éste método es ejecutado cuando el gestor de juego solicita que el jugador i (el que posea el turno) dé una posible solución. El método debe retornar obligatoriamente un vector de tamaño pass_len con valores enteros cuyo máximo valor puede ser digit_size.
  • recibirRespuesta(respuesta, finalizado): éste método es invocado justo después de ser ejecutado el anterior y se encarga de recibir y capturar el vector de respuesta del gestor de juego. También permitirá a las IAs saber cuando ha finalizado una partida, que en ese caso, respuesta será una lista vacía y finalizado tomará el valor True. El vector de respuesta tiene el siguiente formato:

    [ 0 , 1 , 2 , 2 , 0 ]

    Su longitud es del mismo tamaño que el de la contraseña e indica, para cada dígito d, si la solución propuesta ha acertado, fallado o bien es erronea.

    Veámos ésto con un ejemplo:

    Supongamos que tenemos una contraseña como la siguiente: [1,2,4,1,5] y que nuestro algoritmo ha propuesto la solución [1,1,3,5,1]. El resultado que recibiríamos sería [0,1,2,1,2], donde 0 significa acierto, 1 es un semifallo (no hemos acertado pero el dígito está en otra posición) y 2 es un fallo completo (no existe ese dígito o bien hemos superado la cantidad existente en la solución, en el anterior ejemplo el tercer 1 de nuestra solución es un fallo de nivel 2 porque en la contraseña solo existen dos unos y el primero ya era un semifallo).

Resources: carpeta que contiene todos los recursos gráficos externos usados por el juego.


debug.bat: ejecutable por lotes usado para debuggear el programa y sus errores. Úsalo para probar tus algoritmos.


launcher.bat: ejecutable por lotes que lanza el juego y monitorea la ejecución almacenando los errores en un fichero error.log y las salidas del programa en game.log. Si se desean almacenar las estadísticas de las partidas realizadas, usad éste ejecutable.


El aspecto de la interfaz es como el mostado en la siguiente captura:

Interfaz AiMasterMind con 4 IAs en modo Equilibrado.

En cuanto a los modos de juego existen por el momento solo dos:

  • EQUILIBRADO: modo de juego pensado para probar los algoritmos bajo las mismas circustancias de juego. Se genera una contraseña común a todos los jugadores, de forma que el algoritmo que logre descubrirla en un menor número de intentos gana. El orden de rotación parte del jugador 1 hasta el último.
  • ALEATORIO: similar al anterior, con la salvedad de que cada jugador tiene una contraseña diferente para descubrir (eso si, del mismo tamaño y con la misma variedad de dígitos). El orden de rotación se escoge aleatoriamente antes de comenzar la partida, reseteándose en cada juego. Aquella IA que descubra su contraseña en menos intentos gana el juego.

Como se puede apreciar, al lado de los nombres de cada jugador hay un número entre paréntesis. Dicho valor es una estimación de la posición actual respecto al resto de jugadores, y viene dado según el % descubierto de su contraseña.



Puedes descargar el proyecto y comenzar a jugar contra tus amigos o alumnos del siguiente enlace en dropbox:


Es necesario tener instalado en el equipo Python 2.7.8 y las librerías PyGame 1.9.1.

Cualquier duda puedes comentármela o bien por correo electrónico o bien en la sección de comentarios de ésta entrada.


Ejemplo de simulación de enfrentamiento entre 7 IAs:



Para ese enfrentamiento se han usado contraseñas de longitud 1000, donde cada dígito puede tomar hasta 288 valores diferentes. El resultado final tras 100 partidas consecutivas fué una aplastante victoria de mi algoritmo BIS (Búsqueda Inteligente Selectiva), la cuál utiliza un sistema similar al divide y vencerás en otros algoritmos pero aplicado a éste problema.




Saludos.