Введение

Представление доски в компьютерных шахматах — это структура данных в шахматной программе, представляющая позицию на шахматной доске и связанное с ней состояние игры. Представление доски является основополагающим для всех аспектов шахматной программы, включая генерацию ходов, оценочную функцию, выполнение и отмену ходов (то есть поиск), а также поддержание состояния игры в процессе игры. Существует несколько различных способов представления доски. Шахматные программы часто используют более одного представления доски в разное время для повышения эффективности. Основными факторами при выборе представления доски являются быстродействие и объем используемой памяти; вторичными соображениями — трудозатраты на кодирование, тестирование и отладку приложения. Ранние программы использовали списки фигур и списки полей, оба основанные на массивах. Большинство современных реализаций используют более сложный, но более эффективный подход на основе битовых массивов, называемый битбордами, которые сопоставляют биты 64-битного слова или двойного слова полям доски.

Список деталей

Некоторые из самых ранних шахматных программ, работавших с крайне ограниченным объемом памяти, использовали последовательные списки (массивы) фигур, упорядоченные для удобного поиска, например, от фигуры наибольшей ценности к наименьшей; для каждой фигуры хранилось её местоположение на доске, а также другая информация, такая как поля, представляющие её возможные ходы. Существовало несколько списков: один для белых фигур и другой для чёрных. Списки обычно разделялись на фигуры и пешки. Это было компактное представление, поскольку большинство полей доски остаются незанятыми, но неэффективное, так как получение информации об отношении фигур к доске или друг к другу требовало значительных усилий. Списки фигур до сих пор используются многими современными программами в сочетании с отдельной структурой представления доски, чтобы обеспечить последовательный доступ к фигурам без необходимости перебора доски.

Список квадратов

Один из простейших способов представления доски — создать двумерный массив 8x8 (или, эквивалентно, одномерный массив из 64 элементов). Каждый элемент массива будет указывать, какая фигура занимает данное поле, или, если поле пусто. Обычно используют кодировку, где 0 означает пустое поле, положительные числа — белые фигуры, а отрицательные — черные, например, белый пешка +1, черный пешка −1, белый конь +2, черный конь −2, белый слон +3 и так далее. Эта схема называется адресацией по типу "почтовых ящиков". Проблема с таким подходом возникает при генерации ходов. Каждый ход необходимо проверять, чтобы убедиться, что он не выходит за пределы доски, что существенно замедляет процесс. Одним из решений является использование массива 12x12, где внешние поля заполнены, например, значением 99. При генерации хода операция проверки наличия фигуры на целевом поле также будет указывать, находится ли целевое поле за пределами доски. Более эффективное использование памяти можно достичь с помощью массива 10x12, который обеспечивает те же функциональные возможности, что и массив 12x12, за счет перекрытия крайних левой и правой вертикалей (которые помечены как находящиеся за пределами доски).

Битовые доски

Более эффективным, но и более сложным представлением доски, чем структуры, основанные на массивах, является битборд. Битборд – это 64-битная последовательность битов (0 или 1), указывающая на отсутствие или наличие (false или true) определенного состояния на каждой клетке доски. Позиция на доске может быть представлена серией битбордов. Например, серия битбордов для каждого типа фигур и для каждой стороны может представлять позицию на доске. Преимущество такого представления заключается в возможности использования битовых параллельных операций над 64-битными сущностями вместо итераций для манипулирования и получения информации о состоянии доски. Это позволяет максимально эффективно использовать доступное аппаратное обеспечение, особенно с учетом того, что 64-битные процессоры стали стандартом. Существенным преимуществом битбордов является возможность предварительного вычисления и хранения в таблице карт атаки для каждого типа фигуры на каждой клетке доски, что позволяет получить возможные ходы фигуры, загрузив из памяти карту атаки для клетки, на которой она находится. Исключив из этой карты клетки, занятые своими фигурами (с помощью одной побитовой операции), можно получить список допустимых ходов. Однако ходы "скользящих" фигур (ладей, слонов, ферзей) определяются неоднозначно, поскольку зависят от расположения других фигур на доске. Поэтому для представления их ходов были разработаны специальные и сложные структуры данных.

Ротационные битборд

Ротируемые битборды — это техника генерации ходов для фигур, перемещающихся по линиям, которая использует повернутые копии битборда для размещения пустых клеток (битов) в файле или по диагонали в соседние биты, аналогично битам, представляющим ранг. Эти биты можно извлечь и использовать как индекс в таблице для получения карты клеток, атакуемых этими фигурами. Битборд поворачивают на 90° для индексации файлов и на 45° для каждой из диагоналей. Поворот шахматной доски концептуально сложен, а поворот битборда вычислительно не элегантен, но это преобразование позволяет избежать последовательного перебора ходов фигур или длинной последовательности сдвигов и маскирования битборда карты атак фигуры для учета конфигурации доски.

Прямая поисковая система

Маскированные ряды, файлы и диагонали перемещаемых фигур могут быть использованы посредством хэш-функции для непосредственного доступа к таблице предварительно вычисленных векторов атаки, основанной на битах занятости в маскированной области. Один из таких методов, использующий идеальную хэш-функцию и приемы для минимизации потенциального размера таблицы, хранящейся в памяти, называется "магические битборды".

Таблица транспонирования

Таблица транспозиций — это кэш ранее встреченных позиций и связанных с ними оценок в дереве игры, генерируемом компьютерной программой для игры. Для быстрого поиска по таблице может использоваться хеш-функция, например, Zobrist-хеширование, чтобы ускорить поиск совпадающих позиций.

Другие методы

Были предложены другие методы, такие как компактное представление шахматной доски (CCR), но ни один из них не получил широкого распространения. CCR использует 4 бита на клетку для представления её занятости, весь ранг можно представить в 32 битах, а доска – в 8 регистрах (плюс один дополнительный для хранения информации об остальном состоянии позиции). Код занятости клетки можно извлечь из регистра и добавить к счетчику команд для индексации таблицы переходов, что позволяет напрямую переходить к коду для генерации ходов для фигуры, находящейся на этой клетке (если она там есть). Хотя программа получается длиннее, чем при использовании традиционных методов генерации ходов, проверки на выход за границы доски не требуются, и невозможны ходы за пределы доски, что повышает скорость генерации ходов. Недостатки CCR: 1) зависимость от 32-битной разрядности; 2) требование наличия как минимум 9 свободных регистров для API; 3) необходимость программирования на языке ассемблера для архитектуры CISC для доступа к регистрам; 4) отсутствие переносимости ассемблерного приложения.