Содержание
- 🎯 Основные выводы
Краткое резюме
В этом видео разбирается реализация особого шахматного хода — «взятие на проходе» (en passant) — в контексте создания шахматного движка. Автор подробно объясняет, как поддерживать список ходов для контроля правил и как модифицировать логику хода для обработки специальных ситуаций на доске. Важные пункты включают постановку задачи, создание структуры для отслеживания ходов, описание алгоритма проверки условия взятия на проходе и последующую обработку удаления пойманной фигуры. Видео закладывает основу для дальнейшей работы с другими специальными ходами, например, рокировкой и превращением пешки.
Введение в специальные ходы и список ходов
Автор начинает с постановки задач: добавить поддержку специальных ходов, таких как en passant, а также вести список ходов (moveList
), который понадобится для симуляции и проверки условий выполнения специальных правил, например, рокировки, где важно знать, перемещались ли фигуры ранее.
Для этого создаётся:
- Список ходов (
moveList
), где каждый элемент — это массив из двух векторов (начальная и конечная позиция). - Перечисление (
enum
) спецходов, куда входятnone
,castling
,promotion
,enPassant
(взятие на проходе).
Список ходов очищается при сбросе игры для корректного начала.
Реализация дополнений в логике ходов
Добавление ходов в список
При подтверждении валидного хода он заносится в moveList
в формате [стартовая позиция, конечная позиция]
. Это позволяет в будущем анализировать историю ходов.
Получение специальных ходов
В методе getSpecialMove
у каждой фигуры вызывается проверка на возможность исполнения спецхода. По умолчанию возвращается specialMove.none
, но у пешек и короля логика расширяется:
- Пешка — проверяет условия взятия на проходе и превращения.
- Король — проверяет возможность рокировки.
Важный момент — список доступных ходов (availableMoves
) передаётся по ссылке и может быть дополнен особыми ходами.
Логика взятия на проходе (en passant) у пешки
Условия для взятия на проходе
- Предыдущий ход должен был сделан пешкой, которая сдвинулась ровно на 2 клетки вперед.
- Пешка-противник должна оказаться рядом по горизонтали (слева или справа).
- Текущая пешка может съесть её «на проходе», переместившись по диагонали на одну клетку вперед.
- Действие можно выполнить только сразу после того, как пешка противника сдвинулась на 2 клетки.
Проверка условий в коде
- Получаем последний ход из
moveList
. - Проверяем, была ли фигура пешкой и сдвинулась ли ровно на 2 клетки (с учётом направления).
- Проверяем, что пешка противника находится на соседней клетке по горизонтали.
- При выполнении условий добавляем ход взятия на проходе в список доступных ходов.
Возвращаем specialMove.enPassant
, если ход возможен.
«...правило говорит, что это взятие должно быть сделано сразу после двойного хода пешки соперника — без задержек.»
Обработка взятия на проходе после хода
После совершения хода с пометкой enPassant
необходимо дополнительно удалить съеденную пешку, которая находится не на клетке куда ходит пешка, а рядом с ней.
Для этого:
- В функции
processSpecialMove
берутся последние два хода из списка. - Определяется позиция пешки, которая была передвинуты на 2 клетки (цель для взятия).
- Проверяется, совпадают ли координаты пешек по оси
x
, и находится ли текущая пешка над или под противником по осиy
. - Если условия выполняются, пешка противника удаляется с доски (обнуляются её координаты и ссылка на фигуру).
- Таким образом правильно моделируется логика взятия на проходе.
Проверка и тесты
В демонстрации автор:
- Перемещает пешку на два шага вперед рядом с пешкой противника.
- Проверяет, что у пешки появляется возможность ходить диагонально и съесть пешку «на проходе».
- Подтверждает, что после хода пешка противника удаляется, а другие ходы пешек остаются валидными.
- Проверяет правильность работы с обеих сторон (влево и вправо).
«...если просто идти вперед, фигура не удаляется, что и соответствует шахматным правилам.»
Итоги и дальнейшие планы
- Реализован первый из специальных ходов — взятие на проходе.
- Заложена основа для поддержки нескольких типов специальных ходов через
enum
и методы обработки. - Добавлен механизм для хранения истории ходов и использования её для проверки правил.
- В следующем видео планируется разбирать рокировку — более сложный ход, где движутся одновременно король и ладья.
«...с текущим движком мы готовы двигаться дальше и реализовывать более комплексные ситуации на шахматной доске.»
🎯 Основные выводы
- Важность списка ходов для проверки условий и управления правилами.
- Детальный разбор en passant с условиями и ограничениями.
- Отделение логики получения корректных ходов от последующей обработки результата хода.
- Подход, позволяющий легко расширять систему для других специальных ходов.