Как написать на С# шахматную игру?

У меня есть вопрос. Я хочу написать шахматную программу, применяющую следующие правила:

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

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


person Arash    schedule 02.10.2010    source источник
comment
Что означает первая сторона должна матировать вторую сторону с наименьшими движениями?   -  person Gabe    schedule 02.10.2010
comment
Если вы никогда не пытались написать шахматное приложение, я бы сначала сосредоточился на том, как вы собираетесь представлять доску/фигуры. Затем работайте только над правильными ходами. Если вы никогда не пробовали это раньше, это займет у вас около 3 месяцев работы. К этому времени вы, вероятно, решите отказаться от него и использовать одно из сотен шахматных приложений с открытым исходным кодом.   -  person Randy Minder    schedule 02.10.2010
comment
первая сторона означает, что орехи, например, белые, а вторая - черные.   -  person Arash    schedule 02.10.2010
comment
@randy minder: нет, я никогда не пробовал писать шахматные коды. так что ты мне предлагаешь сделать? я нашел несколько кодов шахматных игр в Интернете   -  person Arash    schedule 02.10.2010
comment
@Arash - Написать шахматный движок чрезвычайно сложно. По крайней мере, заставить одного играть на любом уровне, кроме худшего новичка. Если есть время и силы, дерзайте! Если нет, загрузите последнюю версию движка Stockfish (1.8). Это, вероятно, самый сильный шахматный движок с открытым исходным кодом, доступный прямо сейчас.   -  person Randy Minder    schedule 02.10.2010
comment
@ Рэнди, я понимаю вопрос так, что это не настоящая игра в шахматы, а скорее простой логический решатель головоломок, использующий шахматы для определения правил головоломки. Решение, вероятно, будет связано с алгоритмами ветвления, используемыми в шахматных ИИ, но гораздо проще.   -  person Dan Bryant    schedule 02.10.2010


Ответы (4)


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

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

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

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

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

  5. Если вы можете использовать грубую силу и вам нужно ускорить работу, подумайте, есть ли ходы, которые, как вы можете доказать, не принесут пользы. Если это так, вы можете сразу же исключить эти ходы из поиска, сэкономив на количестве ветвей, которые вам нужно учитывать. Вы также можете работать над оптимизацией своих функций оценки, поскольку более быстрая оценка очень полезна, когда вы выполняете миллиарды из них. Наконец, вы можете придумать некоторые эвристики, чтобы оценить, какую из ветвей попробовать в первую очередь. Чем быстрее вы сможете прийти к «хорошему» решению, тем меньше случаев вам придется рассмотреть, чтобы найти оптимальное решение.


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

person Dan Bryant    schedule 02.10.2010
comment
Вопрос не совсем проясняет. Если король пытается поставить себе мат, то я ожидаю, что этого можно легко добиться за 3 хода белых. - person Kirk Broadhurst; 03.10.2010

Взгляните на этот вопрос SO (Программирование шахматного ИИ).

Судя по ответам на этот вопрос, я думаю, что это C# Chess Game Starter Kit было бы хорошим началом, но я бы также посмотрел на другие статьи, на которые есть ссылки, для получения некоторой интересной истории/информации.

person Jeff Ogata    schedule 02.10.2010
comment
спасибо, но я хочу сделать это сам, а не использовать готовые шахматные партии - person Arash; 06.10.2010

Это простейший возможный пример базы данных эндшпиля. Всего позиций меньше 64^3 = 262144, поэтому вы можете легко сохранить оценку каждой позиции. В этом случае мы можем определить счет как количество ходов до мата для выигрышной позиции; или 255 за ничейную позицию. Вот план:

  1. Установите все оценки на 255.
  2. Ищите все матовые позиции и оценивайте их как 0.
  3. Установите глубину = 1.
  4. Для каждой ничейной позиции (оценка = 255) посмотрите, существует ли ход в выигранную позицию (точнее, посмотрите, существует ли ход в позицию, из которой все ходы противника проигрышны). Если да, установите его оценку на глубину .
  5. Если на шаге 4 не было найдено новой позиции, все готово.
  6. Увеличьте глубину и перейдите к шагу 4.

Теперь у вас есть таблица размером 250 КБ, которую вы можете сохранить на диск (не то, чтобы ее создание с нуля заняло много секунд). Если пространство важно, вы можете значительно уменьшить его с помощью различных уловок. В Википедии есть хорошая статья обо всем этом — поищите «Endgame tablebase».

person TonyK    schedule 02.10.2010

Плакат здесь предполагает, что Stockfish будет хорошим началом, но это проект C++, тогда как вы просите C#.

Решение зависит от вашего требования. Если вы заинтересованы в том, чтобы «просто заставить это работать», вы можете завершить проект, не написав более 200 строк кода. Вы можете внедрить проект C# с открытым исходным кодом и попросить движок сообщить вам количество ходов для сопряжения. Если проект с открытым исходным кодом поддерживается UCI, следующая команда выполнит эту работу:

go mate x

где х - количество ходов до мата.

Однако, если вам нужно думать самостоятельно. Вам нужно будет выбрать между эффективным битовым представлением или объектно-ориентированным представлением. Bitboard — гораздо лучшее представление, оно очень быстрое, но его сложнее программировать. Все шахматные движки используют битборд. В вашем проекте эффективность представления не слишком важна, поэтому вы можете выбрать объектно-ориентированное представление.

person SmallChess    schedule 05.10.2010
comment
спасибо, но я хочу сделать это сам, а не использовать готовые шахматные партии - person Arash; 06.10.2010