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

Discussion in 'Машинное отделение' started by Chemer, 16 Mar 2007.

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

    • Команда форума
    Member Since:
    11.02.2006
    Message Count:
    6.542
    Likes Received:
    3.361
    Репутация:
    175
    Оффлайн
    Chemer, стар я наносекунды на С да Ассемблере выгадывать :) . На Питоне я сразу алгоритмы могу писать, без кучи подготовительной рутины. То же 'position startpos moves' - плевое дело. Я давно за то, чтобы экономить свое (программистское) время, а не процессорное. Ну, а кто борется за процессорное - удачи тому в его нелегком, но нужном деле :)
  2. MS Михаил Семионенков

    • Команда форума
    Member Since:
    11.02.2006
    Message Count:
    6.542
    Likes Received:
    3.361
    Репутация:
    175
    Оффлайн
    Может, кому еще пригодится:

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

    sys.stdin.flush()
    sys.stdout.flush()
  3. bankuss Александр

    • Заслуженный
    • Участник
    • Старожил
    Member Since:
    24.05.2006
    Message Count:
    1.084
    Likes Received:
    38
    Репутация:
    6
    Оффлайн
    MS а на каком питоне это все делается? их довольно много.
  4. MS Михаил Семионенков

    • Команда форума
    Member Since:
    11.02.2006
    Message Count:
    6.542
    Likes Received:
    3.361
    Репутация:
    175
    Оффлайн
    Я недавно загрузил с Питоновского сайта последнюю доступную версию:

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

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

    • Команда форума
    Member Since:
    13.02.2006
    Message Count:
    9.492
    Likes Received:
    3.122
    Репутация:
    95
    Location:
    Москва
    Оффлайн
    Вроде как уже бета третьего Питона доступна. Основная фича - несовместимость со вторым :)
  6. romm KMC

    • Заслуженный
    • Участник
    • Старожил
    Member Since:
    21.02.2006
    Message Count:
    2.267
    Likes Received:
    18
    Репутация:
    0
    Location:
    Сан-Хозе, Калифорния
    Оффлайн
    В обе стороны?
  7. ChessTerminator75 Андрей

    • Участник
    Member Since:
    22.05.2007
    Message Count:
    121
    Likes Received:
    0
    Репутация:
    0
    Location:
    Челябинск
    Оффлайн
    Пишу на С++
    Как обработать случай когда во время перебора поступила команда 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 Коршунов Игорь

    • Команда форума
    Member Since:
    04.05.2006
    Message Count:
    3.599
    Likes Received:
    4
    Репутация:
    0
    Location:
    Гомель
    Оффлайн
  9. bankuss Александр

    • Заслуженный
    • Участник
    • Старожил
    Member Since:
    24.05.2006
    Message Count:
    1.084
    Likes Received:
    38
    Репутация:
    6
    Оффлайн
    во фрукте поток "смотрит" функция bool input_available() в файле posix.cpp
  10. WinPooh В.М.

    • Команда форума
    Member Since:
    13.02.2006
    Message Count:
    9.492
    Likes Received:
    3.122
    Репутация:
    95
    Location:
    Москва
    Оффлайн
    И в C, и в С++ я использую одни и те же функции, соответственно от WinAPI и POSIX API. Находятся они в файлах win32.cpp и unix.cpp. Виндовый код несколько лет назад позаимствовал из какого-то обсуждения то ли на Computer Chess Club, то ли на Winboard Forum. Происхождение юниксового кода скрыто во мраке времён.

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

    • Участник
    Member Since:
    22.05.2007
    Message Count:
    121
    Likes Received:
    0
    Репутация:
    0
    Location:
    Челябинск
    Оффлайн
    Спасибо за такую оперативность! :)

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

    • Команда форума
    Member Since:
    13.02.2006
    Message Count:
    9.492
    Likes Received:
    3.122
    Репутация:
    95
    Location:
    Москва
    Оффлайн
    Практически, да. Есть ещё метод с помещением кода, проверяющего ввод, в отдельный поток. Он не слишком популярен, т.к. требует много лишних движений по синхронизации потоков. Плюс непредсказуемые накладные расходы на запуск потока, если каждый раз его создавать для поиска заново. Я пробовал такой подход в ранних версиях программы, потом перешёл на более простую однопоточную схему.

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

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    Нехилые у меня ошибки в коде.
    Я был уверен что конец сообщения в UCI протоколе CHR(10), а оказывается надо CHR(13)
  14. WinPooh В.М.

    • Команда форума
    Member Since:
    13.02.2006
    Message Count:
    9.492
    Likes Received:
    3.122
    Репутация:
    95
    Location:
    Москва
    Оффлайн
    А я даже не помню числового значения. В описании, вроде бы, написано '\n' :)
  15. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    Неа, не \n, а 0x0D (\n это два символа)
    надо почитать описание XBoard, что там в качестве конца.
  16. WinPooh В.М.

    • Команда форума
    Member Since:
    13.02.2006
    Message Count:
    9.492
    Likes Received:
    3.122
    Репутация:
    95
    Location:
    Москва
    Оффлайн
    Я имею в виду традиционное обозначение этого символа в Сишных строках.
    Вот цитата из описания протокола:

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

    • Команда форума
    Member Since:
    13.02.2006
    Message Count:
    9.492
    Likes Received:
    3.122
    Репутация:
    95
    Location:
    Москва
    Оффлайн
    В протоколе WB терминальный символ тот же:

  18. дуп Учаcтник

    • Участник
    Member Since:
    11.09.2007
    Message Count:
    113
    Likes Received:
    0
    Репутация:
    0
    Location:
    Великий Новгород
    Оффлайн
    Возникла непонятность. У меня в Арене почему то одни строки выводятся, другие нет. Для всех делаю все одинаково.
    Code:
    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 В.М.

    • Команда форума
    Member Since:
    13.02.2006
    Message Count:
    9.492
    Likes Received:
    3.122
    Репутация:
    95
    Location:
    Москва
    Оффлайн
    Буфер опустошать не забываете?
    fflush(stdout) после каждой печати, или setbuf(stdout, NULL) при старте...
  20. дуп Учаcтник

    • Участник
    Member Since:
    11.09.2007
    Message Count:
    113
    Likes Received:
    0
    Репутация:
    0
    Location:
    Великий Новгород
    Оффлайн
    При старте "setbuf(stdout, NULL) " делал, fflush - нет. Сейчас повставлял после каждой "printf" - не помогает. :(
  21. WildCat Коршунов Игорь

    • Команда форума
    Member Since:
    04.05.2006
    Message Count:
    3.599
    Likes Received:
    4
    Репутация:
    0
    Location:
    Гомель
    Оффлайн
    А без Арены они выводятся?
  22. дуп Учаcтник

    • Участник
    Member Since:
    11.09.2007
    Message Count:
    113
    Likes Received:
    0
    Репутация:
    0
    Location:
    Великий Новгород
    Оффлайн
    Извиняюсь. Немного глюкануло у меня в голове. Я забыл поставить в MakeMove Nodes++. И этот Nodes был все время равен 0. Сейчас все строки, что я давал выше, выводятся, но в окне "Отладка движка" по прежнему нет от меня " <— info ".
  23. TopicStarter Overlay

    Chemer Максим

    • Участник
    Member Since:
    14.09.2006
    Message Count:
    1.674
    Likes Received:
    13
    Репутация:
    0
    Location:
    Запорожье
    Оффлайн
    Как давно народ ничего не писал в Машинном Отделении чегонибудь созидающего, какбудто движкописательство впало в литаргический сон, только Винни чегото там дебажит в греко. Помнится в былые времена народ соревновался в перфте, занимался генетическими алгоритмами, писал шашки, разбирал стрелку белку и рыбу, и наконец писал свои новые движки. :( Уже почти год прошол - и все будто в спячке.
  24. krey Михаил Кройтор

    • Команда форума
    Member Since:
    10.04.2006
    Message Count:
    3.709
    Likes Received:
    50
    Репутация:
    1
    Location:
    Кишинев
    Оффлайн
    так ведь чемпионат идет. не до шашкописательства...
  25. WildCat Коршунов Игорь

    • Команда форума
    Member Since:
    04.05.2006
    Message Count:
    3.599
    Likes Received:
    4
    Репутация:
    0
    Location:
    Гомель
    Оффлайн
    Открылся специальный форум по программированию настольных игр на sdchess.net.

Share This Page