本帖最后由 MojeDes 于 2016-8-9 10:46 编辑

大家好,我是来自TML小组的夕阳延辉。
自从看到帕西的解数独游戏视频(地图原作者是Az大大)以及那时候乾坤正在做五子棋AI,于是我突发奇想,打算在MC里面做一个智能解数独。
终于,历经千难万险,我做出了这个东西。
那么,废话不多说了,我来讲讲它的原理吧。

在开始之前,我们得明确一个方案,这里我用粗略的流程图来表示一下:


现在就是详细讲解一下了:
首先做一个棋盘,棋盘边上放置4个盔甲架(视情况而定),这些盔甲架(你也可以用其他任何实体用来探测)名称分别叫find(遍历整个数独的东西)、col(列Column的缩写)、row(行)、box(宫)。


他们的作用分别是:find用于全盘探测和深度搜索、row用于行探测、col用于列探测、box用于宫探测。
·创建一个记分板,名字叫round(随你定),类型为dummy
开始的时候,玩家会按下按钮,那么这时就得将findround设置为0了(由于一些原因(后面会讲),我们需要给find规定round3的时候才能触发开始指令),那么相关的CB就需要根据findround来执行。
·先召唤一个叫做start的盔甲架
·在创造一个记分板,名字叫times(随你定,以后不做赘述),类型为dummy
看下面这个图,RCB循环型命令方块)一直执行给starttimes+1的指令;
第一个CCB连锁型命令方块)是一直把基础流程(由探测和唯一法填数组成的CB链)的CB脉冲型命令方块有时候是泛指所有类型的CB注意区别))激活(激活后再关闭,才能确保下一次能够激活),这个CCB是每一个游戏刻都会触发的,但是下一个CCB是每4个游戏刻才触发一次(3游戏刻触发一次会出现一些问题),因为考虑到后面的流程,所以必须要隔这些时间再执行一次。第三个CCB是当starttimes5的时候将分数改回0,以便达到循环的目的。第四个(可忽略)是用来告诉玩家正在使用唯一法解数独(当findround=1的时候)。



(有些CCB是空指令的。。。我懒得删掉了,楼主是个大懒货,嘿嘿)
基础流程:
接下来就是重头戏了!
深度搜索+剪枝:
其实有一种方法可以省去开始的探测,就是每个单元格都弄一个AEC,大概能省去160多游戏刻。。。
教程到此结束了,谢谢大家的观看,可能还有可以简化的地方,如果大家有什么更好的方法,欢迎大家提出或者自己实践! 至于检测无解数也不是很难,只要在深度搜索那里加一些探测的CB就行了,然后调用,如果达不到81,则视为无解。
希望大家能喜欢,给点金粒吧。
最后,祝TML小组一周年快乐!