¡Vamos a jugar un juego de Meta tic-tac-toe!
Este es un torneo del rey de la colina de Meta tic-tac-toe. Las reglas de Meta tic-tac-toe son las siguientes:
Se aplican todas las reglas regulares de tic-tac-toe.
Hay nueve tableros dispuestos para hacer un tablero maestro. Al igual que:
0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8 ======================== 0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8 ======================== 0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8
el tablero 0 se refiere al tablero superior izquierdo, el tablero 1 se refiere al tablero medio superior ... así
0|1|2 ----- 3|4|5 ----- 6|7|8
Si digo tablero 3, mosaico 4, eso significa el mosaico central del tablero en el centro a la izquierda.
Solo puedes moverte en una de las tablas más pequeñas.
Si gana uno de los tableros más pequeños, ese tablero completo cuenta como su ficha.
Si uno de los tableros se llena antes de que cualquiera de los bots lo haya ganado, cuenta como una ficha de nadie.
¡Quien gane el tablero maestro gana!
Sin embargo, hay un giro importante. Digamos que voy en el tablero 7, mosaico 2. Eso significa que en tu turno, solo puedes ir en el tablero 2. Luego digamos que vas en el tablero 2, mosaico 5. Ahora en mi turno, solo puedo ir en el tablero 5. Digamos que el tablero 1 está lleno. (No quedan más lugares, o uno de nosotros ya ha ganado el tablero 1) Ahora si voy en el tablero 5, mosaico 1, puedes ir a cualquiera de los tableros que quieras.
Estas reglas pueden considerarse como:
- Debes jugar en el tablero correspondiente a la posición que jugó el jugador anterior.
- Si X juega en el tablero 2, ficha 5; O debes jugar en el tablero 5
- Si el tablero objetivo está lleno (empate) o ya tiene un vencedor, el siguiente movimiento no tiene restricciones.
- No se puede jugar con un tablero con un ganador , incluso en un movimiento sin restricciones.
Si esto es un poco confuso, puede probarlo en línea aquí. (asegúrese de cambiar de "las primeras fichas ganadas" a "3 fichas seguidas")
Ahora aquí están las reglas del desafío.
Debes escribir un bot que juegue este juego.
Bot 1 es Xs, y llega primero. Se llamará con estos argumentos de línea de comando (sin las cosas entre paréntesis):
X (whose turn) --------- (board 0) --------- (board 1) --------- (board 2) --------- (board 3) --------- (board 4) --------- (board 5) --------- (board 6) --------- (board 7) --------- (board 8) --------- (master board) xx (last move)
El primer personaje representa quién es el bot. En este caso, el bot 1 juega como X. Las siguientes 9 líneas se refieren a los 9 tableros. La undécima línea se refiere a la placa maestra. El "xx" es el último movimiento. Ahora, bot1 debe imprimir dos números entre 0 y 8. El número 1 es el tablero en el que se está moviendo su bot, y el número 2 es el mosaico en dicho tablero. El controlador realizará un seguimiento de este movimiento. Digamos que el bot 1 imprime 38. Ahora el tablero se verá así:
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | |
y bot2 se llamará con estos argumentos:
O --------- --------- --------- --------X --------- --------- --------- --------- --------- --------- 38
Ahora el bot 2 debe moverse en el tablero 8 (porque bot1 colocó una x en la casilla 3). Digamos que bot2 imprime 84. Ahora el tablero se ve así.
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || |O| ----- || ----- || ----- | | || | | || | |
ahora se llamará bot1 con estos argumentos:
X --------- --------- --------- --------X --------- --------- --------- --------- ----0---- --------- 84
Ahora bot1 debe moverse en el tablero 4. Sin embargo, bot1 es un pequeño bot travieso y decide moverse en el tablero 3. Imprime '30'. El tablero no cambia en absoluto. El bot maestro realiza un seguimiento de esto. Ahora se llamará a bot2 con estos argumentos:
O --------- --------- --------- --------X --------- --------- --------- --------- ----0---- --------- xx
Ahora el bot 2 puede ir a donde quiera (excepto 38 y 84, por supuesto). Esto continúa hasta que alguien gana 3 de los tableros maestros en una fila. Luego, hay un segundo enfrentamiento donde bot2 es X y llega primero.
Esto se repite hasta que cada robot haya jugado todos los demás bot.
Tanteo
La puntuación funciona así:
El ganador de cada partido obtiene 100 + number of open spots
puntos. De esa manera, es más valioso si su bot gana rápidamente. Cada vez que tu bot realiza un movimiento no válido, pierde 1 punto. Si después de 250 rondas, ninguno de los bots ha ganado, cada bot pierde 10 puntos y pasamos a la siguiente ronda.
Todo se colocará en un directorio que contiene
El controlador bot. Este es un programa C ++ que he escrito. Puede consultar el código fuente del bot del controlador aquí. Avíseme si ve algo que no está bien con el controlador.
Un archivo de texto llamado
instructions.txt
Este archivo se verá así:[Total number of bots that are competing] [bot1Name] [bot1 command to run] [bot2Name] [bot2 command to run] ...
Una carpeta para cada bot. Esta carpeta contendrá su programa (ya sea un script o un binario) y UN archivo de texto llamado
data.txt
que su bot puede leer y escribir lo que quiera.
Especificaciones técnicas y aclaraciones de reglas.
Cualquier bot que intente leer / escribir algo desde cualquier lugar que no esté dentro de su carpeta será expulsado del juego.
Su programa debe poder ejecutarse en un macbook con Yosemite. Los lenguajes actualmente compatibles son python (2.7.9 y 3.4.2), C / C ++, Objective-C, perl, ruby, bash, PHP, Java, C #, javascript y Haskell. Hay muchos más, pero estos son solo los que puedo pensar en este momento. Agregaré más a medida que pase el tiempo. Si desea competir en un idioma específico, envíeme un mensaje o comentario, y lo agregaré a la lista si es posible.
Si se gana un tablero, pero todavía hay espacio, aún no puede moverse a uno de los espacios abiertos.
Tenga en cuenta que el directorio de trabajo de su envío será el directorio que contiene el controlador y todos los demás bots, NO el directorio que contiene su bot.
Publique junto con el código de bot del controlador el comando correcto para compilar (si corresponde) y ejecutar su bot. La mayor parte de esto se hará desde el terminal OS X, que es bastante similar a un terminal de Linux.
Los bots deben completarse en menos de un segundo. Desafortunadamente, no soy lo suficientemente competente como para agregar un temporizador al bot del controlador. Sin embargo, cronometraré manualmente los bots.
Resultados!
Bueno, estaba en lo cierto. Olvidé hacer que el bot del controlador verifique si el masterBoard está lleno. Si el masterBoard está lleno, CADA movimiento no es válido, pero continúa llamando a los bots, lo que probablemente es la razón por la que hubo tantos movimientos no válidos. Lo tengo arreglado ahora. Aquí están los resultados oficiales con la versión más actual de todos los bots.
Bot 1, goodRandBot, has 1 wins and made 0 illegal moves, for a total of 133 points.
Bot 2, naiveBot, has 3 wins and made 48 illegal moves, for a total of 361 points.
Bot 3, depthBot, has 5 wins and made 0 illegal moves, for a total of 664 points.
Bot 4, middleBot, has 1 wins and made 20 illegal moves, for a total of 114 points.
With 4 bots, This program took 477.471 seconds to finish.
¡Prof Bot es el campeón reinante! Al menos, por ahora.
XXX000---
transmite el ganador de un tablero que se transmite? ¿O es que 'nadie lo consigue a pesar de que O lo haya ganado primero'?