AI實現五子棋機器人(一)
前言:
前幾天在 csdn 下載資源的時候才發現自己 csdn 有近 200 的下載積分,看了看共享的資源,哈哈 ... 7年前寫的五子棋遊戲很受歡迎。
下載地址:新手入門五子棋遊戲 剛入行的時候寫的,采用的 "權值" 計算法。
在這個 AI 的浪尖風口上,借助我對遊戲領域的熱愛,在工作余外的時間喚起了我的想法,學習 AI 實現一個五子棋機器人。
一、五子棋介紹
種類及區別
先說說五子棋吧,通常大家玩的五子棋分為帶禁手和不帶禁手兩個版本,
(前者稱之為連珠
Renju,後者一般稱之為五子棋
Gomoku)
然而無論哪一個版本,先手黑棋均必勝。
(所謂黑必勝
(禁手規則增加程序復雜度,暫不考慮加入)
這裏只說結果,至於為什麽參考文末資料:
1992年Victor Allis通過編程證明不帶禁手的五子棋,黑必勝。
2001年Janos Wagner第一次證明的帶禁手的五子棋,也是黑必勝。
先手優勢及棋譜介紹
黑棋的優勢到底有多大呢?在26個職業開局裏,已經發現有19個是黑棋必勝的(一打必勝)。
因此為了進一步削弱黑棋的優勢,國際上推出五手兩打
的規則。
(就是黑棋的第三步需要下兩個點,但由白棋挑選讓其下較弱的哪一個)
可是人們發現黑棋帶禁手依然是必勝。
從實踐的角度來講,網上是可以搜索地毯譜
的,一般在幾百兆左右,可以用renlib
軟件打開,
所謂地毯譜的意思就是黑棋會指定下法,但白棋每一步都可以選擇棋盤任意位置,最後黑棋必勝。也就是說,只要按照此棋譜下棋,五子棋世界冠軍都一定會輸給你。
( 目前花月、浦月、雲月、雨月、峽月、溪月、金星、水月、寒星、明星、嵐月、新月、名月,山月,殘月都是五手兩打
必勝)
那麽正式的比賽是怎麽玩的呢?
現在的正式比賽通常會常用三手交換
、五手兩打
這些復雜的規則來平衡比賽,但這些規則的各個分支也是逐漸被人破解,
五子棋的比賽已經很大程度不是在考驗自己的臨場發揮,而是考驗選手對於少量黑白平衡 分支的記憶情況。
廣義的五子棋
不帶禁手的五子棋是屬於一類更為普遍的 m,n,k遊戲 的一種特例,既 15,15,5。
m,n,k遊戲是指m行n列,輪流下子,連成k個算贏。這個在數學中專門的研究如果在最理想下法(Perfect Play)
的情況下有什麽樣不同的結果,
比如標準的三連棋(Tic-tac-toe)是3,3,3是一個平局,同樣只有六路棋盤的五子棋也是平局,當然上面我們已經說明了15,15,5是先手必勝,
還有研究發現11,11,5也是先手必勝。m,n,k遊戲只有先手必勝和平局兩種結果。由於每下一個子都一定會對下子一方那一方有優勢,
所以可以通過反證法證明m,n,k遊戲裏不可能有後手勝利的情況。如果後手有勝利的方法,
那麽先手可以提前借鑒(Strategy stealing)
過來實現必勝。
參考來自:Csdoker‘s Blog
二、實現思路
開發語言:HTML5、JS (輕)
繪制棋盤、勝負判斷規則、界面操作功能,這些比較基礎的內容暫時不考慮;
采用一個三維數據來定義棋盤內容:
var _chessPieces = new Array(); _chessPieces[16][16][1] = -1; // [16][16] 棋盤大小:15 * 15,[1] 黑白棋子 (-1 沒有棋子,0 白色棋子,1 黑色棋子)
AI實現五子棋機器人(一)