在Linux环境下使用开源工具玩中国象棋

您所在的位置:网站首页 玩象棋的窍门 在Linux环境下使用开源工具玩中国象棋

在Linux环境下使用开源工具玩中国象棋

2024-07-02 18:52:27| 来源: 网络整理| 查看: 265

  中国象棋有悠久的历史,是老少皆宜的棋类项目。在象棋竞技上,人类早早就被AI(广义上的,很原始的AI就够了)彻底击败了,但由于象棋的特性,AI的“高明”之处相对来说更容易被人类所理解,所以不论是与AI对弈,还是使用AI进行对局分析、观看AI对弈,都有一定的乐趣可言。

  但是事情没这么简单。某天突发奇想,试图在自己的电脑上跑个象棋AI,这时候才发现,虽然个人电脑的算力完全足以运行先进的象棋AI(而且完全不需要GPU出手),但几乎所有的中国象棋软件都不开源,几乎所有会被windows报毒,几乎所有都不支持在虚拟机中运行,几乎所有都有收费版本,甚至有多个莫名其妙的收费层级。显然,这里的“几乎所有”是一种严谨而委婉的说法。结合从论坛看到的信息,我猜测这些软件的主要付费客群可能是在网络对弈中开挂的无聊人士,所以他们非常在乎在软件以外的其他界面上自动识别和自动行棋的能力,以及微小的棋力差距,而这些都不是我们想随随便便和AI下棋、看AI下棋的人关心的事。

  一个稍有一点点技术常识的人能忍这些?我只好尝试完全基于开源方案的中国象棋,并且希望在Linux(实际上是WSL2)环境下运行,减少风险。本文就是关于这些实践的经验介绍。这些开源方案基本上都与国际象棋(Chess)相关软件有渊源,下文介绍时也将在一定程度上使用国际象棋相关的术语、引用与国际象棋相关的页面。

相关术语 Engine,which is the chess playing part of the chess program, relying on proprietary or standard protocols communicating with an external graphical user interfaces. 引擎是决定走法的部分,是“后端”。 GUI,Graphical User Interface (GUI), a user interface where interaction between user and a (chess) program takes place. 用户界面就是呈现棋盘、供用户操作(包括走棋和编辑棋局等)的“前端”。 Protocol,a formal description of digital message formats and the rules for exchanging those messages in or between computing systems. 在象棋软件中,协议指的是前端界面和后端引擎之间联系的协议,通过约定协议,可以允许界面和引擎之间进行自由搭配(下文会提到,并非如此),也有助于开发者只开发引擎或只开发界面,致力于自己感兴趣的部分。 Opening Book,chess programs often look up the positions at the beginning of the game in an Opening Book. 开局库,让引擎根据一定的定势起手,减少开局阶段的运算量,提高开局速度,也可能在一定程度上提高棋力。基于我们的目的,本文不涉及开局库,你当然可以自己加载开局库。 Chess variant,指国际象棋的各类变种。这里有一点历史争论,国际上一般认为各种象棋都是源自一种印度的游戏——恰图兰卡,7世纪时流传至波斯成为波斯象棋,而波斯象棋传入中国成宝应象棋,最后中国人在宋代改造成象棋,换言之,中国象棋就是一种chess variant;但中国象棋界主张中国象棋是从春秋战国时期的“六博”演绎而来(以上两种观点均来自维基百科)。折衷来说,维基百科将象棋归类为 “Chess-related historical and regional games”。抛开历史争论不谈,由于开发者一般这么认为,本文的语境中中国象棋与日本将棋、韩国将棋等一样,都是chess variant。 nnue,Efficiently Updatable Neural Networks,a Neural Network architecture intended to replace the evaluation of Shogi, chess and other board game playing alpha-beta searchers running on a CPU. NNUE是一种神经网络,能够减少计算量、提升引擎的棋力。 FEN,Forsyth-Edwards Notation,以字符串表示棋局的方式。 可用的开源方案 引擎

  上文提到“几乎所有”中国象棋软件都不开源,但其中的部分将引擎以二进制形式发布出来,但我不想讨论,也不想提到他们的名字。

  近年正在开发的开源的引擎主要包括两个:Fairy-Stockfish和Pikafish,两者都自称脱胎于著名的国际象棋引擎Stockfish,前者是一个致力于多种chess variant且支持多种协议的大而全的引擎,国内有人翻译为“仙鱼”;后者是中国人开发的专用于中国象棋的引擎,中文名为“皮卡鱼”。一般而言,公认Pikafish比Fairy-Stockfish的棋力要强一些,近期的开发也更积极。当然,对于我们的目的而言,棋力的微小差距并不那么重要。

  有一个古老的开源引擎象眼,近年还有微小的更新,我没有尝试,有兴趣的人可以自己研究看看。

界面

  界面是“几乎所有”中国象棋软件的重灾区,研发个引擎不行,研发个(骗钱或挂马的)界面还是不难的。还是那句话,我不想讨论,也不想提到他们的名字。

  目前支持中国象棋的开源界面主要有两个:XBoard和LiGround。前者从上古时代延续至今(可考的最早发布时间为1991年,最新版4.9.1发布于2016年),功能强大,一切基本上都可以定制,也可以在图形界面上直接编辑棋局。后者的目标是 “modern Chess Variant Analysis GUI for the 21st century”,界面更好看(见仁见智),只能使用FEN编辑棋局,现在还在更新,但不能算处于积极开发状态。

  其他主流国际象棋界面大多明确表示没有支持variant的计划,或者没有支持中国象棋的计划,例如pyChess。目前最接近支持中国象棋的界面是Cute Chess,有一个PR支持中国象棋,但没有被合并。

  请注意在WSL2中使用图形界面(也就是WSLg),需要一些技巧和设置,比如你需要遵循微软的指引,你的发行版可能会对WSLg有特定的安排(比如OpenSUSE的),你可能遇到问题(比如我就遇到重启后cannot open display: :0的问题)需要解决方法。具体请自行摸索。

协议

  与中国象棋有关的协议主要包括CECP,UCI和UCCI,其中CECP主要是xboard及其windows衍生版本winboard在用,它们也只支持这一种协议(其他协议可以通过工具转换),所以该协议也被很多程序称为xboard协议;UCI是使用最广泛的国际象棋协议,中国象棋在使用的时候如果处理不当会有兼容性问题(下文会提到);UCCI是专为中国象棋制定的协议,几乎没有开源界面支持(这里的几乎还是一种严谨而委婉的说法)。Pikafish只支持UCI协议,而Fairy-Stockfish支持CECP/UCI/UCCI协议。

实际使用

  从上文可以看出,我们基本上只有两种引擎、两种界面可用,他们组合起来分别有以下技巧和问题:

XBoard+Fairy-Stockfish

  一般的发行版都带有XBoard包(我用的是OpenSUSE的包),默认没有提供中国象棋棋盘和棋子,如果你安装的版本也是这样,那么可以在Kadagaden/chess-pieces或者其他地方下载棋盘和棋子,然后在XBoard中打开View - Edit Theme List...,添加形如这样的配置(注意坑点:路径写~不能识别,也没有报错;写~~指的是安装路径,例如/usr/share/games/xboard),然后在View - Board...中双击gmchess就可以使用相应棋盘和棋子配置了(如果你棋盘显示不正常,根据下一步加载引擎后就会正常了):

"gmchess" -ubt true -lbtf "/home/you/xboard/gmchess_wood/xiangqi_gmchess_wood.png" -dbtf "/home/you/xboard/gmchess_wood/xiangqi_gmchess_wood.png" -lbtm 1 -dbtm 1 -lsc #C8C365 -dsc #77A26D -ub false -upf false -pid "/home/you/xboard/gmchess_wood" -trueColors true -hsc #FFFF00 -phc #FF0000 -overrideLineGap 0

  你需要在fairy-stockfish/Fairy-Stockfish-NNUE而不是fairy-stockfish/Fairy-Stockfish下载最新版的引擎(引擎已经内置nnue文件),前者最新版是2023年1月的,比后者的2021年11月要新;记得要下载标着xiangqi或者largeboard的版本。

  Fairy-Stockfish支持CECP协议,所以只需要在XBoard的Engine - Edit Engine List...中添加形如这样的配置,然后在Engine - Load New 1st Engine的界面中双击Fairy-Stockfish就可以调入引擎了(同样注意路径的坑,这里用-fd指定工作目录的方法不可以用于上面的Theme List:

"Fairy-Stockfish" /variant=xiangqi -fcp "./fairy-stockfish-largeboard_x86-64-bmi2" -fd "/home/you/xboard/fairy-stockfish"

  如果加载后XBoard崩溃跳出,可以尝试加载一下其他象棋引擎(也就是Pikafish了)再加载Fairy-Stockfish。

  XBoard的Engine - Common Settings...中可以调整一些与引擎有关的设置,Pikafish建议把CPU数设高,Hash-Table设高(达到1-2GB)。XBoard的Engine - Engine #1 Settings里面还有具体引擎的设置,Pikafish建议把MultiPV设成1。

  然后你执红走一步,引擎就会执黑走棋了。如果没有加载开局库,一开始几步棋会很慢,可以通过引擎输出界面看看它在做什么。当然你也可以不走棋,使用Mode - Two Machines让引擎对弈(需要加载1st和2nd引擎)。你还可以在Mode - Edit Position状态下编辑棋局,用左键拖动棋子,右键修改棋子(点击后向不同方向拖动右键可以改变棋子内容,滚轮也可以);编辑完之后选择Mode(例如Machine Black)就可以开始下棋了,如果XBoard报告"It’s not black’s turn"之类的,那么你要操作另一方先走一步再点击相应Mode。

XBoard+Pikafish

  XBoard的部分与上一节相同,而引擎的部分有所区别。

  虽然Pikafish的各个版本可以从official-pikafish/Pikafish中轻易获得,但是它并没有像Fairy-Stockfish一样集成nnue文件,不同版本的引擎不可换用其他版本的nnue文件。而除了最新版本对应的nnue文件可以从official-pikafish/Networks下载到以外,其他版本的nnue文件是没有官方途经可下载的(official-pikafish/Networks中只有一个release,但每当有新的nnue,作者就会更新这个release并删掉旧的文件,理由不明)。你需要把引擎文件和nnue文件放到同一个目录,两者的文件名最好相同(例如pikafish和pikafish.nnue)以便自动调用。

  Pikafish不支持CECP协议,你需要使用uci2wb(意思是UCI to Winboard)程序来转换。关于uci2wb的介绍到处都有,但是源码和二进制程序有一点难找……作者网站上的源码打不开,有人提供了一份可能不是最新的源码在ianfab/uci2wb,我是从Ubuntu的包里面获得二进制程序的。在XBoard中这样设置引擎:

"Pikafish" /variant=xiangqi -fcp "./uci2wb ./pikafish-bmi2" -fd "/home/you/xboard/pikafish"

  也许你觉得XBoard有个-fUCI参数,加载引擎的界面上也可以选UCI,不是能直接用么?实际上这个参数会调用比uci2wb更古老的一个转换器polyglot,而它和uci2wb一样不是XBoard自带的,需要去找,还不如直接用uci2wb,因此上面的设置实际上等价于

"Pikafish" /variant=xiangqi -fUCI -adapterCommand "./uci2wb ./pikafish-bmi2 "%fd"" -fd "/home/you/xboard/pikafish"

  uci2wb这个协议转换器带来一个重要的问题:XBoard与Pikafish连用时,无法支持残局,使用残局开局会崩溃跳出。个人推测可能是uci2wb并没有把初始局面正确告知引擎,技术水平有限无法分析代码,只能猜测了。

Liground+Fairy-Stockfish

  Liground内置了三个引擎(包含了某个版本的Fairy-Stockfish,所以你不下载引擎也可以),你可以把自己下载的Fairy-Stockfish放到./resources/engines/目录下去替换相应文件。   在界面中,左边选择棋盘和棋子的样式,右上区域的下拉框选择Xiangqi,然后引擎的下拉框就只有支持中国象棋的引擎可选了。你可以通过界面上的FEN栏来编辑局面。界面上打开PVE开关,并且把引擎后面的启用开关也打开,就可以与AI对弈了。可惜的是,Liground并不支持两个引擎对弈,虽然可以添加和删除引擎,但多个引擎只会对下一步的可能性进行分析,并不会行棋。   

Liground+Pikafish

  这是最麻烦的一套组合,因为Pikafish虽然支持UCI协议,但棋盘编号、UCI option等方面与Liground并不兼容。根据Liground和Pikafish两边的issue,你需要使用修改了代码的Pikafish。mtaktikos/Pikafish是一个修改后的230216版,但是你很可能没法找到230216版Pikafish对应的nnue文件……所以我根据mtaktikos的工作照抄了一个231203版的,在williamgateszhao/Pikafish,release中附上了231203版Pikafish对应的nnue文件。

结论

  完全使用开源方案跑中国象棋还挺麻烦的……这可能和中文软件开发的恶劣环境有关,我不想多说。

如果你只是想和轻易碾压你的AI下棋,你可以使用以上四种组合中的任意一种,其中Liground+Fairy-Stockfish可能是相对简单的方案。 如果你想使用残局与AI对弈,你可以选XBoard+Fairy-Stockfish,Liground+Pikafish或Liground+Fairy-Stockfish。 如果你想让两个AI对弈,你可以用XBoard+Pikafish或XBoard+Fairy-Stockfish。使用不同版本的引擎,让他们对弈也挺有乐趣的,也许还能学习一下走法。 如果你想使用残局让两个AI对弈,你只能使用XBoard+Fairy-Stockfish。

  本文没涉及到的部分包括:

XBoard有可能崩溃,除了本文提到的先载入Pikafish再载入Fairy-Stockfish(哪怕你只想载入后者)的技巧之外,还可能有其他情况、其他解决方案,请自行摸索。 Pikafish和Fairy-Stockfish引擎本身都有一些选项可以调整,我也没有形成经验,就不胡说了,你可以看他们各自的wiki自行摸索。 Pikafish制定了一个“中国象棋程序竞赛规则”,这个规则和人类竞赛规则并不完全一样,越新版本的Pikafish越向这个规则靠拢,或者说逐步取消了一些符合人类竞赛规则的选项。这会导致其他引擎觉得合法的走法Pikafish认为是禁手,或者反过来Pikafish认为是合法的走法被XBoard认为是禁手(对于后一种情况也许可以调整XBoard的Adjudications界面中的选项),我的象棋水平太差没法具体分析,请自行摸索 通过不同的时间限制,也许可以让AI对弈更有趣,但引擎似乎不完全遵守时间限制(按照引擎公开的测试数据,它们应该是遵守的才对),可能是协议或界面的问题,请自行研究。


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭