我正计划制作一个与 UCI 国际象棋引擎接口的程序。我一直在对它进行一些研究,但我想在深入了解它之前获得更多信息。我想知道你们中是否有人可以提供一些 UCI 引擎和前端程序之间的“交换”示例。我并不真正关心实际的接口代码(如发送/接收命令),这应该足够简单。我只是想获得一些小游戏的好例子和一些选择。我目前正在使用stockfish 引擎,但我希望能够使用多个引擎。
所以无论如何,我正在寻找一些关于如何在 UCI 上玩游戏的例子。
让我们假设 GUI 正在促进人类用户和引擎之间的匹配。假设用户以e2e4
. 然后命令看起来像:
// 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
我已经简化了交互的许多方面。一个功能齐全的 GUI 必须支持您可以在UCI 规范(另一个来源)中找到的许多其他命令。您还可以查看现有 GUI 的工作原理。例如,如果你使用Arena,你可以按 F4 来查看命令交互的日志,
我创建了这个要点,这是我能找到的最好的文档——我发现的大多数链接都已失效
https://gist.github.com/aliostad/f4470274f39d29b788c1b09519e67372
您可以为此使用nochetoengi。它有一个选项用于将与国际象棋 GUI 的通信记录到文件中。
例如,在 PyChess 中将其用作引擎“nochetoengi --log-file /tmp/log.txt”,您将看到所有通信。
注意:仅适用于 linux