Решён
Как математически описать правила шахмат?

Студент С++ Алгоритмы
904
4

Пытаюсь написать шахматный движок для учебного проекта. Столкнулся с проблемой формализации правил.

Как корректно математически описать:

  • Допустимые ходы для каждой фигуры (с учетом препятствий)
  • Проверку шаха и мата
  • Рокировку (все ее условия)
  • Взятие на проходе
  • Превращение пешки

Есть ли какая то формальная нотация или теория графов которая упрощает это? Или нужно просто писать кучу if-else для каждого случая?

Интересуют именно математические модели, а не готовые библиотеки.

Решение
87
Эксперт • 2 ответа

Шахматную доску можно представить как граф где каждая клетка - вершина, а возможные ходы - ребра.

Для каждой фигуры определяется вектор смещения:

  • Король: [(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)]
  • Слон: диагональные лучи до препятствия
  • Ладья: вертикальные и горизонтальные лучи
  • Ферзь: комбинация слона и ладьи
  • Пешка: зависит от цвета и позиции

Для генерации допустимых ходов:

  1. Взять текущую позицию (x, y)
  2. Применить вектор смещения
  3. Проверить границы доски (0 <= x, y < 8)
  4. Проверить препятствия на пути (для лучевых фигур)
  5. Проверить что не бьем свою фигуру

Для проверки шаха:

  • Сгенерировать все возможные ходы противника
  • Проверить попадает ли король под удар

Для мата:

  • Король под шахом
  • Ни один ход не убирает короля из под удара
  • Невозможно заблокировать атаку
  • Невозможно съесть атакующую фигуру

Рокировка:

if король не двигался AND ладья не двигалась AND
   клетки между пусты AND
   король не под шахом AND
   клетки через которые проходит король не под ударом:
   разрешить рокировку

Взятие на проходе:
Хранить информацию о последнем ходе. Если пешка противника прошла 2 клетки и встала рядом с твоей пешкой - разрешить взятие.

Превращение:

if пешка дошла до последней горизонтали:
   заменить на выбранную фигуру (ферзь/ладья/слон/конь)
Аватар Студент С++

Отличное объяснение с векторами смещения, спасибо! Теперь понятно как структурировать

34
Эксперт • 4 ответа

Добавлю про битборды (bitboards). Это оптимальный способ представления шахматной доски для движков.

Каждая фигура представлена 64-битным числом где каждый бит соответствует клетке доски. Операции над битами (AND, OR, XOR, shift) работают очень быстро.

Пример для ладьи на e4:

  • Горизонталь: 0x0000001010101000 (побитовый сдвиг)
  • Вертикаль: 0x0000000008080808
  • Объединение через OR дает все возможные ходы
  • Пересечение с позициями своих фигур через AND находит препятствия

Это стандарт для всех современных шахматных движков.

19
Участник • 3 ответа

Забыли про пат. Это когда у игрока нет легальных ходов но король не под шахом. Игра заканчивается вничью.

Также правило 50 ходов (если 50 ходов не было взятия или движения пешки - ничья) и троекратное повторение позиции.

15
Участник • 1 ответ

Можно посмотреть на PGN (Portable Game Notation) и FEN (Forsyth-Edwards Notation). Это стандартные форматы для записи партий и позиций.

FEN описывает позицию одной строкой:

rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1

Где:

  • Расположение фигур по горизонталям
  • Чей ход (w/b)
  • Возможность рокировки (KQkq)
  • Поле для взятия на проходе
  • Счетчик полуходов
  • Номер хода

Эта нотация уже содержит всю необходимую информацию о состоянии игры.

Написать ответ

Премодерация гостей

Вы отвечаете как гость. Ваш ответ будет скрыт до проверки модератором. Чтобы ответ появился сразу и вы получали репутацию — войдите в аккаунт.

Будьте вежливы и соблюдайте правила платформы.