Aqui está uma lista bem organizada que deve validar 99,99% + das posições comuns:
Borda:
- Existem exatamente 8 cols
- A soma dos quadrados e das peças vazias é adicionada a 8 para cada classificação (linha)
- Não há números consecutivos para quadrados vazios
Reis:
- Veja se existe exatamente um w_king e um b_king
- Certifique-se de que os reis estejam separados 1 quadrado
Verificações:
- Cor não ativa não está em cheque
- A cor ativa é verificada menos de 3 vezes (a verificação tripla é impossível); no caso de 2, nunca é peão + (peão, bispo, cavaleiro), bispo + bispo, cavaleiro + cavaleiro
Peões:
- Não há mais de 8 peões de cada cor
- Não há peões na primeira ou na última fila (linha), pois eles estão em uma posição inicial incorreta ou deveriam ter sido promovidos.
- No caso de uma praça passante; veja se ele foi criado legalmente (por exemplo, deve estar no
x3
ou x6
rank, deve haver um peão (da cor correta) na frente e o quadrado en passant e o que está atrás dele estão vazios)
- Evite ter mais peças promovidas do que peões perdidos (por exemplo,
extra_pieces = Math.max(0, num_queens-1) + Math.max(0, num_rooks-2)...
e então extra_pieces <= (8-num_pawns)
), também faça cálculos especiais para os bispos. Se você tem dois (ou mais) bispos da mesma cor quadrada, eles só podem ser criados através da promoção de peões e você deve incluir esta informação para a fórmula acima de alguma forma
- É possível alcançar a formação de peões (por exemplo, no caso de vários peões em uma única coluna, deve haver peças inimigas suficientes para fazer essa formação), eis algumas regras úteis:
- é impossível ter mais de 6 peões em um único arquivo (coluna) (porque os peões não podem existir na primeira e na última fila)
- o número mínimo de peças faltantes do inimigo para atingir um peão múltiplo em uma única coluna
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 exemplo, se você ver 5 peões em A ou H, o outro jogador deve estar perdendo pelo menos 10 peças de suas 15 peças capturáveis
- se houver peões brancos em a2 e a3, legalmente não pode haver um em b2, e essa ideia poderá ser expandida para abranger mais possibilidades
Castling:
- Se o rei ou as torres não estiverem na posição inicial; a habilidade de rolar para esse lado está perdida (no caso do rei, ambos estão perdidos)
Bispos:
- Procure bispos na primeira e na última fileiras (linhas) capturadas por peões que não foram movidos, por exemplo:
- um bispo (de qualquer cor) preso atrás de 3 peões
- um bispo preso atrás de 2 peões não inimigos (não por peões inimigos, porque podemos chegar a essa posição desprotegendo peões, no entanto, se verificarmos o número de peões e
extra_pieces
poderemos determinar se esse caso é possível ou não)
Não-saltadores:
- (Evite isso se você quiser validar o Fisher's Chess960). Se houver peças inimigas que não saltam entre o rei e a torre e ainda houver alguns peões sem se mover; verifique se essas peças inimigas poderiam ter entrado legalmente lá. Além disso, pergunte-se: o rei ou a torre precisavam se mover para gerar essa posição? (se sim, precisamos garantir que as habilidades de castell reflitam isso)
- Se todos os 8 peões ainda estiverem na posição inicial, todos os que não saltam não devem ter saído de sua classificação inicial (as peças inimigas que não saltam não podem ter entrado legalmente), há outras idéias semelhantes, como se o h branco -pawn se moveu uma vez, as torres ainda devem estar presas dentro da formação do peão, etc.
Relógios de movimento parcial / completo:
- No caso de um quadrado en passant, o relógio de meio movimento deve ser igual a 0
HalfMoves <= ((FullMoves-1)*2)+(if BlackToMove 1 else 0)
, +1 ou +0 depende do lado a ser movido
- O HalfMoves deve ser
x >= 0
e o FullMovesx >= 1
De outros:
- Certifique-se de que o FEN contenha todas as peças necessárias (por exemplo, cor ativa, capacidade de fundição, quadrado passante etc.)
Nota: não há necessidade de fazer o teste 'jogadores não devem ter mais de 16 peças', porque os pontos 'não mais que 8 peões' + 'impedem peças extras promovidas' + o 'exatamente um rei' já deve cobrir esse ponto
Nota2: essas regras têm como objetivo validar posições decorrentes da posição inicial do xadrez normal, algumas regras invalidam algumas posições do Chess960 (exceção se iniciadas no arranjo Nº518) e geram quebra-cabeças, portanto, evite que obtenham um validador funcional.
a
arquivo.Aqui está uma expressão regular que eu uso para garantir que uma string FEN seja realmente válida. Ele não faz nenhum teste para uma posição legal / ilegal, mas é um bom ponto de partida.
fonte
-
) e relógios meio / cheio às vezes são opcionais, eu acho. Também eu não entendia aa-h
parte sobre o roque capacidade, eu reescrevi-a/^\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]*)
como movimentos não podem ter zeros à esquerda e movimento completo não pode ser ou começam com 0, (crédito código)Para os outros, existe uma função simples no mecanismo Stockfish, que valida uma String FEN.
fonte
position.is_okay()
. O código aqui faz apenas algumas verificações básicas para garantir que esteja formatado corretamente e que valha a pena fazer a validação real (ou seja, não é obviamente ilegal).Aqui está um algoritmo simples de retorno, desde que você tenha uma função que possa verificar movimentos legais reversos em todos os estados do fórum (também conhecidos como posição):
fonte
Não há nada na especificação FEN dizendo que a posição representada deve ser alcançável a partir da matriz inicial. Provar que uma determinada posição é alcançável a partir da matriz inicial é um problema não resolvido.
Em uma sequência FEN válida, a contagem de meio movimento deve estar de acordo com o quadrado alvo passante; se um quadrado alvo estiver presente, a contagem de meio movimento deve ser zero. a contagem de meio movimento também deve estar de acordo com o número de movimento completo; por exemplo, uma contagem de dez movimentos de meia é incompatível com um número de movimento completo de três.
fonte
Chegando tarde na festa.
Não é possível validar 100% se uma posição é legal, mas por que a validação importa? Podemos jogar xadrez, independentemente de a posição derivar ou não da posição inicial (o chamado "conjunto de jogos"). Pode haver uma posição muito interessante para analisar, mas acontece que é ilegal.
Então eu verificaria apenas:
Se são três SIM, podemos jogar xadrez a partir deste diagrama. E mesmo nesta pequena lista de condições, podemos ser capazes de relaxar.
fonte