golang

Русские шашки: эффективная генерация ходов в Golang

  • четверг, 18 мая 2023 г. в 00:00:23
https://habr.com/ru/articles/731936/

Я рад представить вам свою реализацию ИИ для русских шашек под названием «damka» (https://github.com/antonmedv/damka). Проект, размещенный на GitHub и доступен для игры по адресу https://medv.io/шашки/, включает в себя ИИ, который следует правилам игры в русские шашки

  1. ИИ с mimimax алгоритмом и альфа‑бета обрезкой.

  2. База данных «endgame» (опционально).

  3. Нейросетевая оценка позиции: ИИ damka использует нейронную сеть для оценки позиций на доске, что позволяет ему более точно оценивать состояние игры.

В это серии статей мы рассмотрим реализацию русских шашек на Golang.

Введение

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

Код: https://github.com/antonmedv/damka

Представленный здесь код является частью пакета под названием damka, который представляет шашечную доску и ее возможные ходы. Он использует пользовательские типы и константы, такие как Board, Pos, Dir, и WhiteMan, BlackMan, WhiteKing и BlackKing для представления состояния игры и фигур на доске.

Генерация всех ходов

Основной функцией данной реализации является AllMovesWithFlag(), которая возвращает все возможные ходы для текущего игрока вместе с булевым флагом, указывающим на наличие хода захвата. Если флаг равен true, будут возвращены только ходы захвата, так как они обязательны в шашках. Функция AllMoves() является простой оберткой, которая не содержит флага.

Алгоритм начинается с определения фигур текущего игрока (либо белых, либо черных), затем итеративно просматривает все 32 позиции на доске. Для каждой позиции, если найдена фигура текущего игрока, программа генерирует все возможные ходы для этой фигуры, учитывая как обычные ходы, так и ходы захвата.

Генерация ходов для шашек

Функция manMoves() генерирует регулярные ходы для простых шашек, принимая во внимание направление, в котором она может двигаться (вверх‑влево и вверх‑вправо для белых, вниз‑влево и вниз‑вправо для черных). Для этого вызывается manMovesDir() с соответствующим направлением.

Функция manEats() обрабатывает ходы захвата для фигуры человека, пробуя все четыре возможных направления (вверх‑влево, вверх‑вправо, вниз‑влево и вниз‑вправо) и вызывая manEatsDir() для каждого из них. Если найден правильный ход взятия, функция возвращает true, указывая, что могут быть доступны другие ходы взятия.

Генерация ходов для дамок

Функция kingMoves() генерирует обычные ходы для дамок. Поскольку дамки могут двигаться в любом направлении, она вызывает функцию kingMovesDir() для каждого из четырех направлений (вверх‑влево, вверх‑вправо, вниз‑влево и вниз‑вправо).

Функция kingEats() генерирует ходы взятия для дамок, аналогично пробуя все четыре возможных направления и вызывая kingEatsDir() для каждого. Если найден правильный ход захвата, функция возвращает true, указывая, что могут быть доступны другие ходы захвата.

Оптимизация генерации ходов

Алгоритм использует комбинацию битовых манипуляций и предварительно выделенных фрагментов для эффективного использования памяти. Параметр eaten — это 32-битное целое число без знака, где каждый бит представляет позицию на доске. Это позволяет алгоритму отслеживать захваченные фигуры без дополнительных затрат памяти.

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

Заключение

Эта реализация генерации ходов для ИИ в шашках на языке Golang демонстрирует возможности эффективных алгоритмов и структур данных. Исследуя различные подходы к генерации всех возможных ходов при заданном состоянии доски, мы заложили основу для создания конкурентоспособного ИИ для игры в шашки. В следующих статьях блога мы будем углубляться в оценочные функции, алгоритмы поиска и другие методы, которые помогут нашему ИИ принимать разумные решения и соревноваться на высоком уровне.