轮子哥时间宝贵。我就来详细的讲一下这个穷举法的意思。
想当初旁听人工智能课程的时候就是讲的井字棋的AI实现。对一般人来说,实现井字棋最难的地方就是这里的这个AI算法了吧。
)——课件找不到了,好在我是认真听课了的!——(
下图这个就是所谓的穷举法的前两层。
……
实际情况下,完全遍历一颗博弈树的层级的节点数是指数级递增的:
层数 节点数
0 1
1 9
2 72
3 504
4 3024
5 15120
6 60480
7 181440
8 362880
那么实际的层数可以不要那么多就好了。
然后你就会问了,就算遍历了,怎么知道要怎样走呢。我们的Minimax算法就在这里出现了,具体介绍可以移步维基
Minimax。我就简单的说一下,在井字棋的游戏里面,两个人博弈,一个是用X,一个是用O,这里的X是Max,O就是这里的Min。X的策略就是让这个Max-Min的值尽可能的大,而O的策略就是让这个Max-Min的值尽可能的小。Max-Min的这个值就是我们要的分数值。
那么下一个问题,这个分数要怎么就算呢。其实这个也是可以自己总结出来的,数字也可以改,下面是NTU的网站上给的记分方法:
然后就可以得到下面的遍历的记分。(这个是4层遍历的情况)
这样一个简单的AI就实现了,接下来我们还可以把这个AI再完善一些,加上剪枝,加上一些经验的规则,一些经验的走法,再给AI加上开局库等等。
-----------
@vczh轮子哥简单一句穷举就把上面这些给带过了,也真是醉了-----------
接下来就是代码层面的具体实现了,这里的话就是要把js具体用进去了。前面的前辈们也说到了,真正学写代码还是要自己一个字母一个字母的敲进去才行,用代码实现我给几个简单的hint。
比如每一个棋位用什么表示,用数字,还是用一个矩阵。至于显示的话,比较直观的就是用Canvas来画。比方说对于计算机来说数组[1,4,9]就可以表示获胜。
另外一个小建议,这样的项目可以不用什么lib来实现,这样比较直观,Angular本身也不适合处理这个项目。它本身就是设计来收发json到页面的。
当然如果是要Hack,用什么lib都没有关系。
最后说一句,Codeacademy上的Javascript的课程并不好,我大概两年前就做过了,学完了不过是熟悉了JS的语法而已,真正JS里的重要的地方都没有提到,比如像什么bind, apply, call, __proto__这些特别容易混淆的地方,都是需要重新去看书。如果是学诚心想学Javascript的话,推荐看 《Javascript: The Good Parts》 这本书,不容错过。
以上,抛砖引玉,还望指正。
参考拓展:
Tic-tac-toe AI Cut & Paste Tic Tac Toe with AI(具体的JS实现,其实可以在这个基础上做得更漂亮的)
Minimax算法研究(TicTacToe)——————————————
P.S. 除去机器人的实现,剩余的部分有好的范例啦,参见
@Jasin Yip,代码很干净漂亮^^