Как подключить UCI?

Тема в разделе "Машинное отделение", создана пользователем gudvinn, 4 авг 2006.

  1. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.490
    Симпатии:
    3.103
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
  2. WinPooh В.М.

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

    Рег.:
    13.12.2006
    Сообщения:
    9
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    Вопрос так был задан, что-бы получить ответ на том же уровне. Полагаю, что если портов в/в целый диапазон, который слушает и оболочка и движек, то это не совсем рационально. Система пропускает это "общение" мимо "ушей" и не подключает соответствующие драйвера, как я понимаю. Я не бравирую тем что не знаю С, но считаю что интерфейс к своему приложению на уровне протокола типа UCI смогу изготовит, для чего подобный протокол и создан. IMHO.

    P.S. за ссылку на протокол xboard, так же, спасибо. Раньше UCI считался экзотикой...теперь он более распространен, как оказалось.
  4. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.490
    Симпатии:
    3.103
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Нет, почему же целый диапазон. Вроде, один порт выбирается.
    Всё, что нужно - это научить ваш компонент изображать из себя для удалённого GUI стандартный ICS-сервер... А с движком общаться как это делает локальная оболочка, на эту тему недавно ветка по соседству была...
  5. chessboard Зарегистрирован

    Рег.:
    13.12.2006
    Сообщения:
    9
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
  6. alexlaw Зарегистрирован

    Рег.:
    22.10.2016
    Сообщения:
    10
    Симпатии:
    5
    Репутация:
    0
    Оффлайн
    Вы сказали , что реализовали протокол UCI на делфи.
    Не могли бы вы показать, как подключиться к Winboard, для обмена с этой оболочкой сообщениями.
    Заранее благодарю.
  7. alexlaw Зарегистрирован

    Рег.:
    22.10.2016
    Сообщения:
    10
    Симпатии:
    5
    Репутация:
    0
    Оффлайн
    У меня получилось)))
    И к winboard и к Arena
    Код:
    // main UCI loop
    procedure uci_loop();
    var
    Input_char:Array[0..2000] of char;
    Input_str:string;
    begin
      Writeln('id name BBC_Alex');
      Writeln('id name alexlaw');
      Writeln('uciok');
      // main loop
      while true do begin
      // reset user /GUI input
      FillChar(Input_char, SizeOf(Input_char), 0);
      // make sure output reaches the GUI
      Flush(Output);
      Readln(Input_str);
      if Input_str=#13#10 then continue else
      // parse UCI "isready" command
      if pos('isready',Input_str)>0 then  begin
      Writeln('readyok');
      continue;
      end else
      // parse UCI "position" command
      if pos('position',Input_str)>0 then  begin
      // call parse position function
      parse_position(Input_str);
      end else
      // parse UCI "ucinewgame" command
      if pos('ucinewgame',Input_str)>0 then  begin
      // call parse position function
      parse_position('position startpos');
      end else
      // call parse go function
      if pos('go',Input_str)>0 then  begin
      parse_go(Input_str);
      end else
      // parse UCI "quit" command
      if pos('quit',Input_str)>0 then begin
      // quit from the chess engine program execution
      break;
      end else
      // parse UCI "uci" command
      if pos('uci',Input_str)>0 then begin
      // print engine info
      Writeln('id name BBC_Alex');
      Writeln('id name alexlaw');;
      Writeln('uciok');
      end;
      end;
    end;
    
    WinPooh и Goranflo нравится это.
  8. alexlaw Зарегистрирован

    Рег.:
    22.10.2016
    Сообщения:
    10
    Симпатии:
    5
    Репутация:
    0
    Оффлайн
    Внес изменения

    Код:
    // main UCI loop
    procedure uci_loop();
    var
    Input_char:Array[0..2000] of char;
    Input_str:widestring;
    begin
      Writeln('id name BBC_Alex');
      Writeln('id name alexlaw');
      Writeln('uciok');
      // main loop
      while true do begin
      // reset user /GUI input
      FillChar(Input_char, SizeOf(Input_char), 0);
      FillChar(Input_str, SizeOf(Input_str), 0);
    
    Иначе при игре сам с собой в турнире Арены, движок падал на 13 ходу.
    Теперь вроде все ОК

    Вот партия

    WinPooh нравится это.
  9. alexlaw Зарегистрирован

    Рег.:
    22.10.2016
    Сообщения:
    10
    Симпатии:
    5
    Репутация:
    0
    Оффлайн
    Получилось прослушать консоль во время анализа
    Может кому пригодится
    Код:
    // main UCI loop
    procedure uci_loop();
    var
    Input_str:AnsiString;
    begin
      Writeln('id name BBC_Alex');
      Writeln('id name alexlaw');
      Writeln('uciok');
      // main loop
      while true do begin
      Input_str:='';
      // reset user /GUI input
      //FillChar(Input_str, SizeOf(Input_str), 0);
      Writeln(Format('Memory=%u',[GetMemoryUsed]));
      // make sure output reaches the GUI
      Flush(Output);
      Readln(Input_str);
      if Input_str=#13#10 then continue else
      // parse UCI "isready" command
      if pos('isready',Input_str)>0 then  begin
      Writeln('readyok');
      continue;
      end else
      // parse UCI "position" command
      if pos('position',Input_str)>0 then  begin
      // call parse position function
      parse_position(Input_str);
      end else
      // parse UCI "ucinewgame" command
      if pos('ucinewgame',Input_str)>0 then  begin
      // call parse position function
      parse_position('position startpos');
      end else
      // call parse go function
      if pos('go',Input_str)>0 then  begin
      parse_go(Input_str);
      end else
      // parse UCI "quit" command
      if pos('quit',Input_str)>0 then begin
      // quit from the chess engine program execution
      break;
      end else
      // parse UCI "uci" command
      if pos('uci',Input_str)>0 then begin
      // print engine info
      Writeln('id name BBC_Alex');
      Writeln('id name alexlaw');;
      Writeln('uciok');
      end;
      end;
    end;
    
    Код:
    {
     Функция для "прослушивания" ввода графического интерфейса пользователя
     во время поиска.
     Он ожидает ввода пользователем из STDIN.
     Зависит от операционной системы.
    }
    
     function InputWaiting(): boolean;
    var
      ReadFds: TFDSet;
      TimeVal: TTimeVal;
      InputHandle: THandle;
      BytesAvail: DWORD;
    begin
      FD_ZERO(ReadFds);
      InputHandle := GetStdHandle(STD_INPUT_HANDLE);
      FD_SET(InputHandle, ReadFds);
      TimeVal.tv_sec := 0;
      TimeVal.tv_usec := 0;
      if PeekNamedPipe(InputHandle, nil, 0, nil, @BytesAvail, nil) then
      Result := (BytesAvail > 0);
    end;
    var
    Quit_:boolean;
    // read GUI/user input
    procedure read_input;
    var
      Bytes: DWORD;
      Input: array[0..255] of Char;
      EndChar: PChar;
    begin
      repeat
      Bytes := 0;
      if not ReadFile(GetStdHandle(STD_INPUT_HANDLE), Input, SizeOf(Input), Bytes, nil) then
      Break;
      until Bytes > 0;
      EndChar := StrScan(Input, #10);
      if Assigned(EndChar) then
      EndChar^ := #0;
      if StrLen(Input) > 0 then
      begin
      if StrLIComp(Input, 'quit', 4) = 0 then begin
      Writeln('Quit');
      Quit_ := True;
      end
      else if StrLIComp(Input, 'stop', 4) = 0 then begin
      Writeln('Stop');
      Quit_ := True;
      end;
      end;
    end;
    // a bridge function to interact between search and GUI input
    procedure communicate();
    begin
      if InputWaiting then read_input();
    end;
    

    195938>1:go depth 10
    195938<1:8 r n b q k b n r
    195938<1:7 # # # # . # # #
    195953<1:6 . . . . . . . .
    195953<1:5 . . . . . . . .
    195953<1:4 . . . # P P . .
    195985<1:3 . . . . . . . .
    195985<1:2 P P P . . . P P
    196000<1:1 R N B Q K B N R
    196000<1: a b c d e f g h
    196000<1:side = black
    196016<1:castle = KQkq
    196016<1:enpassant = f3
    196016<1:Memory=1840
    196031<1:ok depth:10
    196031<1:info score cp 115 depth 1 nodes 65 pv b8c6
    196031<1:info score cp 95 depth 2 nodes 538 pv f8b4 c2c3 d8h4
    196110<1:info score cp 115 depth 3 nodes 1722 pv b8c6 g1f3 g8f6
    196391<1:info score cp 105 depth 4 nodes 4398 pv b8c6 g1f3 g8f6 b1d2
    197750<1:info score cp 105 depth 5 nodes 14378 pv b8c6 c2c3 d7d5 g1f3 d5e4
    199594>1:quit
    200078<1:info score cp 85 depth 6 nodes 66015 pv b8c6 g1f3 g8f6 f3d4 f6e4 b1c3
    200078<1:Quit
    204297>1:stop
    208500<1:info score cp 95 depth 7 nodes 161764 pv b8c6 g1f3 d7d5 e4d5 d8d5 b1c3 f8b4
    208500<1:Stop
    230360<1:info score cp 100 depth 8 nodes 484076 pv b8c6 g1f3 d7d5 f3d4 d5e4 d4c6 d8d1 e1d1 b7c6
    347406<1:info score cp 105 depth 9 nodes 1364698 pv b8c6 g1f3 d7d5 f3d4 d5e4 d4c6 d8d1 e1d1 c8g4 f1e2 g4e2
    347406<1:info score cp 100 depth 10 nodes 5794472 pv c7c5 c2c3 b8c6 g1f3 d7d5 e4d5 d8d5 c3d4 d5e4 e1f2 c5d4
    347406<1:bestmove c7c5
    347422*1*Found move:c7-c5
    347500<1:Memory=1840

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