Какую парадигму использовать для написания шахматного движка?

9

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

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

совать
источник
1
Это сродни написанию компилятора C с нуля. Я бы не стал изобретать велосипед. Я бы сначала изучил существующие.
Работа
10
@Job: Моя цель - процесс, а не результат. Даже если у меня получится очень плохой движок, я думаю, что в процессе анализа проблемы и разработки способа ее решения может быть полезным, особенно если я изучу некоторые новые методы программирования в этом процессе.
тыкай
1
Удачи. Ни один реальный работодатель никогда не попросит вас разработать его с нуля, но во время интервью они могут спросить, как вы решите проблему.
Работа
6
@ Делать большую часть жизни в программировании - это кодирование вещей не потому, что в этом есть определенная потребность, а потому, что вы можете.
1
@ Марк, как насчет жизни;) = путешествия, языки, театр, поэзия, отдых на природе и т. Д.? Мне нравится программирование, но когда я не занимаюсь этим как таковым, у меня есть 1000 других дел.
Работа

Ответы:

7

Насколько мне известно, оценка - это не распараллеливаемая проблема, но оценка различных цепочек такова, поэтому я бы окончательно написал ее, чтобы использовать несколько ядер и многопоточность.

Работаете ли вы функционально или полуфункционально - дело вкуса. Лично я бы пошел ООП и использовал бы поддержку для функционального программирования и распараллеливания, которая существует, например, в C #

С другой стороны, если бы я написал шахматный движок, я бы попытался создать такой, который действительно мог бы «думать» о шахматах. Используя оценку доски для грубой силы, все возможные комбинации были сделаны до смерти и очень хорошо, но на самом деле не было большого прогресса в создании более размышляющего / нечеткого шахматного движка. Это было бы проблемой! :)

Найдите некоторые игры с действительно сложной позиционной игрой и сильными ходами (они отмечены! Или !!) и используйте их для тренировки и тестирования своего движка.

Homde
источник
2

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

Омега Центавра
источник
2

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

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

Свежая кровь
источник
Как это оценивает ELO-мудрый? По сравнению с Лукавым?
@ Thorbjørn Ravn Andersen - Лукавый один из лучших шахматных движков с открытым исходным кодом, написанный на C и доктором Робертом М. Хаяттом, который всю свою жизнь занимался шахматным программированием. К сожалению, я не проверял рейтинг elo, потому что перед тестированием elo есть еще много дел. В настоящее время оценка - это просто оценка значений кусков, поэтому она имеет довольно слабую оценку, и все же я еще не реализовал все необходимые алгоритмы. К сожалению, сейчас у меня нет времени тратить на этот проект. Я надеюсь, что однажды удастся продолжить.
Freshblood
ах извини, я думал, что это действительно может играть. Виноват.
@ Thorbjørn Ravn Andersen - я опубликовал там несколько выпусков и готовый к сборке последний набор изменений репозитория. Я просто хотел сказать, что сейчас он довольно слабый.
Freshblood
2

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

Можно было бы подумать, что функциональное программирование было бы хорошо для шахматных программ, поскольку основные алгоритмы (поиск, оценка глубины в альфа-бета-версии) рекурсивны и функционально строги. Тем не менее, шахматная программа живет и умирает от эффективности, и ни одна из нынешних культур функциональных языков не преследует этой цели. Лучшие 100 современных движков используют императивные языки (в основном C / C ++, а затем Delphi), чтобы иметь максимальный контроль над использованием памяти, многопоточностью, глобальным состоянием и генерацией кода. Все функциональные языки используют динамическое распределение памяти для основных структур данных, что является смертью для шахматной программы.

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

Ян Осгуд
источник