Comments 26
«А не замахнуться ли нам на Вильяма, понимаете ли, нашего Шекспира?» (с)
Да, тема огромная. Но вот лежал движок шахматный и, думаю, вдруг кому интересно будет. Может, свои шахматы напишут с ЭЛО 4000. :)
так и мышкой — левая кнопка откуда, правая — куда

А почему, не как принято и удобно, когда вы выбираете фигуру, то для неё известны все доступные перемещения, можно подсветить их и клик по одному из них — подтверждение хода.
А так проще было реализовать в GUI и к тому же сложно случайно походить не туда. Как я уже и говорил, интерфейс писался на скорую руку.

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


vector<Move> generate_moves(int pos_x, int pos_y, vector<Piece> & pieces)

Я смотрел движки как Stockfish, и там это могло быть реализуемым, так как от каждой фигуры требуется только список ходов и ее "цена", но правила там вшиты намертво наподобии этих AHIIIIEWB0MFFF. Т.е. такой возможности нет нигде, даже в шахматы Фишера не поиграешь.
А так можно было бы собрать свои доски как угодно и поиграть в сказочные шахматы. Чтобы понять эпичность, можно посмотреть на список — Fairy chess piece.

Просто быстродействие для движков — это жизнь. Ведь там как делается? Вам дали, скажем, 10 секунд на ход. Вы запускается бесконечный анализ с увеличением глубины до тех пор, пока время не закончится. И чем дальше вы успели зайти, тем лучше. Вот потому и вшивают жёстко в надежде на максимальную скорость. Для того же и битовые маски ходов придумали — они ещё быстрее.
Кстати, в моём движке нет такого итеративного углубления, он считает сразу на максимальную глубину и ограничений по времени не имеет.
Реализовать игру с произвольными правилами и реализовать сильную игру — противоположные направления развития. Мало кому интересна программа, которая может кое-как играть во что угодно. Большинству интереснее программа, которая играет в единственный вариант, но играет бескомпромиссно сильно.

Если не делать программу для свержения Магнуса Карлсена, то для любительского уровня должно выйти нормально по уровню, даже если на Java писать. К тому же книга Корнилова из 2005 года, когда компьютеры были "мощные" как современные телефоны. Прямо уж свет клином сошелся — трюки делать с битовыми операциями.

Так не интересно же делать программу для новичка. Интересно делать лучшую программу. Для этого даже соревнования между программами устраивают (та же Arena для этого хороша). А как приятно, когда местный шахматист-профессионал проигрывает твоей программе! :)
Вот вы, к примеру, на каком уровне в Шахматы играете? А в Шашки? В Го? В Сянцы? Зачем вам лично программа, которая будет играть на уровне гроссмейстера если вы сами играете на уровне новичка? Наверное, программа играющая на вашем уровне тоже будет интересна? Есть целый ряд игр (Манкалы, Реверси и пр.) принципиально сложных для человека. В эти игры вы не выиграете (или выиграете с очень большим трудом) даже у универсального движка. Зачем там специализированный?

Конечно мало смысла делать на универсальном движке Шахматы. Для них есть масса специализированных движков. Но как только речь заходит о вариантах, универсальность выходит на первый план. Очень трудоёмко писать каждую реализацию на C++, как в ChessV. Гораздо быстрее набросать прототип на каком нибудь DSL (например ZRF), пощупать его, а если понравится, думать о том как сделать так, чтобы движок играл посильнее. Способы есть.
Я ни на каком. :) За меня вот эта вот программа играет. :) И именно поэтому я лично стремился к её максимальному ЭЛО в меру своих возможностей. А так — у меня тут есть товарищи, которые мастера FIDE.
Вопросов нет. Есть направление развития специализированных движков и есть направление развития универсальных движков. Последними интересуются безусловно меньше, но интересуются.
Причем тут выбор языка программирования, мощность компьютера и трюки с битовыми операциями вообще?
Другие правила игры — другие правила оценки позиции. Причем, если для шахмат уже к началу создания первых программ был накоплен колоссальный эмпирический опыт, то как оценивать позиции в любой нестандартной игре абсолютно неясно.
Причем тот же StockFish до сих пор развивается в том числе и в направлении улучшения оценки позиций на сотнях тысяч партий в распределенной системе тестирования. Поэтому даже на телефоне обыграет подавляющее большинство игроков-людей.
А как улучшать силу игры для экзотических разновидностей, если нет ни теоретической базы, ни огромных вычислительных мощностей под рукой для подбора настроек методом грубой силы? Так и будет программа играть во все, что угодно, но на уровне чуть выше своего создателя.
Мало кому интересна программа, которая может кое-как играть во что угодно

Мне интересна. И вот этим товарищам тоже. Конечно, желательно всё таки не «кое-как», а где-то на уровне среднего игрока. Не гроссмейстера, конечно. А так, да, специализированные движки бьют универсальные не напрягаясь.
Совершенно верно! :) Давным-давно, в 2000 году я уже писал под MS-DOS шахматную программу. Графику же я взял как раз из демонстрационной программы для OWL от Borland C++. Но вот цвета поменял — мне больше нравится оранжевое поле, на нём видно лучше.

OWL Chess была в Борланд паскале, который под windows 3.1 компилировал. Это 1992 год.
Я ее когда-то в virtual pascal под 32 бита пересобирал, она у меня до сих пор живет.

Под вайном в Линуксе вываливается после:


uci
id name Centurion 1.0 16.04.2015
id author Dmitriy Trunov (Da-nie)
uciok
isready
readyok
position fen rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq — 0 1
go movetime 3000

Рыбка и Стокфиш работают.
Ввод позиций из фен-строки у вас не поддерживается, я так понимаю.

Да, не поддерживается. Только с исходной позиции. Там упрощённый UCI. Я UCI делал только чтобы с Arena запустить и посмотреть, кого и как я обыгрываю, а кого нет. Иначе не видно, лучше играет при изменении программы или хуже.
Движок вот какие команды UCI поддерживает: uci, stop, isready, ucinewgame,position startpos, position moves, quit, go.
как-то писал в школе свои шахматы за пару дней. АИ сделал самым тупым способом — рандом+приоритет по очкам.
Так его и никто не смог победить, ибо он читирил). Когда он срубал мою фигуру из нее вылуплялся ферзь. Этакие зомби-шахматы :)
Кстати, было бы интересно узнать, кто выиграл у моего движка. :) На работе у меня есть люди, выигрывающие в половине партий. Правда, они довольно приличные шахматисты.

Я выигрываю обычно, если начинаю думать, а не просто шлёпаю.
Но я тоже шахматами серьёзно занимался в детстве-юности.

Я выиграл (подробности отправил в диалоги), там есть PGN-файл. Надеюсь, что сможете найти возможности для улучшения из моей партии. Правда, у меня 3-й разряд.
Да, спасибо за информацию. :) Я не думал, что можно так сделать и оно выйдет. :) Это почти чит — разменять фигуры и уйти в эндшпиль, в котором есть ситуации, когда человеку просчитать куда как проще, чем программе. Тут таблицы Налимова могут помочь. Но я их не делал.
Only those users with full accounts are able to leave comments. Log in, please.