Какое наиболее практичное представление доски для системы генерирования магического битборда? - PullRequest
3 голосов
/ 24 марта 2012

Я переписываю шахматный движок, написанный для работы на магических битбордах. У меня есть написанные магические функции, и они принимают квадрат части и битборд занятости в качестве параметров. Я спорю со мной о том, какая из этих схем представления на доске быстрее / практичнее:

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

схема 2: простой массив центрированных фигур [2] [16] или [32] содержит квадратные индексы фигур. Простое прохождение и вызов функций - это все, что нужно для перемещения битбордов. Затем я сериализирую эти битборды и помещаю их в стек перемещения. Я также должен поддерживать битборд занятости. Я полагаю, что получение атакующей битборда не должно быть другим: мне нужно еще раз сгенерировать все битовые доски ходов, и вместо того, чтобы их сериализовать, я побитовым образом управляю ими в колдовской магии.

Я склоняюсь к схеме 2, но по некоторым причинам я думаю, что есть какая-то реализация, аналогичная схеме 1, которая является стандартной. По какой-то причине я не могу найти недостатки в создании "битбордного" движка без использования битбордов. Я бы даже не использовал битборды для данных короля и рыцаря, просто быстрый поиск в массиве.

Полагаю, мой вопрос больше в том, есть ли лучший способ сделать это представление платы, потому что я помню, как читал, что хранение битовой доски для каждого типа фигуры является стандартным (возможно, это необходимо только для вращаемых битбордов?). Я относительно плохо знаком с движками для битбордов, но я много читал и реализовал магический метод. Мне, конечно, нравится подход массива кусочно-ориентированных массивов - он делает много произвольных вещей, таких как печать доски на экране, легче, но если есть лучший / равный / более стандартный способ, может кто-нибудь указать на это? Заранее спасибо - я знаю, что это довольно специфический вопрос, на который трудно ответить, если вы не очень хорошо знакомы с шахматным программированием.

Последний вопрос: как измеряется скорость поиска в двумерном массиве по сравнению с использованием одномерного массива и добавлением 16 * team_side к нормальному индексу для поиска фрагмента?

edit : Я подумал, что должен добавить, что я оцениваю скорость больше, чем все остальное в моей шахматной реализации. Зачем еще мне использовать магические битборды, а не просто массивы с данными слайдов?

1 Ответ

1 голос
/ 25 марта 2012

Стандартного ответа на этот вопрос нет, извините.

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

Чтобы получить максимальную скорость, ваша задача - выяснить, что лучше всего подходит для вашей программы. Приводит ли поддержание дополнительного массива частей к чистому ускорению программы? Это зависит!

Иногда поддержание структуры данных является чистым выигрышем, иногда вы можете отложить вычисления и кэшировать результат, а иногда просто вычисляете его при необходимости (и надеетесь, что это не нужно очень часто).

...