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

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

  1. Chemer
    Оффлайн

    Chemer Максим

    Репутация:
    0
    Я пишу свой движок. Уже играет сама с собо и со мной. Теперь хочю прикрутить к ней UCI и начинать тестить. Какой необходимый минимум команд (за оба направления) необходим, чтобы он смог играть под фрицевой оболочкой?
     
  2. NS
    Оффлайн

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

    Репутация:
    3
    'uci' отвечаешь
    'id name Anechka 0.08'
    'id author Sergei V. Nefedov'
    'uciok'


    'isready'
    отвечаешь 'readyok'


    'go' начинаешь считать, и возращаешь лучший ход командой.
    'bestmove'

    'position startpos moves'
    ничего не отвечаешь, только устанавливаешь нач. позицию и делаешь ходы после moves

    'stop'
    'quit'
     
  3. WildCat
    Оффлайн

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

    Репутация:
    0
    Мне кажется, что надо реализовать команду "go".
     
  4. Chemer
    Оффлайн

    Chemer Максим

    Репутация:
    0
    А контроль?
     
  5. WildCat
    Оффлайн

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

    Репутация:
    0
    Chemer делает клон Анечки?

    'position startpos moves'
    ничего не отвечаешь, только устанавливаешь нач. позицию и делаешь ходы после moves
    Это вроде относится к реализации команды go.
     
  6. NS
    Оффлайн

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

    Репутация:
    3
    Так две разные-же команды в протоколе!
    Обычно идут подряд, но возможно любое их сочетание.

    А зачем он нужен первой играющей версии? Потом добавишь.
     
  7. Chemer
    Оффлайн

    Chemer Максим

    Репутация:
    0
    :D:lol::D Неа! Но NS мне немного помогает.
     
  8. Chemer
    Оффлайн

    Chemer Максим

    Репутация:
    0
    А можете кто нить сбросить лог общения двух движков с оболочкой, если есть конечно, то я несовсем понял некоторые моменты.
     
  9. WildCat
    Оффлайн

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

    Репутация:
    0
    Я всегда думал, что position это всего лишь опция команды go, а не отдельная команда.
     
  10. NS
    Оффлайн

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

    Репутация:
    3
    Так Арена же ведет такой лог! Нажал "отладка", да и смотри сколько хочешь :)

    Может меня клинит, но это абсолютно отдельная команда :)
    go сама по себ ничего не делает кроме возврата лучшего хода.
    Десять раз послали go, программа должна всегда обдумывать одну и ту-же позицию.
    position служит как раз для смены позиции.

     
  11. WildCat
    Оффлайн

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

    Репутация:
    0
    ok
     
  12. WinPooh
    Оффлайн

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

    Репутация:
    95
    Начинать, конечно же, с тщательного прочтения спецификации от автора протокола:
    http://download.shredderchess.com/div/uci.zip

    Текст небольшой, всего 26 килобайт. Зато много вопросов сразу будет снято.
     
  13. Chemer
    Оффлайн

    Chemer Максим

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

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

    Репутация:
    3
    Я вроде тебе давал ссылки на русский перевод спецификации...
    Или не тебе? :)
     
  15. Chemer
    Оффлайн

    Chemer Максим

    Репутация:
    0
    Не не давал
     
  16. WildCat
    Оффлайн

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

    Репутация:
    0
    И еще было бы замечательно, если бы ты выложил свой код по поддержке UCI. Из тех, что я видел - самый красивый :)
     
  17. WinPooh
    Оффлайн

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

    Репутация:
    95
    Зато наверняка не самый легальный, в смысле корректности реализации протокола :)
    Самый "устойчивый" и правильный, вроде бы - у Фрукта.

    UCI-код есть вместе со всем остальным в архиве исходников.
    Вот прямые ссылки на файлы, относящиеся к делу:

    http://greko.chess.googlepages.com/commands.c - основные команды
    http://greko.chess.googlepages.com/search.c - обработка ввода во время размышления

    Да, и ещё - там всё в одну кучу свалено, и UCI-команды, и Winboard, и консольный режим.
     
  18. WildCat
    Оффлайн

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

    Репутация:
    0
    Когда я его смотрел мне так не показалось.
     
  19. NS
    Оффлайн

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

    Репутация:
    3
    А у меня наверно плохой :(
    Вот весь код моей программы:

    Код:
    var s:AnsiString;
    begin
     init();
     While true do
     begin
      s:=readNS();
      if s<>'' then
      begin
       if s='uci' then
       begin
        writeNS('id name Anechka 0.08');
        writeNS('id author Sergei V. Nefedov');
        writeNS('option name Ponder type check default true');
        writeNS('option name Hash type spin default 32 min 32 max 512');
        writeNS('uciok')
       end
       else
       if copy(s,1,9)='setoption' then setoption(s) else 
       if s='isready' then writeNS('readyok') else
       if s='quit' then 
       begin
        quit();
        exit;
       end
       else
       if copy(s,1,2)='go' then go(s) else  
       if copy(s,1,8)='position' then position(s)
      end
     end
    end.
     
  20. WildCat
    Оффлайн

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

    Репутация:
    0
    Ты все cкрыл от нас.
     
  21. NS
    Оффлайн

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

    Репутация:
    3
    Нет, я дал полностью текст программы. На этом она закончилась :)
    stop отрабатывается в search() и go()
    ponderhit в search()

    position() - очень простая процедура, наверно нет смысла её выкладывать :)
    а go() - это основная процедура, к протоколу она практически не имеет никакого отношение. Хотя выцепляется контроль, но это совсем просто.
     
  22. WildCat
    Оффлайн

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

    Репутация:
    0
    Так весь UCI в том и заключается, чтобы реализовать position() и go().
     
  23. NS
    Оффлайн

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

    Репутация:
    3
    position() выложу, её мне не жалко, а вот go() не дам :)
    Текст нечитабельный.
     
  24. Chemer
    Оффлайн

    Chemer Максим

    Репутация:
    0
    А если был нелегальный ход, то оболочка Quit посылает?
     
  25. WildCat
    Оффлайн

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

    Репутация:
    0
    А еще надо уметь много команд выполнять не прерывая перебора :)
     
  26. NS
    Оффлайн

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

    Репутация:
    3
    Только две команды. ponderhit и stop

     
  27. WildCat
    Оффлайн

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

    Репутация:
    0
    Я имею в виду другие.
     
  28. NS
    Оффлайн

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

    Репутация:
    3
    Во время перебора вроде по протоколу UCI оболочка больше ничего послать не может...
     
  29. WildCat
    Оффлайн

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

    Репутация:
    0
    Например, вот такие команды:
     
  30. NS
    Оффлайн

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

    Репутация:
    3
    У меня поддержки debug нет, но она добавляет всего одну строчку (две) в код. (для поддержки протокола просто меняем переменную)
     
  31. Chemer
    Оффлайн

    Chemer Максим

    Репутация:
    0
    2NS: Выложи пожалуста readNS() и writeNS().
     
  32. Chemer
    Оффлайн

    Chemer Максим

    Репутация:
    0
    Написал болвана:
    Код:
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>
    
    
    int get(char *wrd)
      {
        char ch;
        int i = 0;
        ch = getchar();
        while (ch == ' ' || ch  == '\n' || ch == '\r')
          ch = getchar();
        while (ch != ' ' && ch  != '\n' && ch != '\r' && ch !=EOF)
          {
            wrd[i] = ch;
            i++;
            ch = getchar();
          }
        wrd[i] = '\0';
        return i;
      }
    
    int word_cmp (char *s1, char *s2)
    {
      int i=0;
      while (s1[i] == s2[i])
        {
          if (s1[i] == '\0' && s2[i] == '\0')
            return 1;
          i++;
        }
      return 0;
    }
    
    int main(int argc, char * argv[])
    {
      char z[256];
      int n;
      while (1)
        {
          get(z);
          if (!strcmp(z,"uci"))
            {
              puts("id name Preved v0.01");
              puts("id author Maxim Chemeris");
              puts("uciok");
            }
          if (!strcmp(z,"isready"))
            {
              puts("readyok");
            }
    
          if (!strcmp(z,"go"))
            puts("bestmove g1f3");
    
          if (!strcmp(z,"quit"))
            return 0;
          if (!strcmp(z,"register"))
            {
              puts("registration checking");
              puts("registration ok");
            }
        }
      //getch();
      return 0;
    }
    С стандартными потоками работает нормально, проверял создавая текстовый файл с командами: uciin.txt:
    Код:
    uci
    isready 
    go 
    quit
    перенарпавил потоки : prevedUCI.exe < uciin.txt > uciout.txt
    uciout.txt:
    Код:
    id name Preved v0.01
    id author Maxim Chemeris
    uciok
    readyok
    bestmove g1f3
    работает - как ожидал, а с оболочкой чото связи нет :(
     
  33. WildCat
    Оффлайн

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

    Репутация:
    0
    А где обнуляются буфера ввода-вывода?
     
  34. WildCat
    Оффлайн

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

    Репутация:
    0
    Можно добавить вывод в лог всех принятых от оболочки команд, тогда будет понятнее что происходит.
     
  35. Chemer
    Оффлайн

    Chemer Максим

    Репутация:
    0
    Непонял, насчет обнуление буфера ввода вывода, можно поподробнее!