介紹
黑白棋,又叫反棋(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 α
實現