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

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

  1. TopicStarter Overlay

    Chemer Максим

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

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    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 Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Мне кажется, что надо реализовать команду "go".
  4. TopicStarter Overlay

    Chemer Максим

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

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

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

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

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

    Chemer Максим

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

    Chemer Максим

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

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

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

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

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

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    ok
  12. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.492
    Симпатии:
    3.122
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Начинать, конечно же, с тщательного прочтения спецификации от автора протокола:
    http://download.shredderchess.com/div/uci.zip

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

    Chemer Максим

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

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

    Chemer Максим

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

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    И еще было бы замечательно, если бы ты выложил свой код по поддержке UCI. Из тех, что я видел - самый красивый :)
  17. WinPooh В.М.

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

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

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

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

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

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    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 Коршунов Игорь

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

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

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

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Так весь UCI в том и заключается, чтобы реализовать position() и go().
  23. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    position() выложу, её мне не жалко, а вот go() не дам :)
    Текст нечитабельный.
  24. TopicStarter Overlay

    Chemer Максим

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

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

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

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

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

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

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

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

    Chemer Максим

    • Участник
    Рег.:
    14.09.2006
    Сообщения:
    1.674
    Симпатии:
    13
    Репутация:
    0
    Адрес:
    Запорожье
    Оффлайн
    2NS: Выложи пожалуста readNS() и writeNS().
  32. TopicStarter Overlay

    Chemer Максим

    • Участник
    Рег.:
    14.09.2006
    Сообщения:
    1.674
    Симпатии:
    13
    Репутация:
    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 Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    А где обнуляются буфера ввода-вывода?
  34. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Можно добавить вывод в лог всех принятых от оболочки команд, тогда будет понятнее что происходит.
  35. TopicStarter Overlay

    Chemer Максим

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

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