Aquí hay una lista bien organizada que debería validar el 99.99% + de las posiciones comunes:
Tablero:
- Hay exactamente 8 cols
- La suma de los cuadrados vacíos y las piezas se suman a 8 para cada rango (fila)
- No hay números consecutivos para cuadrados vacíos
Reyes:
- Vea si hay exactamente una w_king y una b_king
- Asegúrate de que los reyes estén separados 1 cuadrado
Cheques:
- El color no activo no está bajo control
- El color activo se verifica menos de 3 veces (la triple verificación es imposible); en caso de 2 que nunca es peón + (peón, alfil, caballero), alfil + alfil, caballero + caballero
Peones:
- No hay más de 8 peones de cada color.
- No hay peones en el primer o último rango (fila) ya que están en una posición de inicio incorrecta o deberían haber ascendido.
- En el caso de en passant square; ver si se creó legalmente (por ejemplo, debe estar en el rango
x3
o x6
, debe haber un peón (del color correcto) delante de él, y el cuadrado al paso y el que está detrás está vacío)
- Evite tener más piezas promocionadas que peones faltantes (por ejemplo,
extra_pieces = Math.max(0, num_queens-1) + Math.max(0, num_rooks-2)...
y luego extra_pieces <= (8-num_pawns)
), también debe hacer cálculos especiales para los obispos. Si tiene dos (o más) obispos del mismo color cuadrado, estos solo se pueden crear a través de la promoción de peones y debe incluir esta información a la fórmula anterior de alguna manera
- Es posible alcanzar la formación de peón (por ejemplo, en el caso de varios peones en una sola columna, deben faltar suficientes piezas enemigas para hacer esa formación), aquí hay algunas reglas útiles:
- Es imposible tener más de 6 peones en un solo archivo (columna) (porque los peones no pueden existir en el primer y último rango)
- el número mínimo de piezas perdidas del enemigo para alcanzar un peón múltiple en una sola columna
B to G 2=1, 3=2, 4=4, 5=6, 6=9 ___ A and H 2=1, 3=3, 4=6, 5=10, 6=15
, por ejemplo, si ves 5 peones en A o H, el otro jugador debe faltar al menos 10 piezas de sus 15 piezas capturables
- Si hay peones blancos en a2 y a3, legalmente no puede haber uno en b2, y esta idea se puede ampliar aún más para cubrir más posibilidades
Enroque:
- Si el rey o las torres no están en su posición inicial; la habilidad de enroque para ese lado se pierde (en el caso del rey, ambos se pierden)
Obispos:
- Busque obispos en el primer y último rango (filas) atrapados por peones que no se han movido, por ejemplo:
- un alfil (de cualquier color) atrapado detrás de 3 peones
- un obispo atrapado detrás de 2 peones no enemigos (no por peones enemigos porque podemos alcanzar esa posición por debajo de los peones, sin embargo, si verificamos el número de peones y
extra_pieces
podríamos determinar si este caso es posible o no)
No puentes:
- (Evita esto si quieres validar el Ajedrez de Fisher960) Si hay piezas enemigas que no saltan entre el rey y la torre y todavía hay algunos peones sin moverse; comprueba si estas piezas enemigas podrían haber entrado legalmente allí. Además, pregúntese: ¿se necesitaba mover el rey o la torre para generar esa posición? (en caso afirmativo, debemos asegurarnos de que las habilidades de enroque reflejen esto)
- Si los 8 peones aún están en la posición inicial, todos los no saltadores no deben haber dejado su rango inicial (también las piezas enemigas no saltadoras no pueden haber entrado legalmente), hay otras ideas similares, como si el blanco h - el peón se movió una vez, las torres aún deben quedar atrapadas dentro de la formación del peón, etc.
Relojes de movimiento medio / completo:
- En el caso de un cuadrado en passant, el reloj de medio movimiento debe ser igual a 0
HalfMoves <= ((FullMoves-1)*2)+(if BlackToMove 1 else 0)
, el +1 o +0 depende del lado a mover
- Los HalfMoves deben ser
x >= 0
y los FullMovesx >= 1
Otro:
- Asegúrese de que el FEN contenga todas las partes necesarias (p. Ej., Color activo, habilidad de enroque, cuadrado al paso, etc.)
Nota: no es necesario hacer que los 'jugadores no deberían tener más de 16 piezas' porque los puntos 'no más de 8 peones' + 'evitan piezas promocionadas adicionales' + el 'exactamente un rey' ya debería cubrir este punto
Nota 2: estas reglas están destinadas a validar las posiciones que surgen de la posición inicial del ajedrez normal, algunas de las reglas invalidarán algunas posiciones de Chess960 (excepción si se inició desde el arreglo Nº518) y generarán rompecabezas para evitar que obtengan un validador funcional.
a
archivo.Aquí hay una expresión regular que uso para garantizar que una cadena FEN sea realmente válida. No realiza ninguna prueba para una posición legal / ilegal, pero es un buen punto de partida.
fuente
-
) y los relojes medio / completos a veces son opcionales, creo. Además, no entendí laa-h
parte de la habilidad de enroque, lo reescribí para/^\s*([rnbqkpRNBQKP1-8]+\/){7}([rnbqkpRNBQKP1-8]+)\s[bw]\s(-|K?Q?k?q?)\s(-|[a-h][36])/
([rnbqkRNBQK1-8]+\/)([rnbqkpRNBQKP1-8]+\/){6}([rnbqkRNBQK1-8]+) ....
(0|[1-9][0-9]*)\s([1-9][0-9]*)
ya que los movimientos no pueden tener ceros a la izquierda y el movimiento completo no puede ser o comenzar con 0, (crédito de código)Para los demás, hay una función simple en el motor Stockfish, que valida una cadena FEN.
fuente
position.is_okay()
. El código aquí solo hace un par de comprobaciones básicas para asegurarse de que esté formateado correctamente y que valga la pena realizar la validación real (es decir, obviamente no es ilegal).Aquí hay un algoritmo de retroceso simple, siempre que tenga una función que pueda verificar movimientos legales inversos en cada estado del tablero (también conocido como posición):
fuente
No hay nada en la especificación FEN que indique que la posición representada debe ser accesible desde la matriz inicial. Probar que una posición determinada es accesible desde la matriz inicial es un problema sin resolver.
En una cadena FEN válida, el conteo de medio movimiento debe estar de acuerdo con el cuadrado objetivo pasado; si hay un cuadrado objetivo, entonces el conteo de medio movimiento debe ser cero. el conteo de medio movimiento también debe estar de acuerdo con el número de movimiento completo; por ejemplo, un conteo de medio movimiento de diez es incompatible con un número de movimiento completo de tres.
fuente
Llegando tarde a la fiesta.
No es posible validar al 100% si un puesto es legal, pero ¿por qué debería importar la validación? Podemos jugar al ajedrez independientemente de si la posición se deriva o no de la posición inicial (el llamado "conjunto de juegos"). Puede haber una posición muy interesante para analizar, pero sucede que es ilegal.
Entonces verificaría solo:
Si son tres SÍ, entonces podemos jugar ajedrez hacia adelante desde este diagrama. E incluso esta breve lista de condiciones podríamos aflojar.
fuente