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

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

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

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

    • Команда форума
    Рег.:
    11.02.2006
    Сообщения:
    6.542
    Симпатии:
    3.361
    Репутация:
    175
    Оффлайн
    Может, кому еще пригодится:

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

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

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

    • Команда форума
    Рег.:
    11.02.2006
    Сообщения:
    6.542
    Симпатии:
    3.361
    Репутация:
    175
    Оффлайн
    Я недавно загрузил с Питоновского сайта последнюю доступную версию:

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

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

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

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

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

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

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

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

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

    • Участник
    Рег.:
    22.05.2007
    Сообщения:
    121
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Челябинск
    Оффлайн
    Спасибо за такую оперативность! :)

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

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

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

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

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

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

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

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

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.492
    Симпатии:
    3.122
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    В протоколе WB терминальный символ тот же:

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

    • Участник
    Рег.:
    11.09.2007
    Сообщения:
    113
    Симпатии:
    0
    Репутация:
    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 В.М.

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

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

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

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

    Chemer Максим

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

    • Команда форума
    Рег.:
    10.04.2006
    Сообщения:
    3.709
    Симпатии:
    50
    Репутация:
    1
    Адрес:
    Кишинев
    Оффлайн
    так ведь чемпионат идет. не до шашкописательства...
  25. WildCat Коршунов Игорь

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

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