象棋软件小程序,设计实现天天象棋的“分析局势图”功能
爱下棋的人都会对棋局进行复盘,复盘棋谱如天天象棋的“分析”有局势图功能,如下:

对整局棋每招进行分析和打分,图上棋盘内会显示“优良中差”,图下部分显示整局局势曲线。这个功能用于快速复盘是比较实用的。
本人去年开始开发了一个中国象棋的微信小程序(《AI代替什么?最近编写的一个棋谱小程序,前端大部分是通过AI 生成的》),版本迭代几次,自然也是想加上“局势图”的功能。
思路设计
整局棋的分析,自然是把的每步后的局面(交给AI引擎)单独分析,计算每个局面的最优招法,以及局面的分数。之后再把它们连串起来,便是这一局棋的趋势数据了。
引擎的选择
如何计算最优招法和局面打分?自己写一个引擎?或者使用第三方。
自己写的话……算了,还是用第三方的吧!
3年前写过一文《中国象棋云库|一个基于分布式计算和存储的中国象棋棋软》,做这个局势图分析的引擎自然是最优先想到这个云库了。
使用云库接口有个好处,不用自己的服务器算力,省得自己服务器cpu跑100%啥的,否则其他服务就受影响了。
但是云库也有个缺点,它不是每个局面都有数据,如果你查询一个它没有的局面,它会返回“unknown”。做全局分析缺一两个局面的话,肯定不适合,云库只能舍弃。
几经思考,最终选择了使用引擎:皮卡鱼(pikafish)。

皮卡鱼比较牛x,开源而且免费,目前它是棋力最高的引擎,没有之一(它直接把原来那些收费引擎给干翻了)。
现在很多棋软都是用它作为引擎,包括天天象棋。
终端还是云端?实时还是异步?
引擎选择好了,接下来的就是实现了。
复盘查看棋谱时候,对每一个局面的分析,这个过程是很耗时间的。用户点击查看“局势图”时候,这个分析是在用户端,还是在服务器后端?是实时计算,还是异步计算?
看天天象棋APP,在点击分析之后,局势图曲线逐渐由左到右慢慢“跑”过去的,而查看之后,下一次再看它,就“咻”一下子跑到右边了。

大概可以推测,天天象棋的做法是:把引擎放到用户端、同步计算、再加上一个缓存机制。
把引擎放到用户端去,这样好啊,不用服务器来计算,省去一笔算力,充分利用“分布式计算”,何乐而不为?
但我们做的是小程序,小程序不是APP,带不了那么重的引擎到用户端去。没法,只能把它放在后端了。
用户点击局势图,小程序把棋局信息发给后端,后端把结果返回给小程序,小程序绘图,搞定!
嗯,说的简单,后端还有一堆工作呢。
如果后端实时算每局棋,有一堆缺点:
缺点1:棋局长短不一,有的百几回合,算下可能几分钟过去了,请求超时或者用户等不及,关掉了。
缺点2:后端算每一局棋,如果多几个用户,你这个2c4g的破服务器,如何hold得住?
缺点3:不同用户看相同棋局,重复计算也是个浪费算了(虽然可以用缓存解决)。
一轮考虑之后,还是采用提前预分析棋局的方法了:提前对服务器上的所有棋谱进行分析,结果存储好。用户请求查看哪局趋势图就返回对应的数据。
提前计算也有个缺点,后端十几万局棋,挨局分析需要两三个月时间(现在跑了一个多月了,才跑一半棋谱)。
好在用户查看棋谱,较大概率是看最新的。所以我们预分析时候,棋谱从新到旧扔给引擎做分析就好,用户查看最新棋谱一般看到的都是分析好的了。
后端架构大概就是这个样子了:

思路就这样,前后端代码就不放了,又多又乱(人称堆屎山),而且这个地方太小也写不下。
实现效果
最后,附上小程序,这个挫样子,查看棋谱页,页面内“报告”按钮即可进入局势图功能。
最终实现的小程序效果,前端页面是这个样子:

如果你有编写\包装棋软的想法,可以加本人wx(yuc_cn)交流心得。
(全文完)
(欢迎转载本站文章,但请注明作者和出处 编程想法 – Yuccn )