Как подключить UCI?

Тема в разделе "Машинное отделение", создана пользователем gudvinn, 4 авг 2006.

  1. gudvinn
    Оффлайн

    gudvinn Учаcтник

    Репутация:
    0
    Хочу написать простенькую шахматную программу на Visual C.

    Как подключить UCI?

    Выбираю Win32 проект. Без MFC.
    Надо подключить к оболочке: Arena.

    Нет ли где простого примера как взаимодействовать?
     
  2. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    Конечно, примеры есть.
    Одним из самых чистых по стилю и приятных для чтения считается код движка Fruit:
    http://wbec-ridderkerk.nl/html/download/fruit/fruit_21.zip

    Это к тому же очень сильный UCI-движок, так что Вы там можете почерпнуть много и кроме реализации протокола.

    Да, а с документацией на сам протокол Вы уже ознакомились?
    http://www.aarontay.per.sg/Winboard/uciapril.html, на всякий случай
     
  3. gudvinn
    Оффлайн

    gudvinn Учаcтник

    Репутация:
    0
    Спасибо за ответ.
    Обе ссылки не работают.

    По ссылке wbec-ridderkerk.nl нашел страницу Download. Там можно загрузить

    WinBoard-FG source (3,12MB). Наверное там реализован протокол

    WinBoard. Возможно мне он подойдет, но как пишут UCI больше распространен.
     
  4. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    Способ обмена UCI и Winboard одинаков. Отличаются только команды.
    Посмотреть пример можно в исходниках Fruit-а, на сайте Winboard, можно нигде не смотреть, а просто пользоваться консольным вводом/выводом :)
    Я использую WriteFile, ReadFile, PeekNamedPipe - из Библиотеки windows.
     
  5. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    Первую только что проверил, пять секунд назад. Работает.

    Вы можете найти ещё десяток, если повторите мои действия: зайдёте в Гугл и наберёте запрос "UCI protocol description" :)
     
  6. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
  7. gudvinn
    Оффлайн

    gudvinn Учаcтник

    Репутация:
    0
    Спасибо.
    Описание протокола получил.

    Для NS.
    Если использовать Pipe, то наверное, надо несколько процессов запускать?

    Один для расчета дерева и один для приема команд? А как в процессе расчета реагировать на команды другого?

    Никогда не писал программ из нескольких процессов.
     
  8. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    Если использовать Pipe - то один процесс.
    У меня программа написана на Делфях, но в сях использование такое-же.
    Ссылку на пример сейчас дам.
     
  9. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
  10. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Лично я советую XBoard. На порядок проще. Делается за 10 минут. Единственное, что может быть не очень приятно, это реализацию ponder придется самому делать. Хотя в UCI с этим еще хуже.
     
  11. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    Почему хуже? Я очень быстро и легко сделал пондер.
    И поддержку протокола написал очень быстро и легко, и ни пондер, ни поддержку протокола ни разу не правил, за исключением go ponder, но это Полиглот шлет его в конце, а я просто думал что он может распологаться только сразу после go...
    В любом случае сама поддержка протокола всего несколько строк (во всяком случае у меня) - остальное - расчет времени на обдумывание и т.д. - к самому протоколу не относится.
     
  12. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    Не представляю, как можно в несколько строк уместить обработку вот такой, к примеру, команды:

    position startpos e2e4 e7e5 g1f3 b8c6 f1c4 g8f6 f3g5 d7d5 e4d5 f6d5 g5f7 e8f7 d1f3 f7g8 c4d5 d8d5 f3d5 c8e6 :)

    А там ТАКОЕ перед каждым ходом приходит... И чем дальше в лес, тем больше дров - ходу к 150-му длина сами понимаете какая становится :)
     
  13. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    Как? Цикл и Mаke_Move()...
    Плюс Процедура StartPos() - всё равно должна присудствовать...
    И BoardFromFen()
    Получается две команды
    position startpos
    и
    position fen
    после которых может следовать команда moves....
    В чем проблема не вижу :)
    в moves выделяем ходы (Это достаточно просто - они разделены пробелом :))
    И MakeMove(MoveFromString(MoveString));
    (не обращайте внимания на заглавные буквы - в Делфи это нормально)
     
  14. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    Можно слегка оптимизировать - в партии обычно каждая последующая такая строка будет содержать предыдущую как префикс... Если сделать проверку на префикс, не придётся все ходы с начала прокручивать, протокол перестаёт быть stateless. Но это ad hoc, только для случая одной продолжающейся партии.
     
  15. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    Зачем что-то откручивать и т.д.?
    Какая скорость исполнителя ходов?
    Сколько времени займет исполнить 250 ходов?
    Хеш таблицы у нас остались.
    Получилась ли позиция из предыдущей или нет - не важно. Получили позицию (со всеми предшедствующими ходами), и считаем...
     
  16. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    В суперблице (по 1 секунде на партию) это может оказаться критичным.
    А так - конечно, десятые доли процента...
     
  17. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    Непонятно только, зачем проделывать ОДНУ И ТУ ЖЕ работу много-много раз, если можно избавиться от неё одним вызовом функции strstr.

    А к 150-му полуходу таких лишних вызовов накопится не 150, а 150 * 150 / 2...

    В моей реализации каждый MakeMove содержит ещё и проверку на легальность. Так что становится жалко программу - она рвётся в бой, хочет варианты считать, а её по сотому разу заставляют e2e4 e7e5 из начальной позиции выполнять.

    Впрочем, дело вкуса :)
     
  18. bankuss
    Оффлайн

    bankuss Александр баннер

    Репутация:
    6
    согласен что UCI в этом плане неудобен - можно было бы сделать опцию - даешь оболочке некоторую команду и она начинает выдавать ходы по аналогии xboard. (т.е. не всю линию ходов а только поледний) не дал эту команду - выдает по умолчанию всю линию.

    но изменить стандарт UCI уже малореально :) хотя... кто его поддерживает?
     
  19. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Зачем вообще связываться с UCI, если есть XBoard?
     
  20. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    +1 :)
     
  21. bankuss
    Оффлайн

    bankuss Александр баннер

    Репутация:
    6
    WildCat есть в UCI кое-что, чего нет в xboard :)
     
  22. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    Этот вопрос неверно лучше задать на сайтах FruitChess и RybkaChess. :)
    Мне достачно того, что коммерческие продукты ChessBase которые я использую, напрямую не поддерживают windoard.
    Зачем использовать winboard если есть UCI?
    winboard протокол поддерживает FRC? А мульти PV? А нормальные настройки через диалоговые меню?
     
  23. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Конечно, в UCI есть парочку полезных вещей, но все это убивается его уродливой вычурностью. Но это дело вкуса.
     
  24. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    Вычурность только в способе передачи позиции. В UCI он более мощный, например оболочка может организовать сеанс одновеременной игры, Игру движков "через ход" и т.д.
    А в партии на 250 пулоходов нужно выполнить всего 15000 исполнений хода. то есть при 300kN/s - 0.05 секунды на всю партию тритится...
     
  25. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Я не имел в виду что-то конкретное (способо передачи позиции). Лично мне весь подход UCI кажется вычурным. Это мое личное субъективное отношение. Возможно если бы я наткнулся сначала на UCI, то он показался мне вполне нормальным. Но т.к. это уже произошло после увиденной красоты XBoard (красивее нельзя, можно только дополнить), то и получилось вот такое отношение.
     
  26. atoku
    Оффлайн

    atoku Модератор

    Репутация:
    0
    ЮСЯ полезна юзверям. Так как видно несколько вариантов при анализе.
     
  27. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    Я не сразу напоролся на UCI, я сначала написал оболочку под winboard...
    И мне UCI кажется более совпеменным, а насчет того что он мощней - наверно никто спорить не будет :)
    А .ini файлы, особенно ручная их правка даже для установки размеров Хеша - мне кажется полнейшим анахронизмом.
     
  28. atoku
    Оффлайн

    atoku Модератор

    Репутация:
    0
    NS, вы фанат ГУЕВ? ини файлы ни разу не анахронизм, а часто куда удобнее.
     
  29. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    Для меня, и для пользователей - настройка в Диалоговом окне намного удобней.
    ini Файлы могут использоваться программой (ДВИЖКОМ), но не должен пользователь ручками туда что-либо прописывать, так-же как и не должен копаться в реестре.
    То есть - Диалог, настроили, сохранили.
     
  30. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    Дело в том, что последнее время я работал в той нише (Учетные задачи) где использование настроечных файлов, редактируемых пользователем - абсолютно недопустимо. Только Диалоговые окна.
     
  31. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Ладно, заканчивайте эти "holy wars". Я просто хотел намекнуть, что не все так однозначно в этом мире :)
    И то, что люди имеют противоположные точки зрения вполне нормально.
     
  32. atoku
    Оффлайн

    atoku Модератор

    Репутация:
    0
    Я о том же. Ини файлы нужны в своем месте, а гуй - в своем! Но считать то или иное решение анахронизмом - некорректно. Они о разном.

    А вот реестр - это ошибочный путь. Нельзя хранить все в одном файле. Тем более если он такой сложный.
     
  33. chessboard
    Оффлайн

    chessboard Зарегистрирован

    Репутация:
    0
    Такой вопрос - можно ли указать номер порта для обмена по этому протоколу где-нибудь в настройках?
    Хочу реализовать обмен по определенному порту, напр >1024. Стандартный в/в плохо понимаю, т.к. не С программер, а если вспоминать VB, то указание имени файла куда все пишется необходимо. По этому вышеприведенные примеры на Дельфи не устраивают. Нужно сокетное соединение.
     
  34. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    Хм... Может быть, прежде чем приступать к сокетам, лучше всё-таки потратить неделю-другую на чтение Кернигана-Ричи, чтобы перестать "плохо понимать стандартный ввод-вывод"? Если Вы берётесь за системные вещи, которыми сокеты несомненно являются, знакомство с языком C, хотя бы на уровне чтения, мне кажется просто необходимым...

    Если хотите, это элемент программистской культуры.
     
  35. chessboard
    Оффлайн

    chessboard Зарегистрирован

    Репутация:
    0
    WinPooh, спасибо за совет, но я считал, что ответ на прямой вопрос еще короче, чем ваши замечания. Так можно указать конкретный порт или нет?
    За Кернигана-Ричи спасибо еще раз.