五子棋的人工智慧演算法

2021-04-07 07:53:22 字數 1276 閱讀 6753

以前曾研究過五子棋的人工智慧演算法,這篇文章就是講的實現與原理。當然也只是做了最簡單的研究,人工智慧是個高深的學問,我基本上不懂,這裡的實現也只是憑自己的感覺來寫的,程式也不是我寫的,但是原理就是這樣。我相信還有高手,我的文章也只能提供給一些初學者看看了。

電腦下子實際上是分兩個步驟的,第乙個步驟是盡可能的收集棋盤格局的資訊,並且使這些資訊以一定的格式存放再記憶體中,以便於第二步的處理。第二個步驟就是,對收集到的資訊進行分析處理,即要給出乙個規則,用窮舉搜尋的辦法遍歷所有收集到的資訊,搜尋的過程實際上是用所定下的規則去衡量每一點的權值,搜尋的目的是為了找到乙個權值最大的點,這個點就是當前的最優解,也就是應該下的子。

具體的說來,在第一步中,可以用乙個13×13的二維陣列來存放棋盤上每乙個點的資訊。每下一步棋,就用乙個13×13的二重迴圈去遍歷棋盤上的每乙個點,可以參照如下的方法,即對於每乙個點,我們假定這個點放上黑子,這時候就判斷這個黑子放上去後,會形成多少個活2、活3、活4和五,然後把對應的數值填入上面所說的二維陣列裡面,然後再假定這個點放白棋,又會形成多少個活2、活3、活4和五,也填入二維陣列裡面。當然你也可以用兩個二維陣列分別儲存黑子和白子的情況,而且最好採用結構體陣列。這樣遍歷完棋盤後,再陣列裡面就儲存了有用的棋盤格局資訊。如下:

typedef struct tagnodeinfo

nodeinfo,*pnodeinfo;

nodeinfo white_chess[13][13];

nodeinfo black_chess[13][13];

下面就是如何利用所得到的資訊去下棋了。這個過程也是遍歷分析所得的資訊的過程。對上面的資訊,我們可以很好的處理。比如,假定四三是必勝的,則我們給他的權值就很大比如100吧,而活二給的權值應該比較小,就給1吧。然後你可以得到乙個權值的計算公式,比如: 權值=活二的個數×1+活三的個數×5+活四的個數×10+四三的個數×100,就是類似這樣的公式,當然我上面是隨便舉的。

下棋是就是遍歷每乙個點的資訊,對每乙個點計算權值,找到權值最大的就是要下的點了。上面說了用兩個陣列分別儲存黑子和白子的資訊也是有必要的,因為可以計算出某一點對黑白雙方的重要程度。就是說如果輪到你下白子了,你光看哪一點對白子有利也不行呀,還要看那些點對黑子有利,並且要比較這種有利的程度。如果你放某一點能成活3,而別人放另一點就是四三了,你就要搶先吧那一點佔了。

當然這樣的演算法也僅僅是考慮了當前的最優解,如果要進一步提高人工智慧,就要用更高階的搜尋法,對未來的幾步進行搜尋了。一般都是將搜尋空間組織成二叉樹的結構。這個我學的也不是很好,所以就不講了。

實際上,上面講的辦法還具有一般意義,不光是可以用到五子棋,再其他的棋類裡面也是這樣的,先搜尋資訊,再分析。

五子棋(人工智慧)

五子棋 人人對戰 人機對戰 include include 字元陣列的函式定義的標頭檔案 include standard library標準庫標頭檔案 define kong 0 define wanjia 1 define diannao 2 空位置設為0 玩家下的位置設為1 電腦下的位置設為2...

人工智慧五子棋實現原理

關於棋盤棋子的實現邏輯我就不多說了,大家可以看原始碼,並不複雜,說說ai部分的實現吧 我的實現思路是 1.走對自己獲得勝利最有利的點 說白了就是最接近5子連線的點 2.堵對對方獲得勝利最有利的點 說白了就是堵對方的棋子 做到這兩步就能實現乙個初級階段的人工智慧了。那麼接下來就講講關於計算獲得勝利最有...

人工智慧實現簡單的五子棋程式

我這個程式在qq五子棋上實驗了一下,結果是黑棋先手全勝,白棋后手的勝率卻慘不忍睹,原因有下 1 五子棋的先手是有優勢的,所以職業比賽裡都會有禁手來實現公平 2 水平有限,對局面的評估只有一小部分 主要思路就是博弈樹,程式向前看一步,對對手可能的走法進行評估,評估的策略主要有兩條 1 掃瞄整個棋盤,判...