Escriba un programa en su idioma elegido que juegue un juego perfecto de tic-tac-toe en un tablero de 3 * 3 contra un jugador humano. Sin embargo, cada movimiento debe ser un programa diferente , generado a partir de la iteración anterior.
Depende de usted cómo y de qué forma evalúa el aporte humano, pero debe leerse a partir del aporte estándar. Del mismo modo, puede elegir un método para determinar qué jugador comienza (por ejemplo, pregunta primero, o permite que el humano ingrese un movimiento no válido para indicar que la computadora se inicia u otras ideas).
No es necesario validar movimientos, puedes asumir que eres un oponente humano que juega con justicia.
Básicamente, tiene un programa que corresponde a un estado del tablero. El estado se imprime de cualquier manera reconocible, pero al menos se espera el siguiente nivel de detalle:
X..
00X
x..
Después de que el jugador humano ingresó sus movimientos, su programa tiene que generar la siguiente iteración de sí mismo como un archivo fuente en el mismo idioma (ya sea a la salida estándar o a un archivo) y finalizar. No está permitido almacenar información en ningún otro lugar fuera de ese archivo fuente. (no es necesario que su programa compile y ejecute el programa generado, puede hacerlo el usuario; sin embargo, no está prohibido). Cuando el programa generado se construye y ejecuta, se comportará de manera similar, mostrará el estado, esperará la entrada del usuario, etc.
Al final del juego, debes imprimir el resultado (ya sea que hayas ganado o sea un empate) de una manera inequívocamente identificable.
Por juego perfecto quiero decir que el programa no debe perder, y si existe la posibilidad de forzar una victoria, debería ganar.
El código más corto gana , el ganador se selecciona al menos 10 días después de la primera entrada válida.
Obtiene una reducción del 10% en la puntuación si su programa puede manejar la construcción y el lanzamiento de su próxima iteración. (Lo sé, lo más probable es que no valga la pena). Por supuesto, el programa en sí debe estar terminado para cuando la próxima iteración acepte los movimientos del usuario.
Si usa algunos trucos extraños y poco comunes, publique una breve explicación con su código.
Respuestas:
Perl, 933 caracteres
Tenga en cuenta que la línea en blanco en el medio de la secuencia de comandos realmente debe estar allí. (Los saltos de línea al final de las líneas largas no son obligatorios, excepto para la legibilidad, y no se incluyen en el recuento de caracteres).
Uso: cuando el programa se ejecuta sin argumentos, muestra el estado actual del juego. Como al principio el tablero está vacío, la salida será:
Ejecute el programa con un argumento entre 1 y 9 para reclamar esa casilla como su movimiento. El programa hará su propio movimiento y luego generará un script de reemplazo con el nuevo estado. Así, por ejemplo:
Solo en el primer turno, puede hacer un movimiento
0
para indicar que la computadora debe hacer el primer movimiento. Tenga en cuenta que el primer jugador siempre seráX
.Cuando termine el juego, la salida de la pantalla incluirá una nota a tal efecto:
El programa funciona haciendo una búsqueda estándar de minimax del árbol del juego. (Tic-tac-toe es un juego lo suficientemente pequeño como para generar un árbol de juego completo en cada carrera). La excepción a esto es cuando la computadora se mueve primero, en este caso el movimiento inicial a la esquina superior izquierda es difícil. codificado
Tenga en cuenta que este programa funciona a la manera de una quine adecuada: en ningún momento el script accede a su propio archivo fuente para producir su salida.
fuente