Video Thumbnail

♟️ Chess Special Moves - En Passant - 1/3 [Unity tutorial 2021][C#]

Mercenary Camp27:32
https://www.youtube.com/watch?v=2qua0_SO_M8

Содержание

Краткое резюме

В этом видео разбирается реализация особого шахматного хода — «взятие на проходе» (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 с условиями и ограничениями.
  • Отделение логики получения корректных ходов от последующей обработки результата хода.
  • Подход, позволяющий легко расширять систему для других специальных ходов.