五子棋博弈搜尋實驗報告
一 實驗內容
五子棋對弈程式
二 演算法、資料結構與函式設計
演算法:由於五子棋比一字棋難,規則多,又有禁手限制,無法採用簡單的搜尋和加分方式。
為了分清各種情況的輕重緩急,我們採用一次性打分的策略:
對棋盤上的每個空位根據情況的輕重緩急,越重越爭分越高,反之越低,然後根據打分找出分值最高的的位置下子。
打分事實根據有:是否贏棋(最高),對方是否要贏棋,是否禁手,可形成四連的個數,和形成三連(包括活三)的個數,對方可可形成四連的個數,和形成三連(包括活三)的個數,等等。
本演算法的好處在於,既有攻又有守,而且攻守較嚴。
資料結構:
根據演算法的一般要求以及實際問題需要,為了方便操作,我們用二維陣列(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...