Шахматную доску можно представить как граф где каждая клетка - вершина, а возможные ходы - ребра.
Для каждой фигуры определяется вектор смещения:
- Король: [(1,0), (1,1), (0,1), (-1,1), (-1,0), (-1,-1), (0,-1), (1,-1)]
- Конь: [(2,1), (2,-1), (-2,1), (-2,-1), (1,2), (1,-2), (-1,2), (-1,-2)]
- Слон: диагональные лучи до препятствия
- Ладья: вертикальные и горизонтальные лучи
- Ферзь: комбинация слона и ладьи
- Пешка: зависит от цвета и позиции
Для генерации допустимых ходов:
- Взять текущую позицию (x, y)
- Применить вектор смещения
- Проверить границы доски (0 <= x, y < 8)
- Проверить препятствия на пути (для лучевых фигур)
- Проверить что не бьем свою фигуру
Для проверки шаха:
- Сгенерировать все возможные ходы противника
- Проверить попадает ли король под удар
Для мата:
- Король под шахом
- Ни один ход не убирает короля из под удара
- Невозможно заблокировать атаку
- Невозможно съесть атакующую фигуру
Рокировка:
if король не двигался AND ладья не двигалась AND
клетки между пусты AND
король не под шахом AND
клетки через которые проходит король не под ударом:
разрешить рокировку
Взятие на проходе:
Хранить информацию о последнем ходе. Если пешка противника прошла 2 клетки и встала рядом с твоей пешкой - разрешить взятие.
Превращение:
if пешка дошла до последней горизонтали:
заменить на выбранную фигуру (ферзь/ладья/слон/конь)
Отличное объяснение с векторами смещения, спасибо! Теперь понятно как структурировать