2009-05-06 3 views
3

бы создать 3 список (координаты) дляЧто бы вы сделали в шахматной доске? (Часть позиции)

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

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

Что было бы лучше? (скорость)

+0

контратипе http://stackoverflow.com/questions/39874/how-do-i-model-a-chessboard -when-programming-a-computer-to-play-chess –

+0

@neil, я просто посмотрел, что это не обман. Мой вопрос - это конкретный вопрос, и этот вопрос, который вы связали, не отвечает на него – Fredou

ответ

7

Ваши два основных варианта: скорость и четкость кода.

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

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

Для того, чтобы начать поиск, ознакомьтесь с кодом для Crafty (C) и SharpChess (C#).

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

+0

У меня что-то похожее на затычки – Fredou

+0

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

+0

@John - самые маленькие различия в скорости значительны, когда рутина называется миллиардами раз. В пользовательском интерфейсе речь идет не только о восприятии пользователей. –

2

Что вы ищете является представлениемдоски. У Chess Programming Wiki есть очень подробный раздел по этой теме (определенно стоит прочитать, если вы серьезно относитесь к написанию AI), а Wikipedia предлагает хороший обзор по теме.

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

0

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

byte [64] Squares; 

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

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

Ряд

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

Row = (int)(position/8) 

Колонка

Чтобы выяснить столбец позиции, которую вы используете оператор модуля, выполнив положение модуля 8. например, положение 24 модуля 8 столбец 0. позиция 15 модуль 8: 7, следовательно,

Column = position % 8 

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^