2013-06-08 7 views
15

Sto pianificando di creare un programma che si interfaccia con un motore di scacchi UCI. Ho fatto qualche ricerca su questo, ma voglio avere un po 'più di informazioni prima di approfondirmi. Mi chiedevo se qualcuno di voi potesse fornire alcuni esempi di "scambi" tra un motore UCI e un programma front-end. Non sono molto interessato al pratico codice di interfaccia (come inviare/ricevere comandi), che dovrebbe essere abbastanza semplice. Sto solo cercando di ottenere alcuni buoni esempi di un piccolo gioco e alcune opzioni. Sto usando il motore di stoccafisso attualmente, ma voglio essere in grado di utilizzare più motori.Utilizzo dell'interfaccia di scacchi universale

Quindi, comunque, sto cercando alcuni esempi su come giocare a un gioco su UCI.

+0

Avete controllato [le specifiche] (http://www.shredderchess.com/chess-info/features/uci- universal-scacchi-interface.html)? 'Tutte le comunicazioni avvengono tramite input e output standard con comandi di testo'. – raina77ow

+0

Lo so, sto cercando esempi di testo per giocare a un gioco base. – Nathan

risposta

17

Supponiamo che la GUI stia facilitando una corrispondenza tra un utente umano e un motore. Supponiamo che l'utente inizi con e2e4. Quindi i comandi apparirebbero come:

// 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 

Ho semplificato molti aspetti dell'interazione. Una GUI completa dovrà supportare molti altri comandi che è possibile trovare nello UCI specification (another source). Puoi anche vedere come funzionano le GUI esistenti. Ad esempio, se si utilizza Arena, è possibile premere F4 per visualizzare un registro dell'interazione del comando,

+2

Grazie! La mia domanda principale è, e poi? Il motore di scacchi mantiene uno stato interno della scacchiera o il mio programma mantiene una posizione FEN e semplicemente lo aggiorna in base alla mia mossa (e2e4) e alla mossa migliore suggerita dal motore? Se non ha uno stato interno, gestirò manualmente la posizione della scheda FEN e quindi chiamerò ad esempio "posizione CURRENT_POSITION d2d4" e aspetto la mossa migliore? O c'è qualche stato della scheda interna che posso aggiornare? Se é cosi, come? Grazie per il vostro aiuto, Zong Zheng Li! – Nathan

+0

@Nathan Tutti i motori dovrebbero mantenere una scheda interna, ma la GUI deve ancora inviare le informazioni sulla posizione prima di ogni ricerca. Puoi farlo con 'position [FEN]' o 'position startpos [move sequence]', ma quest'ultimo sembra essere generalmente preferito. – Zong

+0

quindi la sequenza di movimento completo dall'inizio? – Nathan