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

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

  1. MS
    Оффлайн

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

    Репутация:
    175
    Chemer, стар я наносекунды на С да Ассемблере выгадывать :) . На Питоне я сразу алгоритмы могу писать, без кучи подготовительной рутины. То же 'position startpos moves' - плевое дело. Я давно за то, чтобы экономить свое (программистское) время, а не процессорное. Ну, а кто борется за процессорное - удачи тому в его нелегком, но нужном деле :)
     
  2. MS
    Оффлайн

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

    Репутация:
    175
    Может, кому еще пригодится:

    На Питоне рычага управления размером буфера для stdin и stdout не нашел, но подход "сливай воду" помог:

    sys.stdin.flush()
    sys.stdout.flush()
     
  3. bankuss
    Оффлайн

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

    Репутация:
    6
    MS а на каком питоне это все делается? их довольно много.
     
  4. MS
    Оффлайн

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

    Репутация:
    175
    Я недавно загрузил с Питоновского сайта последнюю доступную версию:

    Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08)

    ЗЫ - ... а процедуры существовали всегда (или, по крайней мере - очень давно)
     
  5. WinPooh
    Оффлайн

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

    Репутация:
    95
    Вроде как уже бета третьего Питона доступна. Основная фича - несовместимость со вторым :)
     
  6. romm
    Оффлайн

    romm KMC баннер

    Репутация:
    0
    В обе стороны?
     
  7. ChessTerminator75
    Оффлайн

    ChessTerminator75 Андрей

    Репутация:
    0
    Пишу на С++
    Как обработать случай когда во время перебора поступила команда quit или stop?

    Когда я пытался использовать операторы cin.get(one); cin.peek();cin.getline(string_in2,65536,'\n');
    Исполнение на них останавливалось и прога ждала данных в потоке.

    Отключение буферизации
    cin.rdbuf()->setbuf(NULL,0);
    cout.rdbuf()->setbuf(NULL,0);
    ничего не изменило.

    Есть ли флаг сигнализирующий о том что в потоке появились данные?

    Интересно как этот вопрос решен в фрукте. Код смотрел но нужного места не нашел :(

    WinPooh Вы писали и на си и на си++ отличаются ли решения и если можно как Вы решили этот вопрос?
    Код смотрел но хотелось бы комментариев автора.

    P.S. Bioskey в glaurungе смотрел но толком не понял. Мое почтение тому кто объяснит логику работы этой функции.
     
  8. WildCat
    Оффлайн

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

    Репутация:
    0
  9. bankuss
    Оффлайн

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

    Репутация:
    6
    во фрукте поток "смотрит" функция bool input_available() в файле posix.cpp
     
  10. WinPooh
    Оффлайн

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

    Репутация:
    95
    И в C, и в С++ я использую одни и те же функции, соответственно от WinAPI и POSIX API. Находятся они в файлах win32.cpp и unix.cpp. Виндовый код несколько лет назад позаимствовал из какого-то обсуждения то ли на Computer Chess Club, то ли на Winboard Forum. Происхождение юниксового кода скрыто во мраке времён.

    Единственное, что могу добавить - игрался я в своё время с потоковыми библиотеками, и пришёл к выводу, что операции проверки буфера для iostream во многих популярных реализациях не работают. Поиск в Гугле это подтвердил - народ на эти грабли не устаёт наступать. Так что я отказался от изобретения велосипеда, и сделал как у всех.
     
  11. ChessTerminator75
    Оффлайн

    ChessTerminator75 Андрей

    Репутация:
    0
    Спасибо за такую оперативность! :)

    Правильно ли я понял что ВСЕ решения основаны на непосредственном использовании
    функций WinAPI ?
     
  12. WinPooh
    Оффлайн

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

    Репутация:
    95
    Практически, да. Есть ещё метод с помещением кода, проверяющего ввод, в отдельный поток. Он не слишком популярен, т.к. требует много лишних движений по синхронизации потоков. Плюс непредсказуемые накладные расходы на запуск потока, если каждый раз его создавать для поиска заново. Я пробовал такой подход в ранних версиях программы, потом перешёл на более простую однопоточную схему.

    Кстати говоря, чтобы программа играла по протоколу Winboard (в отличие от UCI), проверка ввода во время поиска не требуется.
     
  13. NS
    Оффлайн

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

    Репутация:
    3
    Нехилые у меня ошибки в коде.
    Я был уверен что конец сообщения в UCI протоколе CHR(10), а оказывается надо CHR(13)
     
  14. WinPooh
    Оффлайн

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

    Репутация:
    95
    А я даже не помню числового значения. В описании, вроде бы, написано '\n' :)
     
  15. NS
    Оффлайн

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

    Репутация:
    3
    Неа, не \n, а 0x0D (\n это два символа)
    надо почитать описание XBoard, что там в качестве конца.
     
  16. WinPooh
    Оффлайн

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

    Репутация:
    95
    Я имею в виду традиционное обозначение этого символа в Сишных строках.
    Вот цитата из описания протокола:

    Так что для кроссплатформенности я раз и навсегда забыл конкретные числа, и пользуюсь универсальным '\n'.
     
  17. WinPooh
    Оффлайн

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

    Репутация:
    95
    В протоколе WB терминальный символ тот же:

     
  18. дуп
    Оффлайн

    дуп Учаcтник

    Репутация:
    0
    Возникла непонятность. У меня в Арене почему то одни строки выводятся, другие нет. Для всех делаю все одинаково.
    Код:
    printf("info currmove %s\n", m_s); // выводится
    printf("info depth %d\n", depth);   // выводится
    printf("info nps %d\n", nps);         // нет
    printf("info nodes %d\n", Nodes);  // нет
    Если смотреть во время игры окно "отладка", от моего движка вообще нет строк вида "<— info ..."
    В чем может быть дело?
     
  19. WinPooh
    Оффлайн

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

    Репутация:
    95
    Буфер опустошать не забываете?
    fflush(stdout) после каждой печати, или setbuf(stdout, NULL) при старте...
     
  20. дуп
    Оффлайн

    дуп Учаcтник

    Репутация:
    0
    При старте "setbuf(stdout, NULL) " делал, fflush - нет. Сейчас повставлял после каждой "printf" - не помогает. :(
     
  21. WildCat
    Оффлайн

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

    Репутация:
    0
    А без Арены они выводятся?
     
  22. дуп
    Оффлайн

    дуп Учаcтник

    Репутация:
    0
    Извиняюсь. Немного глюкануло у меня в голове. Я забыл поставить в MakeMove Nodes++. И этот Nodes был все время равен 0. Сейчас все строки, что я давал выше, выводятся, но в окне "Отладка движка" по прежнему нет от меня " <— info ".
     
  23. Chemer
    Оффлайн

    Chemer Максим

    Репутация:
    0
    Как давно народ ничего не писал в Машинном Отделении чегонибудь созидающего, какбудто движкописательство впало в литаргический сон, только Винни чегото там дебажит в греко. Помнится в былые времена народ соревновался в перфте, занимался генетическими алгоритмами, писал шашки, разбирал стрелку белку и рыбу, и наконец писал свои новые движки. :( Уже почти год прошол - и все будто в спячке.
     
  24. krey
    Оффлайн

    krey Михаил Кройтор Команда форума Команда форума

    Репутация:
    1
    так ведь чемпионат идет. не до шашкописательства...
     
  25. WildCat
    Оффлайн

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

    Репутация:
    0
    Открылся специальный форум по программированию настольных игр на sdchess.net.