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

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

  1. WildCat
    Оффлайн

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

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

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

    Chemer Максим

    Репутация:
    0
    Заработало! УРРРРРА!!!!!!!

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

    "Век живи - век учись, все равно дураком сдохнешь!"
     
  3. WildCat
    Оффлайн

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

    Репутация:
    0
    Chemer, Зарегистрирован: 14/09/2006 - уже давно пора знать, что я - Кошка ;)
     
  4. Chemer
    Оффлайн

    Chemer Максим

    Репутация:
    0
    Извени, я просто у тебя на сайте видел, явно кота, с пивом и сигретой. :D
     
  5. WildCat
    Оффлайн

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

    Репутация:
    0
    Это заблуждение. Нельзя всегда мыслить стереотипами :)
     
  6. NS
    Оффлайн

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

    Репутация:
    3
    Сейчас поищу, но я где-то на этом форуме их уже выкладывал...
     
  7. Chemer
    Оффлайн

    Chemer Максим

    Репутация:
    0
    Спасибо NS. Я уже разрулил.
     
  8. Chemer
    Оффлайн

    Chemer Максим

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

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

    Репутация:
    3
    Феном? А как отслеживать повторение позиции будешь?

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

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

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

    Репутация:
    95
    Так задумано. UCI - изначально stateless протокол.

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

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

    Репутация:
    0
    Мне так не кажется. И с NS я тоже не согласен :p
     
  12. NS
    Оффлайн

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

    Репутация:
    3
    Парсинг строки + Используется встроенный генератор ходов.
    Если Фен, то Fen(s) - у меня это двадцать строк.
    Если startpos - то InitBoard()

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

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

    У меня ровно 20 строк и есть :)
     
  13. WildCat
    Оффлайн

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

    Репутация:
    0
    Никто не обещал один пробел между словами.
    WB - проще :p
     
  14. NS
    Оффлайн

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

    Репутация:
    3
    А кто мешает при получение строки из потока Убрать все символы с кодом меньше 32, и сократить все пробелы до одного? На встроенном языке 1С это делается в три строки.
    На Делфи в несколько строк :)

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

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

    Репутация:
    0
    Неужели ты сделал это в Анечке :rolleyes:
     
  16. NS
    Оффлайн

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

    Репутация:
    3
    Неа, забыл :(
    Но сделать как раз не тяжело :)
    Кстати, в встроенном языке 1С парсинг строки (разбиение на слова) делается одним оператором...

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

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

    Репутация:
    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
    Оффлайн

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

    Репутация:
    95
    Функции strtok() это не помеха.
     
  19. WildCat
    Оффлайн

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

    Репутация:
    0
    Хорошая функция :)
     
  20. Vlad_Imir
    Оффлайн

    Vlad_Imir Новичок

    Репутация:
    20
    У меня своя оболочка, мне надо наоборот - подключать движки (UCI стандарт). Может кто подскажет, если есть какие-то источники с кодом, чтоб не делать все с нуля.
     
  21. NS
    Оффлайн

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

    Репутация:
    3
    Где-то была в этои разделе соответствующая ветка...
    У меня есть код моего переходника на Делфи.
    На Си можно сделать так-же.
     
  22. Chemer
    Оффлайн

    Chemer Максим

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

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

    Репутация:
    3
    Число ходов для правила 50 ходов, и число ходов с начала партии....
     
  24. WinPooh
    Оффлайн

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

    Репутация:
    95
    0 - это счётчик для правила пятидесяти ходов
     
  25. NS
    Оффлайн

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

    Репутация:
    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. Chemer
    Оффлайн

    Chemer Максим

    Репутация:
    0
    Понял. Спасибо!
     
  27. Chemer
    Оффлайн

    Chemer Максим

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

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

    Репутация:
    3
    Защищенная проходная, связанные проходные, сдвоенные изолированные, пешечная фаланга.
    Слабая пешка, слабая пешка на открытой вертикали.
     
  29. WinPooh
    Оффлайн

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

    Репутация:
    95
    Кстати, а какое определение "островка"? Просто несколько пешек на соседних вертикалях? Следует ли учитывать их относительное положение по степени продвинутости?

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

    Chemer Максим

    Репутация:
    0
    Островок - действительно несколько пешек на соседних вертикалях.
     
  31. Chemer
    Оффлайн

    Chemer Максим

    Репутация:
    0
    Как вы распределяете премии и штрафы по пешечным признакам?
     
  32. SkySandy
    Оффлайн

    SkySandy Александр

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

    MS Михаил Семионенков

    Репутация:
    175
    Может, кто знает: в Питоне такая проблема будет?
    Если да, как ее решать.

    Спасибо.
     
  34. Chemer
    Оффлайн

    Chemer Максим

    Репутация:
    0
    Ого! А питон то зочем? Чо си мало?
     
  35. WinPooh
    Оффлайн

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

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