Вот хорошо организованный список, который должен подтвердить 99,99% + общих позиций:
Совет:
- Есть ровно 8 кол
- Сумма пустых квадратов и кусочков добавляется к 8 для каждого ранга (строки)
- Для пустых квадратов нет последовательных чисел
Kings:
- Посмотрите, есть ли ровно один w_king и один b_king
- Убедитесь, что короли отделены друг от друга на 1 квадрат
Проверки:
- Неактивный цвет не проверяется
- Активный цвет проверяется менее 3 раз (тройная проверка невозможна); в случае 2 это никогда не пешка + (пешка, слон, рыцарь), слон + слон, рыцарь + рыцарь
Пешки:
- В каждом цвете не более 8 пешек
- В первом или последнем ранге (ряду) нет пешек, поскольку они либо находятся в неправильной стартовой позиции, либо должны были повыситься.
- В случае проходной площади; посмотрите, было ли оно создано по закону (например, оно должно быть в ранге
x3
или x6
, перед ним должна быть пешка (правильного цвета), а квадрат en passant и тот, что позади него, пусты)
- Предотвратите, чтобы больше продвигаемых фигур, чем отсутствующих пешек (например,
extra_pieces = Math.max(0, num_queens-1) + Math.max(0, num_rooks-2)...
и затем extra_pieces <= (8-num_pawns)
), также вы должны делать специальные вычисления для слонов. Если у вас есть два (или более) слона одного и того же квадратного цвета, они могут быть созданы только с помощью продвижения пешки, и вы должны включить эта информация в формуле выше как-то
- Формирование пешки возможно достичь (например, в случае нескольких пешек на одном колье, должно быть достаточно вражеских фигур, чтобы сделать это формирование), вот несколько полезных правил:
- невозможно иметь более 6 пешек в одном файле (столбце) (поскольку пешки не могут существовать в первом и последнем разрядах)
- минимальное количество недостающих фигур противника для достижения нескольких пешек на одном колье
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
, например, если вы видите 5 пешек в A или H, другой игрок должен пропустить не менее 10 фигур из своих 15 захваченных фигур
- если в a2 и a3 есть белые пешки, то в b2 их не может быть по закону, и эту идею можно расширить, чтобы охватить больше возможностей
Рокировка:
- Если король или ладьи не находятся в исходном положении; способность рокировки для этой стороны теряется (в случае короля оба теряются)
Епископы:
- Ищите слонов в первом и последнем рядах (рядах), захваченных пешками, которые не сдвинулись, например:
- слон (любого цвета) в ловушке за 3 пешками
- епископ, пойманный в ловушку за двумя не вражескими пешками (не пешками противника, потому что мы можем достичь этой позиции, недооценивая пешек, однако, если мы проверим количество пешек и
extra_pieces
сможем определить, возможен ли этот случай или нет)
Non-прыгуны:
- (Избегайте этого, если вы хотите проверить шахматы Фишера960). Если между королем и ладьей есть вражеские фигуры, не являющиеся перемычками, и все еще остаются пешки без движения; проверьте, могли ли эти вражеские фигуры попасть туда на законных основаниях. Кроме того, спросите себя: нужен ли король или ладья, чтобы двигаться, чтобы создать эту позицию? (если да, мы должны убедиться, что способности рокировки отражают это)
- Если все 8 пешек все еще находятся в исходной позиции, все непрыгунчики не должны были оставить свой начальный ранг (также вражеские фигуры непрыгнаных не могли бы войти легально), есть и другие похожие идеи, например, если белый h пешка перемещается один раз, ладьи все еще должны быть в ловушке внутри пешечной группировки и т. д.
Часы наполовину / полный ход:
- В случае квадрата en passant часы половинного хода должны быть равны 0
HalfMoves <= ((FullMoves-1)*2)+(if BlackToMove 1 else 0)
, +1 или +0 зависит от стороны, чтобы двигаться
- HalfMoves должны быть
x >= 0
и FullMovesx >= 1
Другой:
- Убедитесь, что FEN содержит все необходимые детали (например, активный цвет, способность к рокировке, квадрат прохода и т. Д.)
Примечание: нет необходимости делать проверку «игрокам не должно быть больше 16 фигур», потому что очки «не более 8 пешек» + «предотвращать дополнительные продвинутые фигуры» + «точно один король» уже должен покрывать эту точку
Примечание 2: эти правила предназначены для проверки позиций, возникающих из начальной позиции обычных шахмат, некоторые из правил аннулируют некоторые позиции из Chess960 (исключение, если они начинаются с договоренности № 518) и генерируют головоломки, поэтому избегайте их, чтобы получить функциональный валидатор.
a
файл.Вот регулярное выражение, которое я использую, чтобы убедиться, что строка FEN действительно допустима. Это не делает никакого теста на легальную / нелегальную позицию, но это хорошая отправная точка.
источник
-
), и половина / полные часы иногда необязательны, я думаю. Кроме того, я не понялa-h
часть о способности рокировки, я переписал это/^\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]*)
поскольку ходы не могут иметь начальные нули, а полный ход не может быть или начинаться с 0, (код кредита)Для остальных есть простая функция в движке Stockfish, которая проверяет строку FEN.
источник
position.is_okay()
. Код здесь просто выполняет несколько основных проверок, чтобы убедиться, что он правильно отформатирован и что стоит провести реальную проверку (то есть не является явно незаконной).Вот простой алгоритм возврата, при условии, что у вас есть функция, которая может проверять обратные законные ходы в каждом состоянии доски (также известное как позиция):
источник
В спецификации FEN ничего не говорится о том, что представленная позиция должна быть достижимой из исходного массива. Доказательство того, что данная позиция достижима из исходного массива, является нерешенной проблемой.
В допустимой строке FEN счетчик половинных перемещений должен совпадать с целевым квадратом en passant; если целевой квадрат присутствует, то счетчик половины хода должен быть равен нулю. счетчик половинных ходов также должен соответствовать полному номеру ходов; например, половина хода десять несовместима с полным числом хода три.
источник
Приходить на вечеринку поздно.
Невозможно на 100% подтвердить, является ли позиция законной, но почему проверка должна иметь значение? Мы можем играть в шахматы независимо от того, происходит ли позиция из начальной позиции (так называемый «игровой массив»). Может быть очень интересная позиция для анализа, но бывает, что это незаконно.
Так что я бы проверил просто:
Если это три ДА, то мы можем сыграть в шахматы нападающими с этой диаграммы. И даже этот короткий список условий мы могли бы ослабить.
источник