Voici une liste bien organisée qui devrait valider 99,99% + des positions communes:
Planche:
- Il y a exactement 8 cols
- La somme des carrés et des pièces vides s'ajoute à 8 pour chaque rang (ligne)
- Il n'y a pas de numéros consécutifs pour les cases vides
Rois:
- Voir s'il y a exactement un w_king et un b_king
- Assurez-vous que les rois sont séparés d'un carré
Contrôles:
- La couleur non active n'est pas cochée
- La couleur active est vérifiée moins de 3 fois (une triple vérification est impossible); dans le cas de 2 qu'il n'est jamais pion + (pion, évêque, chevalier), évêque + évêque, chevalier + chevalier
Pions:
- Il n'y a pas plus de 8 pions de chaque couleur
- Il n'y a pas de pions au premier ou au dernier rang (rangée) car ils sont soit dans une mauvaise position de départ, soit ils auraient dû être promus.
- En cas de carré en passant; voir s'il a été légalement créé (par exemple, il doit être sur le rang
x3
ou x6
, il doit y avoir un pion (de la bonne couleur) devant lui, et le carré en passant et celui derrière lui sont vides)
- Empêchez d'avoir plus de pièces promues que de pions manquants (par exemple
extra_pieces = Math.max(0, num_queens-1) + Math.max(0, num_rooks-2)...
, puis extra_pieces <= (8-num_pawns)
), vous devez également faire des calculs spéciaux pour les évêques.Si vous avez deux (ou plus) évêques de la même couleur carrée, ceux-ci ne peuvent être créés que par la promotion de pions et vous devez inclure ces informations à la formule ci-dessus en quelque sorte
- La formation de pions est possible à atteindre (par exemple en cas de plusieurs pions dans un même col, il doit y avoir suffisamment de pièces ennemies manquantes pour faire cette formation), voici quelques règles utiles:
- il est impossible d'avoir plus de 6 pions dans un seul fichier (colonne) (car les pions ne peuvent pas exister dans les premier et dernier rangs)
- le nombre minimum de pièces manquantes ennemies pour atteindre un pion multiple dans une seule colonne
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
, par exemple, si vous voyez 5 pions en A ou H, l'autre joueur doit manquer au moins 10 pièces de ses 15 pièces capturables
- s'il y a des pions blancs en a2 et a3, il ne peut pas légalement en avoir un en b2, et cette idée peut être développée pour couvrir plus de possibilités
Roque:
- Si le roi ou les tours ne sont pas dans leur position de départ; la capacité de roque de ce côté est perdue (dans le cas du roi, les deux sont perdus)
Évêques:
- Recherchez les évêques dans les premier et dernier rangs (rangées) piégés par des pions qui n'ont pas bougé, par exemple:
- un évêque (de n'importe quelle couleur) pris au piège derrière 3 pions
- un évêque piégé derrière 2 pions non ennemis (pas par des pions ennemis parce que nous pouvons atteindre cette position en sous-promouvant les pions, cependant si nous vérifions le nombre de pions et
extra_pieces
nous pourrions déterminer si ce cas est possible ou non)
Non-sauteurs:
- (Évitez ceci si vous voulez valider les échecs de Fisher960) S'il y a des pièces ennemies non sauteuses entre le roi et la tour et qu'il y a encore des pions sans bouger; Vérifiez si ces pièces ennemies auraient pu légalement y pénétrer. Demandez-vous également: le roi ou la tour devait-il se déplacer pour générer cette position? (si oui, nous devons nous assurer que les capacités de roque reflètent cela)
- Si les 8 pions sont toujours dans la position de départ, tous les non-cavaliers ne doivent pas avoir quitté leur rang initial (les pièces ennemies non-cavalières ne peuvent pas non plus avoir pu entrer légalement), il existe d'autres idées similaires, comme si le h blanc -le pion a bougé une fois, les tours doivent toujours être piégées à l'intérieur de la formation de pion, etc.
Horloges à demi / mouvement complet:
- Dans le cas d'un carré passant, l'horloge de demi-mouvement doit être égale à 0
HalfMoves <= ((FullMoves-1)*2)+(if BlackToMove 1 else 0)
, le +1 ou +0 dépend du côté à déplacer
- Les HalfMoves doivent être
x >= 0
et les FullMovesx >= 1
Autre:
- Assurez-vous que le FEN contient toutes les pièces nécessaires (par exemple, couleur active, capacité de roque, carré en passant, etc.)
Remarque: il n'est pas nécessaire de cocher la case « les joueurs ne devraient pas avoir plus de 16 pièces» car les points «pas plus de 8 pions» + «empêcher les pièces supplémentaires promues» + «exactement un roi» devrait déjà couvrir ce point
Remarque 2: ces règles sont destinées à valider les positions résultant de la position de départ des échecs normaux, certaines règles invalideront certaines positions de Chess960 (exception si elles sont lancées à partir de l'arrangement Nº518) et les puzzles générés, évitez-les donc d'obtenir un validateur fonctionnel.
a
fichier.Voici une expression régulière que j'utilise pour garantir qu'une chaîne FEN est réellement valide. Il ne fait aucun test pour une position légale / illégale, mais c'est un bon point de départ.
la source
-
) et les horloges demi-pleines sont parfois facultatives je pense. De plus, je n'ai pas compris laa-h
partie sur la capacité de roque, je l'ai réécrite/^\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]*)
car les mouvements ne peuvent pas avoir de zéros non significatifs et le mouvement complet ne peut pas être ou commencer par 0, (crédit de code)Pour les autres, il existe une fonction simple dans le moteur Stockfish, qui valide une chaîne FEN.
la source
position.is_okay()
. Le code ici fait juste quelques vérifications de base pour s'assurer qu'il est correctement formaté et qu'il vaut la peine de faire la vraie validation (c'est-à-dire pas évidemment illégal).Voici un algorithme de retour en arrière simple, à condition que vous ayez une fonction qui puisse vérifier les mouvements légaux inversés à chaque état de la carte (également connu sous le nom de position):
la source
Rien dans la spécification FEN ne dit que la position représentée doit être accessible à partir du tableau initial. Prouver qu'une position donnée est accessible à partir du tableau initial est un problème non résolu.
Dans une chaîne FEN valide, le nombre de demi-coups doit être en accord avec le carré cible en passant; si un carré cible est présent, alors le nombre de demi-coups doit être nul. le compte du demi-coup doit également être en accord avec le numéro de coup complet; Par exemple, un décompte de demi-coups de dix est incompatible avec un nombre total de coups de trois.
la source
Venir à la fête tard.
Il n'est pas possible de valider à 100% si un poste est légal, mais pourquoi la validation est-elle importante? Nous pouvons jouer aux échecs que la position dérive ou non de la position de départ (ce que l'on appelle le «tableau de jeu»). Il pourrait y avoir une position très intéressante à analyser, mais il se trouve que c'est illégal.
Je vérifierais donc simplement:
Si c'est trois OUI, nous pouvons jouer aux échecs en avant à partir de ce diagramme. Et même cette courte liste de conditions que nous pourrions être en mesure d'assouplir.
la source