百科问答小站 logo
百科问答小站 font logo



Javascript 初学者如何思考才可以把脑中的东西转换成代码写出来? 第1页

  

user avatar   ye-huo-taffy 网友的相关建议: 
       @vczh

轮子哥时间宝贵。我就来详细的讲一下这个穷举法的意思。

想当初旁听人工智能课程的时候就是讲的井字棋的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的网站上给的记分方法:

  • 己方在同一条线上有三子,记+100分;
  • 己方在同一条线上有二子,记+10分;
  • 己方在同一条线上有一子,记+1分;
  • 同理,对方在同一条线上有三子,二子,一子,分别记-100, -10, -1分;
  • 其余情况记0分。(在线上没有任一子或者同时有两方的子数)

然后就可以得到下面的遍历的记分。(这个是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

,代码很干净漂亮^^




  

相关话题

  如果一门编程语言中不允许对象(或结构体)循环引用,那么用它实现什么功能会比较困难? 
  不同编程语言的程序员之间有鄙视链么? 
  长期当程序员会失去什么? 
  为什么程序员有那么多过劳死的,知乎上还是乐此不疲的劝人转计算机专业? 
  为什么某些程序员要用mac? 
  大型公司里面如何防止程序员接触到核心代码? 
  接私活结果最后钱要不回来该怎么办? 
  编程的男生,打断他一下,他会很生气吗? 
  为什么程序员的工资比其他行业高这么多? 
  为什么大多数程序员都黑360呢? 

前一个讨论
asp.net 应用占用内存过大如何排查?
下一个讨论
ADO.NET Entity Framework 在哪些场景下使用?





© 2024-11-08 - tinynew.org. All Rights Reserved.
© 2024-11-08 - tinynew.org. 保留所有权利