c 五子棋 遊戲完整原始碼博弈樹AI

2021-09-25 05:41:12 字數 2255 閱讀 3404

五子棋博弈搜尋實驗報告

一 實驗內容

五子棋對弈程式

二 演算法、資料結構與函式設計

演算法:由於五子棋比一字棋難,規則多,又有禁手限制,無法採用簡單的搜尋和加分方式。

為了分清各種情況的輕重緩急,我們採用一次性打分的策略:

對棋盤上的每個空位根據情況的輕重緩急,越重越爭分越高,反之越低,然後根據打分找出分值最高的的位置下子。

打分事實根據有:是否贏棋(最高),對方是否要贏棋,是否禁手,可形成四連的個數,和形成三連(包括活三)的個數,對方可可形成四連的個數,和形成三連(包括活三)的個數,等等。

本演算法的好處在於,既有攻又有守,而且攻守較嚴。

資料結構:

根據演算法的一般要求以及實際問題需要,為了方便操作,我們用二維陣列(int)表示棋盤:

chessboard [15, 15]

其中1表示黑子,-1表示白子,0表示無子。這樣定義方便輪轉棋子的顏色。

為了方便悔棋,我們定義了乙個專門用於悔棋的內部類:

public class steppoint//下棋點,用於回溯

;public stack backstack = new stack();//悔棋用的。

判斷一局棋是不是結束用乙個bool變數:bool end;

函式:根據演算法的要求和實際問題的需要,我們定義了以下幾個函式:

//求color色棋在(x,y)點的權重

private int pointweight(int color, int x, int y)

//尋找最好的10個下棋點,如有多個最大值,則採用隨機方式給出。找不到就返回false

private bool searchbestpoint(int color,ref int x, ref int y)

//(x,y)處放color色棋后是否能在(x1,y1)和(x2,y2)之間形成活count且不被另一色棋時不被破壞

private bool breaklivecount(int color, int count, int x, int y, int x1, int y1, int x2, int y2)

//求兩點(x1,y1),(x2,y2)間最長的color色連的棋的數目

private int linkcount(int color, int x1, int y1, int x2, int y2)

//判斷兩點(x1,y1),(x2,y2)間是否存在活的count(0~5)

private bool livecount(int color, int count, int x1, int y1, int x2, int y2)

//判斷點(x,y)放入黑棋后是否形成長連(6連)

private bool haslonglink(int x, int y)

此外,還有其他介面函式等等。

三 打分(權重)演算法設計與實現

在本演算法中,最重要的就是打分了。也就是int pointweight(int color, int x, int y)函式的實現。由於黑棋有禁手而白棋無禁手,故兩種棋的打分策略略有不同,當電腦為黑子時,多攻少守,當電腦為白子時,多守少攻。具體如下:

int colorlink = new int[6];//下棋方棋連數從0~5(由下標值表示)

int colorlive = new int[6];//下棋方活連棋數從0~5(由下標值表示)

int fcolorlink = new int[6];//對手方棋連數從0~5(由下標值表示)

int fcolorlive = new int[6];//對手方活棋連數從0~5(由下標值表示)

if (color == 1)//如果是下棋方是黑子,有禁手

}else//如果是下棋方是白子,考慮黑子的禁手

四 測試方法及測試結果

(電腦先走):

第一輪:

第二輪:

第四輪:

從結果可以看出:當電腦是白子時,電腦採用多守少攻的策略。

六 實驗心得

我們在試驗中遇到了不少的問題,但是經過大家的努力和仔細分析除錯,終於使實驗取得成功。整個過程中我們遇到的主要問題以及吸取到的一些經驗教訓如下:

採用打分演算法有乙個缺點,就是不能進像極大極小和α-β搜尋那樣進行行更深度的搜尋,

因為該點的權重只對當前棋盤的棋形有效,當對方下了一子後,棋盤棋形變了,該點的權重有可能從原來的最好(也就是最急)變成最差的。

總體來說,我們的這次實驗還是進行的很成功的,這跟團隊合作以及個人能力都是分不開的。實驗過程令人受益匪淺。

原創 五子棋大師2 0完整原始碼

大學期間與同班同學徐志強一起開發了五子棋大師2.0程式,到今年已有10個年頭了,現共享出來以表紀念 五子棋大師採用了專家系統的相關思想,內設棋譜庫 推理機結合當前棋局就可以推理了,每次推理針對每個節點打分 評價 評價分為進攻和防守,每個節點評價完成後,選擇乙個最有利的乙個點下棋。五子棋大師對於進攻和...

c 小遊戲 五子棋

include include includeusing namespace std const int x 21 棋盤行數 const int y 21 棋盤列數 char p x y 定義棋盤 int m 0 定義臨時點,儲存輸入座標 int n 0 void display 輸出棋盤 else...

c 小遊戲 五子棋

include include includeusing namespace std const int x 21 棋盤行數 const int y 21 棋盤列數 char p x y 定義棋盤 int m 0 定義臨時點,儲存輸入座標 int n 0 void display 輸出棋盤 else...