Логика работы программы Ифрит

на главную страницу

 

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.Запускаем движок на обдумывание.