Inspirado por este reciente artículo que habla de un programador francés que escribió un programa de ajedrez de 487 bytes de 2 jugadores (humano contra humano) en la Asamblea, me pregunté qué tan pequeños podrían ser los programas de ajedrez en otros idiomas.
Detalles
- El programa solo debe aceptar movimientos de ajedrez legales.
- La declaración de verificación / jaque mate no es necesaria (solo deseable), aunque la primera regla se aplica en casos de verificación.
- Según el artículo, el enroque no es una implementación necesaria.
- Además, no tiene que implementar en passant.
- Sin embargo, debe permitir la promoción de peones al alcanzar el octavo rango (puede optar por forzar simplemente la conversión a reina).
- Depende de usted cómo se muestra la placa: terminal ASCII, GUI, etc.
- Debes mostrar de quién es el turno.
Las reglas del ajedrez se pueden encontrar aquí : ignore las reglas específicas del torneo (por ejemplo, el tiempo, el tacto), y recuerde que el enroque y al pasar no son implementaciones necesarias.
a1 h8
mover una torre en diagonal a la esquina opuesta, saltando sobre los peonesRespuestas:
C,
650600Para reducir el código para inicializar el tablero, la pantalla tiene reproducción en blanco (mayúscula) de izquierda a derecha y reproducción en negro (minúscula) de derecha a izquierda. La entrada tiene la forma de dos números decimales de 2 dígitos (posición inicial y posición final), dando el archivo (0-7) y el rango (0-7). Para obtener un poco de código adicional (reste 11 de cada entrada), la entrada se podría hacer para cumplir con http://en.wikipedia.org/wiki/ICCF_numeric_notation (dígitos 1-8)
Aquí hay una captura de pantalla de muestra donde Black acaba de avanzar su Peón de Torre. Las blancas intentan varios movimientos ilegales con su reina, antes de finalmente capturar el peón. Los indicadores de giro son
a
para negro yA
para blanco.Una característica interesante de mi validación es el uso del cuadrado de la distancia euclidiana. Para el caballero esto siempre es 1 ^ 2 + 2 ^ 2 = 5, pero también lo uso para el Rey y el peón.
La prueba de verificación se realiza haciendo una copia de seguridad del tablero, realizando el movimiento de los jugadores y escaneando los 64 movimientos posibles del oponente.
El programa tiene que terminar con Ctrl-C. No puedo pensar en una forma más graciosa de hacerlo, aparte de hacer un movimiento especial para finalizar el programa. Un juego de ajedrez en realidad termina cuando un jugador no puede moverse en su turno (jaque mate o estancamiento) y eso requiere muchas pruebas que no son requeridas por la especificación.
Código comentado
fuente
s,f
necesita inicializarse? Los espacios en los cuadrados vacíos son excelentes.s
fue una transferencia de una etapa anterior. Lo he quitado ahora.e=y*y+x*x=f-s-u*y=f/u-s/u;
.=
que parezca la única interpretación. En cuanto ae=y*y+x*(x=..
que soy un poco cauteloso con la orden de ejecución ya que recibí la respuesta incorrecta de un argumento modificado dentro de unaprintf
declaración, pero en este caso parece funcionar bien en GCC / Cygwin. Esperaré más cambios antes de incluirlo en el código. Una cosa que aún falta es un cheque para números fuera del rango 0..77 (que no veo como lo requiere la especificación, pero de todos modos ...)t^=32
tot^=w
ya[95],b[95]
toa[z],b[z]
. El código es sorprendentemente legible. ¡Probablemente por los comentarios detallados!Python 3,
11661071993 bytesSolo me di cuenta de que necesitaba evitar que los reyes se movieran a la cuenta después de haber terminado, pero aquí está mi presentación de todos modos
Para jugar, ingresa cuatro números delimitados por espacios, siendo los primeros 2 las coordenadas de la pieza que deseas mover y los 2 últimos donde quieres que se mueva.
fuente
a=o*8;j=[list(s) for s in ["RNBKQBNR","P"*8,a,a,a,a,"p"*8,"rnbkqbnr"]]
.spilt()
divide por defecto en espacios en blanco, por lo que puede usar eninput().split()
lugar deinput().split(" ")
2and
,1or
etc.)False
puede ser0!=0
.False
puede ser0
,not 0
debería funcionar bien ...Perdón por el retraso.
El programa se llama ChesSkelet. Actualmente utiliza 352 bytes tanto para código como para datos. Está escrito en Z80 Assembly, y particularmente para ZX Xpectrum.
Si no tiene ganas de compilarlo y cargarlo en un emulador, puede jugar en línea en el sitio ChesSkelet ( http://chesskelet.x10host.com ).
El programa es bastante simple, un gran bucle donde: - alternativamente (1) las entradas blancas se mueven o (2) las negras ejecutan su micro AI para moverse. - El tablero se actualiza en la pantalla. De nuevo, hay una gran guía que describe el programa y las técnicas en el sitio web.
fuente
> <> , 1467 bytes
Bueno, no rompe el récord de 487 bytes ...
¡Pruébalo en el parque de peces ! (Utiliza un par de errores en ese intérprete, por lo que no puedo prometer que funcionará en ningún otro lugar. Probablemente querrás ejecutarlo a la velocidad máxima; puede tomar más de un minuto hacer un movimiento).
Cuando ejecute el código, se imprimirá
Las letras mayúsculas representan el blanco, las minúsculas representan el negro. Luego puede dar su movimiento como entrada en el formulario
[a-h][1-8][a-h][1-8]
, por ejemploe2e4
, que significa "mover la piezae2
ae4
". El programa imprimirá, por ejemplo,La forma principal de memoria en> <> es la pila; sin embargo, eso no es muy práctico para almacenar un tablero de ajedrez. En cambio, utilicé la capacidad de auto-modificación de> <> para almacenar el tablero de ajedrez como parte del código fuente mismo, accediendo con
g
yp
.La mayor parte del código es para verificar si su movimiento es legal. Hay varias cosas para verificar aquí:
Si alguna de esas preguntas tiene la respuesta incorrecta, el programa arroja un error y se detiene; de lo contrario, edita el tablero de ajedrez en su código fuente, lo imprime nuevamente y espera el próximo movimiento.
Para los movimientos de rey y caballero, tomé prestado el truco de Level River St de verificar la distancia al cuadrado euclidiana: para un rey, es menos de 3, y para un caballero, es exactamente 5.
fuente