人機對戰五子棋 權值法

2021-08-31 10:03:15 字數 1617 閱讀 1401

前面介紹了監聽機制,窗體使用,重繪機制,畫筆使用,物件傳遞等等概念,接下來我們來談一點演算法的東西,相信大家都玩過五子棋這個遊戲吧,在不包括先手禁手等複雜規則之下,我們只考慮最簡單的15*15格仔的棋盤,規則是只要沒有落子的地方均可下子,某一方連成五個棋子則獲勝,遊戲結束。

權值法在五子棋遊戲中是一種很基礎的演算法,它的思想包括以下幾個部分:

("010", 30);//活1

("020", 60);//活2

("030", 700);//活3

("040", 10000);//活4

("01-1", 15);//眠1

("02-1", 40);//眠2

("03-1", 500);//眠3

("04-1", 10000);//眠4

這種權值劃分方式只是我小時牛刀的一種而已,具體的數值該如何分配尚需要具體的商榷,大家可以在實現大體功能之後仔細斟酌和修改,此處不做過多討論。

2.權值計算

在前面我們已經分配好了各種情況的權值,接下來要做的是根據上述規則計算棋盤上所有點的權值大小,統計棋盤上各點的情況並把情況轉化為數字儲存起來。我們可以用乙個for迴圈來完成單個點的權值計算過程。假設當前點下標是

(i,j)。我們要對該點的八個方向進行檢索,可以寫八個函式分別對八個方向進行判斷

在這裡我選擇寫兩個陣列,然後通過陣列實現對八個方向的遍歷,先判斷遍歷方向的第乙個棋子是何種情況,然後再看他的後面有沒有與之相同的棋子,直到最終檢索到空白位置或者與之顏色相反的棋子,那麼就終止,然後統計在這個方向上的棋子排布,將其轉化為數字權值;最後將八個方向的權值累加起來放在權值陣列中,代表當前位置的權值

int x = ;

int y = ;

for(int i=0;i=0)&&(tmp_y>=0&&tmp_y<15)) {}//判斷邊界問題,不 能超邊界

else

}/*-2是初始化的值,如果temp沒被改變過,說明沒有超邊界,就把最終結束的ans賦給temp*/

if(temp==-2)

if(temp==-1)

}else }}

//這裡討論的是另一種情況,即遇上了對方白子的情況

else if(ans[tmp_x][tmp_y]==-1)

else

}if(temp==-2)

//如果遇上了黑子而停止,執行以下操作

if(temp==1)

}//如果是遇上了空白棋盤,執行下面操作

else if(temp==0)}}

}}

執行完上面這一段**之後,我們就能夠計算出(i,j)位置的權值大小了,接下來我們要計算出所有棋盤上空白位置的權值,用雙重for迴圈即可,**如下:

public void fill()
講到這裡,大概就是五子棋全職演算法的基本實現流程了,大致思路是對棋盤上的各種局勢的一種主觀性判斷,將主觀危險的判斷用數字來代替從而實現優先選擇的機制。

有疑問聯絡[email protected]

五子棋人機對戰

參考 人機對戰 填子遊戲的攻防策略 關於機器的應對策略,在前文中有所表述,不一一解釋,本文進行了修繕和補強,但漏銅依然存在。增加了乙個倒計時功能,測試了一下,感覺一般,還是留在那裡,表明曾經研究過,供今後完善 增加了棋譜儲存功能和回放功能 增加了悔棋功能,這個還是有些用處的。另外策略中增加了禁手。如...

JS五子棋之人機對戰

文章目錄 1.效果圖 2.ui篇 3.ai篇 先來看看最終實現的效果吧!勝利顯示 主要是使用canvas繪製棋盤以及棋子 canvas繪製棋盤 for var i 0 i 9 i canvas繪製棋子部分 var onestep function i,j,me i,j表示棋盤索引,me表示黑棋或白棋...

五子棋 從棋譜到人機對戰

1 棋譜的繪製 1 這裡主要是用到html5中的canvas標籤,他代表畫布的意思。定義乙個canvas標籤,給他的乙個寬度和高度,就相當於準備好畫畫的畫布。因為canvas是乙個行內標籤,所以要讓其水平居中,只有乙個margin 0 auto是不夠的,還要配合display block將其變為塊級...