黑白棋算法设计

介绍

黑白棋,又叫反棋(Reversi)、奥赛罗棋(Othello)、苹果棋或翻转棋。黑白棋在西方和日本很流行。游戏通过相互翻转对方的棋子,最后以棋盘 上谁的棋子多来判断胜负。它的游戏规则简单,因此上手很容易,但是它的变化又非常复杂。有一种说法是:只需要几分钟学会它,却需要一生的时间去精通它。

黑白棋的棋盘是一个有8*8方格的棋盘。下棋时将棋下在空格中间,而不是像 围棋一样下在交叉点上。开始时在棋盘正中有两白两黑四个棋子交叉放置,黑棋总是先下子。   

下子的方法:
把自己颜色的棋子放在棋盘的空格上,而当自己放下的棋子在横、竖、斜八个方向内有一个自己的棋子,则被夹在中间的全部翻转会成为自己的棋子。并且,只有在可以翻转棋子的地方才可以下子。

估价函数

黑白棋中最重要的是电脑对局势的判断,如何写好这样的估价函数是黑白棋人工智能程序的重点。

所谓的“金角银边草肚皮”,说明了子的位置的重要性是不同的。最最要的点是四个角,而和角相邻的三个点,则是不应该占领的,其次是四条边,占领后的好处也很多。

当然了除了子的位置,自由度也比较重要。
你的目标是限制对手的自由度(即棋步数量),同时增加自己的自由度




搜索算法

如果只是凭估价函数来走棋,是很难赢的,好的AI必须能够向前看几步,看得越深,棋力就越强。

这就涉及到博弈树搜索了,最经典是极大极小算法。

 

Minimax算法常用于棋类等由两方较量的游戏和程序。该算法是一个零总和算法,即一方要在可选的选项中选择将其优势最大化的选择,另一方则选择令对手优势最小化的方法。而开始的时候总和为0。
伪代码:
function  minimax(node, depth)
   
if  node is a terminal node or depth  =   0
       
return  the heuristic value of node
   
if  the adversary is to play at node
       let α :
=   +
       foreach child of node
           α :
=  min(α, minimax(child, depth - 1 ))
   
else  {we are to play at node}
       let α :
=   -
       foreach child of node
           α :
=  max(α, minimax(child, depth - 1 ))
   
return  α

 


实现

 

用javascript和html5写了一个黑白棋,实现了人机对战,有还不错的智能, 我自己已经很难下赢了。

请用chrome或者firefox打开,chrome的javascript性能更好~

演示地址:   http://slab.sinaapp.com/othello

 


你可能感兴趣的:(黑白棋算法设计)