臨近畢業,著手整理本科四年的**。本篇整理的是於去年大三完成的五子棋**。
課程需求完成基於c++對戰平台的pbrain.exe 的ai開發。詳細的課程要求和完成情況可以見這裡
主要實現的啟發式搜尋函式:
//alphabeta搜尋負極大值形式
int alphabeta(int depth,int alpha,int beta,int player,int maxdepth)
int bestmoveindex = -1;
int movelistlen = 0;
//可能下子的位置
mov* movelist = generatemoves(movelistlen, player);
//無棋時下中間
if (movelistlen == 1)
for (int i = 0; i < movelistlen; i++)
movelist = mergesort(movelist, movelistlen); //歷史啟發排序,alpha-beta時可用
//向下搜尋
for (int i = 0; iif (terminate || gettickcount() >= stoptime())
makemove(movelist[i], player);
//兒子結點為勝負已分狀態(真正的葉子結點),表明player方走這一步走法後會獲勝
if (isgameover(movelist[i]))
unmakemove(movelist[i]);
delete movelist;
movelist = null;
//負極大值是否要考慮是誰贏 從而返回+- :不用 一定是當前下子方連5子。否則就結束了
return
9999;
}movelist[i].val = -alphabeta(depth - 1, -beta, -alpha, 1 - player, maxdepth);
if (depth == maxdepth)
}/* if (note) */
unmakemove(movelist[i]);
if (alpha < movelist[i].val)
alpha = movelist[i].val;
bestmoveindex = i;
if (depth == maxdepth)
}if (alpha >= beta)
}if (bestmoveindex != -1)
if (depth == maxdepth && bestmoveindex!=-1)
delete movelist;
movelist = null;
return alpha;
}
接下來把c++版本的五子棋重構成基於html5的五子棋**。
首先在const.js 定義了所有要用的常量,比如棋盤距離,大小,各類棋形的評分。
chessboard.js 負責繪製棋盤,儲存棋盤等一切和棋盤相關的操作。
interact.js描述整個下棋的互動過程,相當於c++中的main函式。為了解決在啟發式搜尋時出現的頁面卡頓,引入了htm5的特性web worker。在執行時要注意使用支援該特性的瀏覽器。而該項目的使用方式呼叫了本地的檔案,由於安全原因在chrome上會出現cannot be accessed from origin 『null』的問題,可以搭建本地伺服器,然後通過本地伺服器訪問;或者使用firefox解決。
核心的**函式放在evaluate.js中實現。包括統計棋形,計算得分,alphabeta搜尋。基本思路和c++ version相似,可以說是將c++翻譯成js罷了。
C 實現五子棋
自己寫了一下午,但是還是除錯的時候存在很多問題 繼續改善繼續調整 game.h define game h define row 5 define col 5 void displayboard char board row col int row,int col void gameplayer c...
C 類實現五子棋
用乙個gobang類來實現五子棋功能。include include include using namespace std enum role 控制紅藍方 class gobang 建構函式 設定棋子初始位置為 7,7 紅色先下 遊戲開始 void start void change role 切...
c 實現五子棋遊戲
設計思路 先用二維陣列定義乙個棋盤,0代表沒有玩家下過,1代表玩家一的棋子,2代表玩家二的棋子,將棋盤輸出,然後讓玩家依次輸入所要下的位置的行數和列數,並賦值給陣列,之後進行判斷 判斷棋盤上所有棋子是否有連續5個,如果是,則返回獲勝玩家,如果否,則繼續輸入下一步要下的棋子座標 實現 1 includ...