百科问答小站 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

,代码很干净漂亮^^




  

相关话题

  优化代码中大量的if/else,你有什么方案? 
  如何看待「大部分中国程序员只会写三年代码」的说法? 
  舒服的代码和不舒服的代码,差距是怎样的? 
  知乎上三位大牛“温赵轮”有什么离奇的身世? 
  你在 GitHub 上看到过哪些有意思的 Issue? 
  强类型语言的优缺点是什么? 
  CSS的样式表 内联外部和内部优先级? 
  有哪些编程上的中文术语让人困惑,但是看英文就一目了然的? 
  数学和编程中,「函数」的概念相同在哪里,不同在哪里? 
  关于 C++ 顶层 const 和底层 const? 

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





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