目录

  • 前言
  • 一、UCI协议的特点
  • 二、走棋格式
  • 三、界面到引擎
    • 1. uci
    • 2. debug [ on | off ]
    • 3. isready
    • 4. setoption name [ value ]
    • 5. register
    • 6. position [fen | startpos ] moves ....
    • 7. go
  • 四、引擎到界面
    • 1、id
    • 2、uciok
    • 3、readyok
    • 4、bestmove [ ponder ]
    • 5、copyprotection
    • 6、registration
    • 7、info
    • 8、cpuload x
    • 9、string ...
    • 10、refutation ...
    • 11、currline ...
    • 12、option
  • 实操演示

前言

写这篇文章的原因是因为我正在编写一个国际象棋GUI,需要用到UCI协议,但苦于找不到UCI协议的完整定义,最后在外网才找到,所以在此记录一下


一、UCI协议的特点

  • 协议与操作系统无关。对于Windows来说,引擎是一个普通的exe文件,可以是一个控制台或 “真正的” Windows应用程序。
  • 所有的指令与输出都是通过stdin(标准输入)和stdout(标准输出)来传输的
  • 引擎应该启动并等待来自GUI的命令,
    并等待 "isready "或 "setoption "命令来设置其内部参数,因为引擎应该尽可能快的启动
  • 引擎必须始终能够处理来自stdin的输入,即使是在思考的时候
  • 引擎与界面的通信是以行缓冲方式进行的,
    也就是说,引擎收到的所有命令字符串都以’\n’结尾、
    GUI收到的所有输出也应该以’\n’结尾
  • 在没有收到 "go "命令之前,引擎不应该开始计算或思考
  • 在引擎被要求在一个局面上进行搜索之前,总是会有一个命令来告诉引擎当前的局面
  • 默认情况下,所有的开局处理都是由GUI完成的、
    但有一个选项可以让引擎使用它自己的开局书("OwnBook "选项,见下文)
  • 如果引擎或GUI收到一个未知的命令或标记,它应该只是忽略它并尝试解析字符串的其余部分
  • 如果引擎收到一个不应该出现的命令,例如,当引擎没有在思考时出现的"stop"命令,引擎应该忽略该命令

二、走棋格式

UCI协议用的走棋格式是“长代数格式”,即走动子的起始位置和到达位置,这里有几点需要注意:

  1. 不要标明“到达记号”、“吃子记号”、“将军记号”以及其他评注记号,例如第一步走e4,则记作e2e4,而不是e2-e4;
  2. 不要标明所走的子,例如走Nf6,则记作g8f6,而不是Ng8f6;
  3. 王车易位时只标明王的路线,例如走O-O,则记作e1g1;
  4. 兵升变时在最后注明只用一个字母注明升变的子,例如走e8=Q,则记作e7e8q。

三、界面到引擎

1. uci

告诉引擎使用UCI、
这将作为程序启动后的第一个命令发送一
来告诉引擎切换到UCI模式。
在收到UCI命令后,引擎必须用 "id "命令来识别自己的身份
并发送 "option "命令以告诉GUI该引擎支持哪些引擎设置(如果有的话)
之后,引擎应该发送 "uciok "来确认UCI模式
如果在一定时间内没有发送uciok,引擎进程将被GUI杀死

2. debug [ on | off ]

开启或关闭引擎的调试模式。
在调试模式下,引擎应该向GUI发送额外的信息来帮助调试,例如,用 "info string "命令
这个模式应该在默认情况下被关闭,这个命令可以在任何时候被发送,包括引擎思考时

3. isready

这是用来使引擎与GUI同步。当GUI发送了一条或多条命令,可能需要一些时间来完成时、这个命令可以用来等待引擎再次准备好
或者用来ping引擎,以了解它是否仍然活着。
例如,这条命令应该在设置tablebases的路径之后发送,因为这可能需要一些时间。
在引擎被要求做任何搜索之前,也需要这个命令
以等待引擎完成初始化。
这条命令必须总是以 "readyok "来回答,也可以在引擎正在计算的时候发送。
在这种情况下,引擎也应该立即回答 "readyok "而不停止搜索。

4. setoption name [ value ]

这条命令用于改变引擎的内部参数或触发某个动作
这将只在引擎等待时发送。
选项的名称不应区分大小写,可以包含空格,值也一样。
应该避免使用 "value "和 "name "这两个子字符串,以避免含糊的解析、
例如,不要使用 “draw value” 作为选项名。
下面是一些例子:

setoption name Nullmove value true\n
setoption name Selectivity value 3\n
setoption name Selectivity value 3\n
setoption name Style value Risky\n
setoption name Clear Hash\n
setoption name NalimovPath value c:\chess\tb\4;c:\chess\tb\5\n

5. register

这是尝试注册一个引擎的命令,或者告诉引擎,注册将在以后进行。
将在以后进行。如果引擎在程序启动时发送了 “注册错误”,应该总是发送这个命令。
的情况下,应该总是发送这个命令。
允许使用以下标记:

  • later
    用户现在不想注册引擎。
  • name
    该引擎应该用这个名字来注册
  • code
    该引擎应该用代码来注册

例子:

 register laterregister name Stefan MK code 4359874324

6. position [fen | startpos ] moves …

在内部棋盘上设置fenstring中描述的位置,并在内部棋盘上
在内部棋盘上下棋。
如果游戏是从起始位置开始的,将发送 "startpos "字符串。
注意:不需要 "new "命令。但是,如果这个位置与发送给引擎的最后一个位置不同,GUI应该在两者之间发送一个 “ucinewgame”。

7. go

在用 "position "命令设置的当前位置上开始计算。
在这个命令之后有许多命令,所有的命令都将以同一个字符串发送。
如果有一条命令没有被发送,其值应被解释为不会影响搜索。

  • searchmoves …
    使引擎只在指定的几步棋中选择一个
    例子:在 "position startpos "和 "go infinite searchmoves e2e4 d2d4 "之后
    引擎应该只搜索初始位置中的两步棋e2e4和d2d4。
  • ponder
    在后台模式中开始思考,此时引擎的时钟失效
  • wtime x
    白方的时钟还剩x毫秒
  • btime x
    黑棋在时钟上还有x毫秒的时间
  • winc t
    如果x>0,白棋每步的增量为t毫秒。
  • binc t
    如果x>0,黑色每步的增量为t毫秒。
  • depth x
    只搜索x层。
  • nodes x
    只搜索x节点、
  • mate x
    在x步棋中搜索一个杀棋
    *movetime x
    准确搜索x毫秒
  • infinite
    一直搜索直到接收到 "stop "命令

四、引擎到界面

1、id

这必须在收到 "UCI "命令后发送,以识别引擎、

  • name
    返回引擎的名称、
    例如,“id name Shredder X.Y\n”。
  • author
    返回引擎的制作者、
    例如:“id author Stefan MK\n”

2、uciok

必须在id和可选选项之后发送,以告诉GUI,引擎已经发送了所有信息,并且已经准备好进入uci模式。
已经发送了所有的信息,并且在UCI模式下已经准备好了。

3、readyok

当引擎收到 "isready "命令并且已经处理了所有的输入并准备接受新的命令时,必须发送这个命令。
处理了所有的输入并准备好接受新的命令。
它通常是在一个可能需要一些时间的命令之后发送,以便能够等待引擎、
但它可以在任何时候使用,甚至在引擎正在搜索的时候、
并且必须总是用 "isready "来回答。

4、bestmove [ ponder ]

引擎已经停止了搜索,并找到了这个位置上的最佳棋步。
引擎可以发送它喜欢的那步棋来进行思考。引擎不能自动开始思考。
如果引擎停止搜索,就必须发送这条命令,在思考模式下,如果有 "停止 "命令,也必须发送。
"停止 "命令,所以每一个 "走 "的命令都需要一个 "最佳棋步 "的命令!
在这之前,引擎应该发送一个最后的 "info "命令,包含最后的搜索信息、
GUI有关于最后一次搜索的完整统计数据。

5、copyprotection

这对受版权保护的引擎来说是需要的。在 uciok 命令之后,引擎可以告诉 GUI、
它现在将检查复制保护。这是由 "拷贝保护检查 "完成的。
如果检查正常,引擎应该发送 “copyprotection ok”,否则发送 “copyprotection error”。
如果有一个错误,引擎应该不能正常工作,但不应该单独退出。
如果引擎报告 “copyprotection error”,GUI不应该使用这个引擎并应该显示一个错误信息!

6、registration

对于需要一个用户名或代码来实现所有功能的引擎来说,这是需要的。
类似于 "copyprotection "命令,引擎可以在uciok命令之后发送 “注册检查”。
在UCIOK命令之后发送 “注册检查”,然后是 "注册正常 "或 “注册错误”。
同样,在每次试图注册引擎后,它应该回答 “注册检查”,然后是 "registration ok "或 “registration error”
与 "copyprotection "命令相反,GUI可以在引擎报告错误后使用引擎。
报告错误后,GUI可以使用该引擎,但是应该通知用户该引擎没有被正确注册
并且可能无法使用它的所有功能。
此外,GUI应该提供一个对话框来打开
以实现引擎的注册。为了尝试注册一个引擎,GUI可以发送
"注册 "命令。
如果引擎在启动时发送 “注册错误”,GUI必须总是用 "register "命令来回答(这也可以用 "register later "来完成)
并以某种方式告诉用户,引擎没有被注册。
这样,引擎知道GUI可以处理注册程序,而用户将被告知引擎没有被正确注册。

7、info

这是"go"命令的返回信息,告诉gui引擎的思考信息。
引擎可以只发送选定的信息,并且可以用一条信息命令发送多个信息、
例如:"info currmove e2e4 currmovenumber 1 "或者
“info depth 12 nodes 123456 nps 100000”。
另外,所有属于pv的信息应该一起发送
例如:“info depth 2 score cp 214 time 1242 nodes 2124 nps 34928 pv e2e4 e7e5 g1f3” 。
我建议在一秒钟后才开始发送 “currmove”、“currmovenumber”、"currline "和 “refutation”
以避免太多的流量。
其他信息:

  • depth x
    引擎的搜索深度
  • seldepth x
    选择性的搜索深度、
    如果引擎发送seldepth,在同一个字符串中还必须有一个 “深度”。
  • time x
    搜索的时间,以毫秒为单位,这个应该和pv一起发送。
  • node x
    搜索到的x个节点,引擎应该定期发送这个信息。
  • pv …
    找到的最佳线路
  • multipv x
    这是在多pv模式下的信息。
    它总是跟在pv后,表示该线路是第几好的线路
  • score
    • cp x
      返回以百分兵值为单位的分数
    • mate x
      表示在x步内有杀棋
    • lowerbound x
      该分数是一个下限。
    • upperbound x
      该分数是一个上限。
  • currmove …
    目前正在搜索的走法。
  • currmovenumber x
    当前搜索的棋步的编号,对于第一步棋,x应该是1而不是0。
  • hashfull
    当哈希值已满,引擎应定期发送此信息。
  • nps x
    每秒搜索x个节点,引擎应定期发送此信息。
  • tbhits x
    在残局表中发现的位置数

8、cpuload x

引擎的cpu使用率。

9、string …

返回一些额外信息(通常是调试信息)
这行其后的所有字符将被解释为string信息

10、refutation …

返回移动被反驳的行
例如:在搜索到d1h5这步棋后,引擎可以发送
“info refutation d1h5 g6h5”
如果g6h5是d1h5之后的最佳答案,或者如果g6h5使局面变的糟糕。
如果没有发现d1h5的反驳,引擎应该只发送
“info refutation d1h5”
只有当 "UCI_ShowRefutations "选项被设置为 "true "时,引擎才应该发送这个信息。

11、currline …

这是引擎正在计算的当前行。
引擎在一个以上的cpu上运行。 = 1,2,3…
如果引擎只使用一个cpu,可以省略。
如果大于1,总是一起发送k个字符串中的所有k行。
只有当选项 "UCI_ShowCurrLine "被设置为 "true "时,引擎才应该发送这个。

12、option

这个命令告诉GUI哪些参数可以在引擎中可以被改变。
在引擎启动时,应该在 "UCI "和 "ID "命令之后发送一次这个命令
如果有任何参数可以在引擎中被改变。
GUI应该解析这个信息并为用户建立一个对话框来改变设置。
注意,并不是每个选项都需要出现在这个对话框中,因为有些选项如
“思考”、"UCI_AnalyseMode "等,最好在其他地方处理或自动设置。
如果用户想改变一些设置,GUI将发送一个 "setoption "命令给引擎。
注意,GUI不需要在启动引擎时为每个选项发送setoption命令,如果
它不希望改变默认值。
对于所有允许的组合,见下面的例子、
因为这个令牌的一些组合没有意义。
每个参数将被发送一个字符串。

  • name xxx
    该选项的名称为xxx。
    某些选项有一个固定的值,这意味着这个选项的语义是固定的。
    通常这些选项不应该显示在GUI的正常引擎选项窗口中,而应该得到特殊处理。
    例如,"Pondering "应该在思考被启用或禁用时自动设置。
    在GUI选项中启用或禁用时,"Pondering "应该被自动设置。同样,"UCI_AnalyseMode "也应该由GUI自动设置。
    也应该由GUI自动设置。所有这些选项的前缀是 “UCI_”,除了下面的前6个选项。
    如果GUI得到一个前缀为 "UCI_"的未知选项,它应该只是
    忽略它,不在引擎的选项对话框中显示它。

    • Hash,类型为spin
      可以改变哈希表的大小(MB)、
      这应该由程序启动时的第一个 "setoptions "命令来回答。
      如果引擎已经发送了适当的 "option name Hash "命令、
      这应该是所有引擎都支持的!
      所以引擎应该首先使用一个非常小的哈希值作为默认值。
    • NalimovPath,类型为string
      这是硬盘上通往Nalimov压缩格式的路径。
      多个目录可以用";"连接起来。
    • NalimovCache, 类型为spin
      这是Nalimov表的缓存的大小,单位是MB。
      最后两个选项也应该出现在当引擎启动时的初始选项交换对话框中,如果引擎支持它的话
    • Ponder,类型为check
      这意味着引擎能够进行思索。
      GUI将在思考是否可行的时候发送这个信息。
      注意:如果启用了这个选项,引擎不应该自己开始思考,这个选项只是当允许思考时,使引擎改变其时间管理算法。
    • OwnBook,类型为check
      这意味着引擎有自己的书,可以由引擎自己访问。
      如果设置了这个选项,引擎就会负责打开棋谱,而GUI将永远不会
      执行从它的棋谱中移出引擎的动作。如果GUI将此设置为false、
      引擎不应该访问它自己的棋谱。
    • MultiPV, 类型为spin
      引擎支持多重最佳线或K-best模式。默认值为1
    • UCI_ShowCurrLine,类型为check,默认为false、
      引擎可以显示它正在计算的当前行。见上面的 “info currline”。
    • UCI_ShowRefutations,类型false,默认值为false
      引擎可以在一行中显示一步棋和它的反驳。见上面的 “info refutation”。
    • UCI_LimitStrength,类型为check,默认值为false
      引擎能够将其强度限制在一个特定的Elo数、
      这应该总是与 "UCI_Elo "一起实现。
    • UCI_Elo, 类型为spin
      引擎可以在这个区间内限制其Elo强度。
      如果UCI_LimitStrength被设置为false,这个值应该被忽略。
      如果UCI_LimitStrength被设置为true,引擎应该用这个特定的强度进行比赛。
      这应该总是与 "UCI_LimitStrength "一起实施。
    • =UCI_AnalyseMode,类型为check
      当分析或玩一个游戏时,引擎想表现得不同。
      例如,当游戏时,它可以使用某种学习方法。
      如果引擎正在玩游戏,这将被设置为假,否则为真。
    • = UCI_Opponent, 类型为string
      通过这个命令,GUI可以向引擎发送名称、标题、ELO以及引擎是在和人类还是电脑比赛。
      字符串的格式必须是[GM|IM|FM|WGM|WIM|none] [|none] [computer|human] 。
      例如:
      “setoption name UCI_Opponent value GM 2800 human Gary Kasparow”
      “setoption name UCI_Opponent value none none computer Shredder”
  • type
    该选项的类型。
    引擎可以发送5种不同类型的选项

    • check
      一个复选框,可以是true,也可以是false。
    • spin
      一个旋钮,可以是一定范围内的整数。
    • combo
      一个选择框,可以有不同的预定义字符串作为值。
    • button
      一个按钮,按下后可以使引擎引擎做一个动作。
    • string
      一个文本字段,其值为一个字符串、
      空字符串的值为""
  • default x
    这个参数的默认值是x

  • min
    该参数的最小值为x(用于spin类型)

  • max
    这个参数的最大值是x(用于spin类型)

  • var
    此参数的预定义值为x
    例子:
    这里有5个字符串,分别代表5种可能的选项类型
    “option name Nullmove type check default true\n”
    “option name Selectivity type spin default 2 min 0 max 4\n”
    “option name Style type combo default Normal var Solid var Normal var Risky\n”
    “option name NalimovPath type string default c:\n”
    “option name Clear Hash type button\n”


实操演示

下列展示在stockfish_15.1_win_x64_popcnt进行

uci
id name Stockfish 15.1
id author the Stockfish developers (see AUTHORS file)option name Debug Log File type string default
option name Threads type spin default 1 min 1 max 1024
option name Hash type spin default 16 min 1 max 33554432
option name Clear Hash type button
option name Ponder type check default false
option name MultiPV type spin default 1 min 1 max 500
option name Skill Level type spin default 20 min 0 max 20
option name Move Overhead type spin default 10 min 0 max 5000
option name Slow Mover type spin default 100 min 10 max 1000
option name nodestime type spin default 0 min 0 max 10000
option name UCI_Chess960 type check default false
option name UCI_AnalyseMode type check default false
option name UCI_LimitStrength type check default false
option name UCI_Elo type spin default 1350 min 1350 max 2850
option name UCI_ShowWDL type check default false
option name SyzygyPath type string default <empty>
option name SyzygyProbeDepth type spin default 1 min 1 max 100
option name Syzygy50MoveRule type check default true
option name SyzygyProbeLimit type spin default 7 min 0 max 7
option name Use NNUE type check default true
option name EvalFile type string default nn-ad9b42354671.nnue
uciok
setoption name Threads value 2
setoption name clear hash
isready
readyok
readyok
go node 10info string NNUE evaluation using nn-ad9b42354671.nnue enabled
info depth 1 seldepth 1 multipv 1 score cp 18 nodes 44 nps 14666 hashfull 0 tbhits 0 time 3 pv e2e4
info depth 2 seldepth 2 multipv 1 score cp 51 nodes 192 nps 64000 hashfull 0 tbhits 0 time 3 pv e2e4
info depth 3 seldepth 3 multipv 1 score cp 114 nodes 556 nps 139000 hashfull 0 tbhits 0 time 4 pv g1f3 a7a6 d2d4// 此处省略亿点信息
info depth 27 seldepth 35 multipv 1 score cp 28 upperbound nodes 7162373 nps 1076724 hashfull 998 tbhits 0 time 6652 pv e2e4 c7c6
info depth 27 currmove e2e4 currmovenumber 1info depth 27 seldepth 35 multipv 1 score cp 28 upperbound nodes 7390822 nps 1075341 hashfull 998 tbhits 0 time 6873 pv e2e4 c7c6 stopbestmove e2e4 ponder c7c6

国际象棋通用协议(UCI协议)相关推荐

  1. 国际象棋引擎文章(一)uci协议

    棋弈程序(应该称之为引擎)是高度"可移植的"随着越来越多的棋弈程序遵从如Winboard和UCI协议等各种协议,它们不再被限定于一个软件或界面了.用户现在可以把一个棋弈程序(引擎) ...

  2. linux国际象棋,国际象棋通用引擎协议

    国际象棋通用引擎协议 2004年9月初稿,2006年2月修订 一.UCI协议的特点 UCI协议,全称是国际象棋通用引擎协议(Universal Chess Interface,直译作通用象棋接口).它 ...

  3. 互联网协议 — GRE 通用路由封装协议

    目录 文章目录 目录 GRE 通用路由封装协议 GRE 报文格式 GRE 的实现原理 Linux 配置指令 加载 GRE 内核模块 East side West side GRE 的 Keepaliv ...

  4. 通用路由封装协议--GRE的简单配置

    基于华为设备简单配置GRE GRE--通用路由封装协议 一.GRE是什么? 二.GRE有什么用? 1.多协议本地网可以通过GRE隧道传输 2.与IPSec结合,保护组播数据 三.GRE怎么用? 1.隧 ...

  5. GNU通用公共许可协议--GPLV3中文翻译

    第三版,2007年6月29日 版权所有 © 2007 自由软件基金会 http://fsf.org/ 任何人皆可复制和发布本协议的完整副本,但不得修改 [译者声明] This is an unoffi ...

  6. HCNP-路由交换:GRE(通用路由封装协议)

    IPSec VPN用于在两个端点间提供安全的IP通信,但只能加密并传播单播数据,无法加密并传输语音.视频.动态路由协议信息等组播数据流量. GRE(通用路由封装协议)是一种隧道封装技术,提供了将一种协 ...

  7. 浅析GRE协议(通用路由封装协议)

    1.GRE的概念 1)全称:GRE(Generic Routing Encapsulation):通用路由封装协议. 2)功能:定义了在一种网络层协议上封装另一种协议(或同一种协议). 3)举例:对某 ...

  8. GRE通用路由封装协议

    GRE通用路由封装协议 利用GRE协议实现连个私网互相通信 拓扑图ENSP 配置IP 主机 IP172.16.1.1 子网掩码:255.255.255.0 网关:172.16.1.254 服务器 IP ...

  9. 网络协议学习:通用路由封装协议GRE

    隧道技术 Tunneling 网络隧道技术(Tunneling)指的是利用一种网络协议来传输另一种网络协议,它主要利用网络隧道协议来实现这种功能. 简单来说,使用隧道技术可以理解为,在一些网络链路中使 ...

最新文章

  1. java(x ) 3的值_java中,设x=2,则表达式 (x++)*3的值是多少 设x=2则表达式(x+
  2. 深入研究asp.net2.0——控件类库
  3. 05构建之法阅读笔记之三
  4. linux下文件描述符的介绍
  5. python去重复记录_Python列表去重复项的N种方法(实例代码)
  6. java geoprocessor_ArcGIS GeoEvent Processor for Server 安裝與配置 (僅適用於壓縮安裝包)...
  7. java导入hbase_如何用java导入hbase.dat文件
  8. mysql数据库创建删除带横杠的数据库名
  9. 【Python】 _tkinter.TclError: bitmap xzw.ico not defined
  10. 专业网速测试软件哪个好,网速测试软件哪个好?6款热门网速测试软件推荐
  11. android中weight计算方法,详解Android中weight的使用方法
  12. win 连续截图功能(PSR 屏幕录制)
  13. 某技术总监认为处女座码农要重用,并给出3点原因,你认同么?
  14. Apollo星火计划学习笔记|L1 Apollo平台安装(2021年9月更新)
  15. #今日论文推荐# 莫纳什大学最新《长文档摘要》综述,39页pdf长文档摘要的实证研究:数据集、模型和指标
  16. python实验四_实验四 · Python程序设计/20193117whm - Gitee.com
  17. 互联网晚报 | 7月17日 星期日 | iPhone 14量产在即;首款国产科学计算软件研发成功;上半年广东人均收入2.47万元...
  18. 横跨湘江两岸,望城虎年“火力全开” 玩转山水洲城新样板?
  19. android读取运动数据权限_Android 10 中身体活动数据的隐私保护
  20. 华为笔记本linux usb启动,华为MateBook D(2018) BIOS设置u盘启动教程

热门文章

  1. cpua55和a53哪个好_ARM是要把用户绕晕?新款Cortex-A35 CPU和Cortex-A53有啥区别-控制器/处理器-与非网...
  2. Unity3d热更新(四):压缩文件
  3. Supervised Contrastive Learning(学习笔记)
  4. 2019阿里云开年Hi购季域名与商标分会场分会场全攻略!
  5. 当你和天猫精灵对话时,它在想什么?阿里智能对话技术深度解读 1
  6. 康耐视visionpro联合C#开发二
  7. 【Latex】插入中文
  8. 基于 TPS54310的雷达视频信号模拟器的电源设计
  9. 智能家居照明系统设计
  10. css方法实现表格表头固定,横向纵向可滑动