前几天在和别人聊天的时候谈到 sunfish 这个开源项目,这是一个只用了111行python代码写成的国际象棋引擎,这个111行引擎本身还不弱。聊天结束后,我几乎立刻有了兴趣在中国象棋上复刻一版sunfish,于是我也这么做了。实际上代码工作顺利地难以置信,短短两天的部分业余时间就已经完成了算法的移植工作,产出了一个只用124行代码就实现的中国象棋引擎elephantfish (github地址https://github.com/bupticybee/elephantfish)。
至于棋力嘛,对于如此精简的中国象棋引擎我本来也没有什么期望,我自己和elephantfish下了两盘棋,由于太久没有下象棋,我两盘都不小心被抓住了漏洞输了,我也将elephantfish和象棋小巫师的傻瓜难度做了对弈,结果是思考时间为1秒的elephantfish不敌象棋小巫师,当思考时间扩展到5秒时终于可以下过了(但此时象棋小巫师思考深度为2,elephantfish思考深度为7~9,所以在局面评估函数上实际进步空间还非常大)。
实际上能够这么短时间完成elephantfish归功于几个原因:
- sunfish 本身写得非常通用,很多数据结构几乎不需要怎么更改就可以和中国象棋通用,一些只需要少量更改,其中值得一提的是,关键模块 Searcher 的代码用在移植到中国象棋的时候更是一行未改。
- 中国象棋领域已经有一些开源的优秀的算法存在,比如说 象眼 ,其提供的子力价值表非常具有参考价值,事实上我直接在程序中使用了部分象眼的子力价值表。
- xqbase提供了一系列常见算法的解释和翻译,正是这些翻译放我在理解sunfish的逻辑时可以非常顺利。
这个项目的目的是提供一个类似 sunfish 的象棋引擎codebase,让即使不研究这个领域的同学也可以方便快速地上手做一些实验,或者至少让对这方面感兴趣的同学只需要花一点点的时间就可以完全理解一个简单的中国