1. Программа запустилась, прошла инициализацию и перешла в режим
слушания входного консольного потока. Теперь, получив команду от
оболочки, программа обработает ее(2) и снова перейдет в режим ожидания
очередной команды.
Реализация находится в файле a_main.cpp, функция int main(int argc, char
* argv[]).
2. Обработка команды от оболочки происходит следующим образом.
Вообще, чтобы понять обработку нужно знать протокол UCI.(смотреть здесь)
На входе у нас есть текстовая строка с командой мы сравниваем ее с
образцами команд и если совпадает, то переходим к требуемым действиям.
(в си++ это можно сделать через strcmp())
Команды следующие:
"uci"
в ответ на нее печатаем имя проги и автора, например:
"id name Ifrit_C19 Debug"
"id author ChessTerminator75"
"isready"
в ответ печатаем:
"readyok",
т.е. передаем, что к работе готовы.
"quit"
завершаем работу.
Следующие команды проверяем не на полное совпадение, а на существование
в начале строки искомой подстроки. (в си++ это можно сделать через
strstr())
Команда может быть вида:
"position startpos" - тут мы начинаем игру с начала
или
"position fen rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 "
- тут мы начинаем игру с расставленной в оболочке позиции,
или
"go depth 6" - запустить обсчет на глубине 6 полуходов
и т.д.
Встретив
"position ",
запускаем разбор входящей позиции (3).
Встретив
"go ",
запускаем движок на обдумывание (4).
На самом деле команд в протоколе значительно больше, но в моем движке
реализованы пока только эти, и еще при переборе "stop" для остановки
счета и выдачи лучшего на данный момент хода.
Реализация находится в файле b_Protokol_UCI.cpp.
Функция void Parse_Protokol_UCI(char string_in[],int r,T_board_list_816
* board_list_816).
3.Разбор входящей позиции.
4.Запускаем
движок на обдумывание.
|