象棋软件小程序,设计实现天天象棋的“分析局势图”功能爱下棋的人都会对棋局进行复盘,复盘棋谱如天天象棋的“分析”有局势图功能,如下:对整局棋每招进行分析和打分,图上棋盘内会显示“优良中差”,图下部分显示整局局势曲线。这个功能用于快速复盘是比较实用的。整局棋的分析,自然是把的每步后的局面(交给AI引擎)单独分析,计算每个局面的最优招法,以及局面的分数。之后再把它们连串起来,便是这一局棋的趋势数据了。如何计算最优招法和局面打分?自己写一个引擎?或者使用第三方。使用云库接口有个好处,不用自己的服务器算力,省得自己服务器cpu跑100%啥的,否则其他服务就受影响了。但是云库也有个缺点,它不是每个局面都有数据,如果你查询一个它没有的局面,它会返回“unknown”。做全局分析缺一两个局面的话,肯定不适合,云库只能舍弃。几经思考,最终选择了使用引擎:皮卡鱼(pikafish)。皮卡鱼比较牛x,开源而且免费,目前它是棋力最高的引擎,没有之一(它直接把原来那些收费引擎给干翻了)。复盘查看棋谱时候,对每一个局面的分析,这个过程是很耗时间的。用户点击查看“局势图”时候,这个分析是在用户端,还是在服务器后端?是实时计算,还是异步计算?看天天象棋APP,在点击分析之后,局势图曲线逐渐由左到右慢慢“跑”过去的,而查看之后,下一次再看它,就“咻”一下子跑到右边了。大概可以推测,天天象棋的做法是:把引擎放到用户端、同步计算、再加上一个缓存机制。把引擎放到用户端去,这样好啊,不用服务器来计算,省去一笔算力,充分利用“分布式计算”,何乐而不为?但我们做的是小程序,小程序不是APP,带不了那么重的引擎到用户端去。没法,只能把它放在后端了。用户点击局势图,小程序把棋局信息发给后端,后端把结果返回给小程序,小程序绘图,搞定!缺点1:棋局长短不一,有的百几回合,算下可能几分钟过去了,请求超时或者用户等不及,关掉了。缺点2:后端算每一局棋,如果多几个用户,你这个2c4g的破服务器,如何hold得住?缺点3:不同用户看相同棋局,重复计算也是个浪费算了(虽然可以用缓存解决)一轮考虑之后,还是采用提前预分析棋局的方法了:提前对服务器上的所有棋谱进行分析,结果存储好。用户请求查看哪局趋势图就返回对应的数据。提前计算也有个缺点,后端十几万局棋,挨局分析需要两三个月时间(现在跑了一个多月了,才跑一半棋谱)。好在用户查看棋谱,较大概率是看最新的。所以我们预分析时候,棋谱从新到旧扔给引擎做分析就好,用户查看最新棋谱一般看到的都是分析好的了。思路就这样,前后端代码就不放了,又多又乱(人称堆屎山),而且这个地方太小也写不下。查看棋谱页,页面内“报告”按钮即可进入局势图功能。
如果你有编写\包装棋软的想法,可以加本人微信(yuc_cn)交流心得。