¡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.
fuente
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'?Respuestas:
Python 2.7, profundidad
Una implementación de poda alfa-beta sin nada demasiado elegante. Intenta ordenar movimientos de una manera menos ingenua para maximizar las eliminaciones alfa-beta. Probablemente intentaré acelerarlo, pero sinceramente, no sé qué tan competitivo puede ser Python si se trata de una cuestión de velocidad.
Para ejecutarlo, simplemente puede hacerlo
python Depth.py <input>
, aunque sugeriría usarlopypy
ya que lo acelera notablemente.Además, no sé qué tan rápido es su sistema, pero puede modificar el primer argumento al
DepthPlayer
final para que sea más alto si aún puede ejecutarse en el tiempo especificado (en mi sistema completó casi todas las cosas muy rápidamente con una profundidad de 7 u 8, pero hubo algunos casos que estaban cerca o por encima de un segundo, así que lo configuré en 6 para que sea seguro).fuente
sys.argv
no devuelve una cadena separada de nueva línea. Da una lista de cadenas en este formato:['Depth.py', 'X', '---------', '---------', ...]
lo arreglé editando las dos últimas líneas para estocommand = '\n'.join(sys.argv[1:]) print DepthPlayer(6).run(command)
, espero que no te importe.Java, ingenuo
Si es posible, gana. De lo contrario, evita que un oponente gane.
fuente
Naive.class
en un directorio nombradonaiveBot
dentro del directorio principal.java Naive <args>
comando, suponiendo que las variables de entorno incluyan el puntero aC:\Program Files\Java\jdk1.8.0\bin
. Espero que esto ayude.java -classpath naiveBot Naive
;)legalAnywhere
es cierto, su envío falla porque intenta usar tableros que ya ha ganado un jugador.Python 2, MiddleBot
A MiddleBot le gusta el medio. Antes de que se gane el juego central (4), intentará agarrar el cuadrado central de tantos juegos como sea posible, forzando al oponente a regresar al juego del medio una y otra vez.
Una vez hecho esto, intenta ganar cualquier juego que pueda, o simplemente llena el primer espacio disponible si no (creo que es necesario trabajar en su juego tardío)
Para ejecutarlo,
python MiddleBot.py <input>
parece que felizmente corre menos de un segundo para mí, así que espero que también lo haga para tifuente
También podría tirar mi propio bot en la mezcla.
python 2, goodRandomBot
A este bot no le importa dónde se mueve, siempre que sea un movimiento válido. Selecciona aleatoriamente todos los movimientos válidos y realiza un promedio de
0
movimientos no válidos.fuente