что бы вы делали на шахматной доске? (часть позиции) - PullRequest
3 голосов
/ 06 мая 2009

вы бы создали 3 списка (координат) для

  • пустая позиция
  • черная позиция
  • белая позиция

или просто зацикливать массив при необходимости и каждый раз воспроизводить результат?

что будет лучше? (по скорости)

Ответы [ 3 ]

7 голосов
/ 06 мая 2009

Ваши два основных выбора находятся между скоростью и четкостью кода.

Если скорость является вашим приоритетом, то вы должны использовать 64-битный тип данных для каждого набора фигур на доске (например, белые пешки, черные королевы, пешки на проходе). Затем вы можете использовать собственные побитовые операции при генерации ходов и тестировании законности ходов.

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

Чтобы начать, посмотрите код Лукавый (C) и SharpChess (C #).

(Первоначально опубликовано здесь )

2 голосов
/ 06 мая 2009

То, что вы ищете, это представление доски . В Шахматном программировании Wiki есть очень подробный раздел по этой теме (определенно стоит прочитать, если вы серьезно относитесь к написанию ИИ), в то время как Wikipedia предлагает хороший обзор по этому вопросу.

Важно быть очень вдумчивым при выборе подходящего представления совета - все они предлагают свои уникальные преимущества (и ловушки) - в основном, связанные со скоростью / выполнением определенных операций, таких как выполнение ходов и оценка состояния доски (обычно в диапазоне от O (1) до O (n) сложность времени в зависимости от метода и задачи). Насколько я знаю, до сих пор нет единого мнения о «наилучшем» представлении платы, хотя в настоящее время некоторые, как правило, предпочтительнее других (например, битборды почти обязательны). Вот почему большинство сильных шахматных ИИ при поиске ходов используют несколько (до 4 или 5 даже) разных представлений на доске.

0 голосов
/ 06 мая 2009

Я бы предложил массив из 64 элементов, таких как:

byte [64] Squares;

Таким образом, вам нужно только представить позицию шахматной доски одним байтом, это намного быстрее.

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

Строка

Чтобы выяснить строку позиции, вы делите позицию на 8 и берете целую часть результата. Например, позиция 63, разделенная на 8, равна 7,875, что соответствует строке 7. Позиция 3, разделенная на 8, равна 0,375, поэтому 0. В C # путем приведения к целому числу вы всегда получите только целую часть числа, следовательно:

Row = (int)(position / 8)

Колонка

Чтобы вычислить столбец положения, вы используете оператор модуля, выполняя модуль 8 положения. Например, модуль 8 положения 24 - это столбец 0. Модуль 8 положения 15 - это 7, следовательно,

Column = position % 8

Вооружившись этими двумя концепциями, мы можем преобразовать любую позицию на нашей 64-квадратной доске в столбец и строку.

Если вы хотите больше узнать о создании собственного шахматного движка, взгляните на http://www.chessbin.com

...