2013-06-08 12 views
15

Mam zamiar stworzyć program, który będzie współpracował z silnikiem szachowym UCI. Robiłem badania na ten temat, ale chcę uzyskać trochę więcej informacji, zanim będę mógł lepiej się z tym pogodzić. Zastanawiałem się, czy któryś z was mógłby podać kilka przykładów "wymiany" pomiędzy silnikiem UCI a programem front-end. Nie jestem tak naprawdę zainteresowany praktycznym kodem interfejsu (jak polecenia wysyłania/odbierania), który powinien być dość prosty. Po prostu próbuję uzyskać dobre przykłady małej gry i kilka opcji. Używam obecnie silnika Stockfish, ale chcę mieć możliwość korzystania z wielu silników.Używanie Uniwersalnego Interfejsu Szachowego

Tak czy inaczej, szukam przykładów, jak grać w grę przez UCI.

+0

Czy sprawdziłeś [specyfikacje] (http://www.shredderchess.com/chess-info/features/uci- universal-chess-interface.html)? 'Cała komunikacja odbywa się za pomocą standardowego wejścia i wyjścia za pomocą poleceń tekstowych. – raina77ow

+0

Wiem, że szukam przykładów tekstu do gry podstawowej. – Nathan

Odpowiedz

17

Załóżmy, że GUI ułatwia dopasowanie między człowiekiem a silnikiem. Załóżmy, że użytkownik zaczyna od e2e4. Następnie polecenia wyglądałyby tak:

// GUI: tell the engine to use the UCI protocol 
uci 

// ENGINE: identify 
id name Chess Engine 
id author John Smith 

// ENGINE: send the options that can be changed 
//   in this case the hash size can have a value from 1 to 128 MB 
option name Hash type spin default 1 min 1 max 128 

// ENGINE: sent all parameters and is ready 
uciok 

// GUI: set hash to 32 MB 
setoption name Hash value 32 

// GUI: waiting for the engine to finish initializing 
isready 

// ENGINE: finished setting up the internal values and is ready to start 
readyok 

// GUI: let the engine know if starting a new game 
ucinewgame 

// GUI: tell the engine the position to search 
position startpos moves e2e4 

// GUI: tell the engine to start searching 
//  in this case give it the timing information in milliseconds 
go wtime 122000 btime 120000 winc 2000 binc 2000 

// ENGINE: send search information continuously during search 
//   this includes depth, search value, time, nodes, speed, and pv line 
info depth 1 score cp -1 time 10 nodes 26 nps 633 pv e7e6 
info depth 2 score cp -38 time 22 nodes 132 nps 2659 pv e7e6 e2e4 
info depth 3 score cp -6 time 31 nodes 533 nps 10690 pv d7d5 e2e3 e7e6 
info depth 4 score cp -30 time 55 nodes 1292 nps 25606 pv d7d5 e2e3 e7e6 g1f3 

// ENGINE: return the best move found 
bestmove d7d5 

Uprościliśmy wiele aspektów interakcji. W pełni funkcjonalny GUI będzie musiał obsługiwać wiele innych poleceń, które można znaleźć w UCI specification (another source). Możesz również sprawdzić, jak działają istniejące interfejsy GUI. Na przykład, jeśli używasz Arena, możesz nacisnąć klawisz F4, aby wyświetlić dziennik interakcji poleceń,

+2

Dzięki! Moje główne pytanie brzmi: co dalej? Czy silnik szachowy utrzymuje stan wewnętrzny planszy, czy mój program zachowałby pozycję FEN i po prostu aktualizowałby ją w oparciu o mój ruch (e2e4) i sugerowany najlepszy ruch silnika? Jeśli nie ma wewnętrznego stanu, ręcznie obsłużyłbym pozycję płyty FEN, a następnie zadzwoniłbym na przykład "position CURRENT_POSITION d2d4" i czekał na najlepszy ruch? Czy jest jakiś wewnętrzny stan płyty, który mogę zaktualizować? Jeśli tak to jak? Dzięki za pomoc, Zong Zheng Li! – Nathan

+0

@Nathan Wszystkie silniki powinny utrzymywać wewnętrzną tablicę, ale GUI jest nadal zobowiązany do wysyłania informacji o pozycji przed każdym wyszukiwaniem. Możesz to zrobić za pomocą 'position [FEN]' lub 'position startpos [move sequence]', ale ta ostatnia wydaje się być ogólnie preferowana. – Zong

+0

, więc pełna sekwencja ruchu od początku? – Nathan

Powiązane problemy