Unidad de prueba de una representación de tablero de ajedrez

9

Entonces esta es una pregunta un poco atípica.

Estoy escribiendo una biblioteca de ajedrez, esencialmente desde cero. Puede encontrar gran parte del código aquí , con la intención de usarlo para una GUI y / o un motor. (El juego es Grand Chess pero a los efectos de esta pregunta realmente no importa).

Actualmente estoy escribiendo pruebas unitarias para verificar que mis funciones funcionen como se esperaba. Y me preguntaba si había algún tipo de biblioteca o base de datos de posiciones sugeridas para probar que pueda usar y trabajar, clasificadas por si son Checkmate, Stalemate, Check, Legal, Ilegal, etc.

tl; dr Estoy buscando una lista de puestos para probar el código de mi unidad.

Puede encontrar mis pruebas actuales aquí, las agrego cada pocos días. Sin embargo, quiero asegurarme de que las pruebas sean exhaustivas antes de depurar el código. (La mitad de ellos falla actualmente).

Editar: para aclarar: no estoy buscando pruebas de motor ("mejor movimiento"). Estoy buscando pruebas de representación de la junta ("es esta posición jaque mate"). Ya tengo algunos acertijos alineados para probar el motor.

asibahi
fuente
Estás codificando una variante. El conjunto de datos de ajedrez estándar no funcionará para usted. Así que me temo que estás solo.
SmallChess
@StudentT Estoy buscando algo de lo que pueda comenzar. una base de datos normal estaría bien, ya que sabes, puedo editarla.
asibahi
1
Hay MUCHOS conjuntos de pruebas, ¿estás contento por algo como ejercicios tácticos perft en el ajedrez estándar?
SmallChess
@StudentT No pude encontrar nada a través de Google, por eso pregunto aquí. Cualquier información sería útil.
asibahi
Lo que desea probar tiene poco que ver con la representación de la junta. Deberá probar la representación del tablero después de hacer / deshacer movimientos o importar posiciones. La detección de mate / estancamiento requiere una función de evaluación, y probar una posición para la legalidad debe ser una función propia que tiene mucho más que hacer que verificar la representación de la junta.
Queeg

Respuestas:

1

Al leer su pregunta, mi reacción instintiva es que su alcance es demasiado complicado para las pruebas unitarias. Recomiendo una lectura rápida del libro electrónico gratuito Unit Testing Succinctly. Sin embargo, no tengo experiencia escribiendo código de ajedrez (quizás tus paradigmas son diferentes), aunque hago software para vivir.

Una prueba unitaria debe ser muy simple y probar una función que hace 1 sola cosa. Luego puede combinar las funciones con una expectativa razonable de que funcionarán. Por ejemplo, esperaría una prueba de unidad para cada pieza para determinar si un movimiento en particular es legal. Una prueba de unidad para cada pieza para determinar si está poniendo al rey bajo control. Una prueba para cada pieza para determinar dónde está atacando, etc.

Probar una posición parece una prueba unitaria muy complicada y sería mucho más difícil hacerlo a fondo. En su lugar, escriba pruebas más pequeñas contra funciones más pequeñas y luego sepa que esas trabajan individualmente: evaluar una posición es solo una cuestión de iterar sobre las funciones simples.

Si desea probar una posición para un buen movimiento (no forzado), creo que las pruebas unitarias limitarán artificialmente el desarrollo a largo plazo y la fuerza de su motor de ajedrez ... un resultado binario de una prueba unitaria obligará a su motor a hacer el mismo movimiento cada vez.

También me gustaría agregar pruebas unitarias para la ruta 'más directa' a un compañero con finales conocidos. Me gustaría agregar pruebas unitarias para atravesar también aberturas conocidas. Las pruebas unitarias a mitad del juego serán mucho más difíciles, tal vez enchufar una posición y evaluar que el motor produce un resultado utilizable (que es una respuesta binaria).

Para la cuestión de evaluar un conjunto de posiciones para su motor, es mejor que haga esta pregunta en https://stackoverflow.com/ con la etiqueta "ajedrez".

Pablo
fuente
Gracias por la respuesta. Sin embargo, como probablemente pueda deducir de la conversación de comentarios bajo la pregunta, no estoy buscando probar los algoritmos del motor. Ni siquiera llegué a esos todavía. Estoy buscando probar si mi código reconoce si una posición de pie en el tablero es jaque mate, o un punto muerto, o no, lo que es "solo" contar movimientos legales y si el rey está bajo control. De hecho, desde que publiqué esa pregunta, pasé a componer una pequeña colección de posiciones para usar como casos de prueba unitaria. Podría publicar eso como respuesta. (Estoy completamente sorprendido de que alguien haya ofrecido una recompensa por esto, tbh.)
asibahi
Esto no responde la pregunta.
SmallChess
1
Además, las notas sobre las pruebas unitarias son simplemente incorrectas.
SmallChess
@asibahi No tenía suficiente representante para publicar en esa sección de comentarios, así que tuve que agregar una respuesta. Realmente creo que será mejor servido en un foro de programación (stackexchange) con esta pregunta. Pero en este comentario ... ya identificó pruebas de unidades individuales -> Para cada prueba de pieza hay un movimiento legal. Si iterar sobre eso devuelve falso para cada pieza, tienes un punto muerto o un jaque mate si estás bajo control. No necesitas una gran colección de puestos para eso. Al probar cada pieza individualmente para su estado actual, puede iterar sobre varias piezas para evaluar la posición.
Paul
0

Si bien esta es una vieja pregunta, pensé que el concepto presentado en este blog podría ser útil: http://scionsoftware.com/blog/write-tests-by-playing-chess

La idea es que juegues un juego de ajedrez en una GUI y tengas un mecanismo para capturar el estado del tablero de ajedrez serializando en un archivo.

Puede nombrar esos archivos según los casos de prueba y alimentarlos al método de prueba que defina: IsCheckmate; Es legal; IsDraw

Una de las razones principales por las que desearía usar una interfaz de usuario natural para crear estos casos de prueba, fuera de la facilidad de creación, es que suficientes condiciones también dependen de los recuentos de movimientos: enroque, passant, condiciones de extracción.

SpykeBytes
fuente
0

No conozco ninguna base de datos de pruebas unitarias para el motor de ajedrez (en general), y sí, escribir pruebas unitarias exhaustivas es casi imposible.

Quizás pueda explorar técnicas de prueba alternativas como las pruebas basadas en propiedades (QuickCheck en Haskell, no conozco el entorno de F # pero ciertamente existe algo así para F #), que puede generar automáticamente una gran cantidad de "posición" y probarlas utilizando propiedad definida por usted.

Espero que esto ayude un poco :)!

Sylvain Julmy
fuente