UCI протoкол - c чего начинать?

Тема в разделе "Машинное отделение", создана пользователем Chemer, 16 мар 2007.

  1. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Сразу после запуска движок должен отключить буферизацию ввода/вывода. Т.к. иначе он не сможет нормально общаться с графической оболочкой.

    На Си это делается так:
    Код:
    setbuf(stdout, 0);
    setbuf(stdin, 0);
    На Си++:
    Код:
    cout.rdbuf()->setbuf(NULL, 0);
    cin.rdbuf()->setbuf(NULL, 0);
  2. TopicStarter Overlay

    Chemer Максим

    • Участник
    Рег.:
    14.09.2006
    Сообщения:
    1.674
    Симпатии:
    13
    Репутация:
    0
    Адрес:
    Запорожье
    Оффлайн
    Заработало! УРРРРРА!!!!!!!

    Спасибо тебе огромное Дикий Кот! Все воскресенье продолбался, не мог понять в чем дело!

    "Век живи - век учись, все равно дураком сдохнешь!"
  3. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Chemer, Зарегистрирован: 14/09/2006 - уже давно пора знать, что я - Кошка ;)
  4. TopicStarter Overlay

    Chemer Максим

    • Участник
    Рег.:
    14.09.2006
    Сообщения:
    1.674
    Симпатии:
    13
    Репутация:
    0
    Адрес:
    Запорожье
    Оффлайн
    Извени, я просто у тебя на сайте видел, явно кота, с пивом и сигретой. :D
  5. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Это заблуждение. Нельзя всегда мыслить стереотипами :)
  6. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Сейчас поищу, но я где-то на этом форуме их уже выкладывал...
  7. TopicStarter Overlay

    Chemer Максим

    • Участник
    Рег.:
    14.09.2006
    Сообщения:
    1.674
    Симпатии:
    13
    Репутация:
    0
    Адрес:
    Запорожье
    Оффлайн
    Спасибо NS. Я уже разрулил.
  8. TopicStarter Overlay

    Chemer Максим

    • Участник
    Рег.:
    14.09.2006
    Сообщения:
    1.674
    Симпатии:
    13
    Репутация:
    0
    Адрес:
    Запорожье
    Оффлайн
    Немогу понять почему оболочки перед каждым ходом задают движку позицию таким странным способом:
    Код:
    position startpos moves g1f3 b8c6 b1c3 g8f6 e2e4 d7d5 e4d5 ...
    неужели движок не в состоянии запомнить позицию? :)
    мне кажется удобнее и быстрее передавать последним ходом, или хотябы феном.
  9. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Феном? А как отслеживать повторение позиции будешь?

    Передавать ход? А если партию ты играешь не с первого хода?
    Вместо одной команды хочешь получить кучу как в протоколе WinBoard?

    Лучше уж одна универсальная команда.
    Тем более её реализация - у меня это пара десятков строк. (ну еще и процедура из пары десятков строк на FEN) И выполняется она моментально.
  10. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.492
    Симпатии:
    3.122
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Так задумано. UCI - изначально stateless протокол.

    Типа, при нынешних скоростях затратить какие-нибудь десятки микросекунд на прокручивание позиции от начальной до текущей - ничего не стоит. А код движка проще получается.
  11. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Мне так не кажется. И с NS я тоже не согласен :p
  12. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Парсинг строки + Используется встроенный генератор ходов.
    Если Фен, то Fen(s) - у меня это двадцать строк.
    Если startpos - то InitBoard()

    Проверка элементарна.
    if Copy(s,1,17)='position startpos'
    То-же самое и с Феней.

    Исполнение ходов - Парсинг строки (с этим наверно ни у кого проблем нет, можно использовать готовые процедуры которые разбивают строку на слова. Пробел - разделитель), выцепляем по одному ходу.
    Потом встроенный генератор, цикл по ходам. И
    if MovetoStr(tekMoves)=strMoves Then Make_Move(tekMoves)

    У меня ровно 20 строк и есть :)
  13. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Никто не обещал один пробел между словами.
    WB - проще :p
  14. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    А кто мешает при получение строки из потока Убрать все символы с кодом меньше 32, и сократить все пробелы до одного? На встроенном языке 1С это делается в три строки.
    На Делфи в несколько строк :)

    На встроенном языке 1С:
    Код:
    Стр=Нрег(СокрЛП(стр));
    Пока Найти(стр,"  ")>0 Цикл
      Стр=СтрЗаменить(Стр,"  "," ");
    КонецЦикла;
    В двух местах в кавычках два пробела.
  15. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Неужели ты сделал это в Анечке :rolleyes:
  16. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Неа, забыл :(
    Но сделать как раз не тяжело :)
    Кстати, в встроенном языке 1С парсинг строки (разбиение на слова) делается одним оператором...

    В протоколе UCI нужно еще правильно отработать команду ponder - она может быть в любом месте команды go - например полиглот шлет не go ponder, а размещает ponder в самом конце строки - после moves
  17. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Код:
    function ReadNS:AnsiString;
    Var
      chBuf,poslS: Char; BufSize,i: DWORD; res:boolean; s:AnsiString;
    begin
      chbuf:=chr(0);
      BufSize:=0;
      sleep(1);
      Res:=PeekNamedPipe(StdOutPipeRead, nil, 0, nil, @BufSize, nil);
      Res:=Res and (BufSize > 0);
      poslS:=' ';
      If Res Then
        while chbuf<>chr(10) do
        begin
            s:='';
            for I := 1 to Bufsize do
            Begin
            chBuf:=chr(0);
            ReadFile(StdOutPipeRead, chBuf, 1, BufSize, Nil);
            if chBuf>chr(31) then 
            if (poslS<>' ') or (chBuf<>' ') Then
            begin
             s:=s+chBuf;
             poslS:=chBuf;
            end;
            if chBuf=Chr(10) then break;
            end;
           Result:=s;
        end
        Else
            Result:='';
    end;
    Вот, теперь реализовал :)
    Добавил одну переменную и одно условие.
    Двойные пробелы теперь отсекаются в момент чтения буфера.
  18. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.492
    Симпатии:
    3.122
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Функции strtok() это не помеха.
  19. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Хорошая функция :)
  20. Vlad_Imir Новичок

    • Новичок
    Рег.:
    12.11.2006
    Сообщения:
    77
    Симпатии:
    284
    Репутация:
    20
    Адрес:
    Россия
    Оффлайн
    У меня своя оболочка, мне надо наоборот - подключать движки (UCI стандарт). Может кто подскажет, если есть какие-то источники с кодом, чтоб не делать все с нуля.
  21. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Где-то была в этои разделе соответствующая ветка...
    У меня есть код моего переходника на Делфи.
    На Си можно сделать так-же.
  22. TopicStarter Overlay

    Chemer Максим

    • Участник
    Рег.:
    14.09.2006
    Сообщения:
    1.674
    Симпатии:
    13
    Репутация:
    0
    Адрес:
    Запорожье
    Оффлайн
    Я немогу понять, что в FENe значат некоторые поля:
    Код:
    rnbqkbnr/pp3ppp/8/2pPp3/8/2N5/PPPP1PPP/R1BQKBNR w KQkq c6 0 4
    что такое с6 - я догадываюсь - что это битое поле для енпасанта, и что значит следующий 0? А остальное я уже реализовал.
  23. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Число ходов для правила 50 ходов, и число ходов с начала партии....
  24. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.492
    Симпатии:
    3.122
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    0 - это счётчик для правила пятидесяти ходов
  25. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Halfmove clock: This is the number of halfmoves since the last pawn advance or capture. This is used to determine if a draw can be claimed under the fifty move rule.

    Fullmove number: The number of the full move. It starts at 1, and is incremented after Black's move.

    http://en.wikipedia.org/wiki/FEN
  26. TopicStarter Overlay

    Chemer Максим

    • Участник
    Рег.:
    14.09.2006
    Сообщения:
    1.674
    Симпатии:
    13
    Репутация:
    0
    Адрес:
    Запорожье
    Оффлайн
    Понял. Спасибо!
  27. TopicStarter Overlay

    Chemer Максим

    • Участник
    Рег.:
    14.09.2006
    Сообщения:
    1.674
    Симпатии:
    13
    Репутация:
    0
    Адрес:
    Запорожье
    Оффлайн
    В данный момент занимаюсь реализацией в ОФ пешечной структуры. Хочю сделать систему штрафов и премий:
    1. за каждый >1 островка штраф
    2. за отсталую пешку штраф
    3. за сдвоенную пешку штраф
    4. за проходную премия
    5. и еще за изолятор
    дополнительно штраф (я сам нелюблю играть с изолятором и пусть моя прога нелюбит :D)
    Как мне распределить (в каких пропорциях относительно стоимости пешки (1000 ед)) штрафы и премии? И еще может какието признаки не учел?
  28. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Защищенная проходная, связанные проходные, сдвоенные изолированные, пешечная фаланга.
    Слабая пешка, слабая пешка на открытой вертикали.
  29. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.492
    Симпатии:
    3.122
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Кстати, а какое определение "островка"? Просто несколько пешек на соседних вертикалях? Следует ли учитывать их относительное положение по степени продвинутости?

    Ясно, что a7, b7 при отсутствии чёрной пешки на линии с - островок. a7, b6 - тоже. a7, b2 - определённо не островок. А вот a7, b5? А при белой пешке на a6?
  30. TopicStarter Overlay

    Chemer Максим

    • Участник
    Рег.:
    14.09.2006
    Сообщения:
    1.674
    Симпатии:
    13
    Репутация:
    0
    Адрес:
    Запорожье
    Оффлайн
    Островок - действительно несколько пешек на соседних вертикалях.
  31. TopicStarter Overlay

    Chemer Максим

    • Участник
    Рег.:
    14.09.2006
    Сообщения:
    1.674
    Симпатии:
    13
    Репутация:
    0
    Адрес:
    Запорожье
    Оффлайн
    Как вы распределяете премии и штрафы по пешечным признакам?
  32. SkySandy Александр

    Рег.:
    13.07.2007
    Сообщения:
    4
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Ростов-на-Дону
    Оффлайн
    А есть ли в интернете страничка посвященная UCI протоколу? А то я смотрю есть 1-я версия протокола, есть 2-я
    Или то, что находится в http://download.shredderchess.com/div/uci.zip есть последняя версия протокла?
  33. MS Михаил Семионенков

    • Команда форума
    Рег.:
    11.02.2006
    Сообщения:
    6.542
    Симпатии:
    3.361
    Репутация:
    175
    Оффлайн
    Может, кто знает: в Питоне такая проблема будет?
    Если да, как ее решать.

    Спасибо.
  34. TopicStarter Overlay

    Chemer Максим

    • Участник
    Рег.:
    14.09.2006
    Сообщения:
    1.674
    Симпатии:
    13
    Репутация:
    0
    Адрес:
    Запорожье
    Оффлайн
    Ого! А питон то зочем? Чо си мало?
  35. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.492
    Симпатии:
    3.122
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Ну, может человек оболочку для движка на Питоне пишет. А для оболочки, думаю, всю буферизацию тоже надо отключать.

Поделиться этой страницей