五子棋專案的實現(三)人機對戰類的具體設計
在之前描述了博弈樹演算法的思想,現在則是關鍵類的設計實現。在具體的過程中我們先要設計一個遍歷棋型演算法,來遍歷整個棋盤中的各種棋型
通過最後返回值的不同,來確定不同的棋型
當中有評估函式對當前的棋型進行打分。再選取區域性最優的幾個落子點作為下一步擴充套件的節點。
//bwf 棋色 0:黑棋 1:白棋
//return 選出來的節點座標
private int[][] getBests(int bwf) {//傳過來的還是顏色
int i_min=(x_min==0 ? x_min:x_min-1);//x為真則是b值否則就是c值
int j_min=(y_min==0 ? y_min:y_min-1);
int i_max=(x_max==15 ? x_max:x_max+1);
int j_max=(y_max==15 ? y_max:y_max+1);
int n = 0;
int type_1,type_2;
int[][] rt = new int[(i_max-i_min) * (j_max-j_min)][3];//確定一個數組的大小
for ( int i = i_min; i < i_max; i++)
for (int j = j_min; j < j_max; j++)//迴圈的形式遍歷周圍最大最小值的位置
if (isChessOn[i][j] == 2) {
type_1 = getType(i, j, bwf);
type_2 = getType(i, j, 1 - bwf);
if(able_flag && bwf==0 && (type_1 == 20 || type_1 == 21 || type_1 == 22)) // 禁手棋位置,不記錄
continue;
rt[n][0] = i;
rt[n][1] = j;
rt[n][2] = getMark(type_1) + getMark(type_2);
n++;
}
// 對二維陣列排序
Arrays.sort(rt, new ArrComparator());
int size = weight > n? n:weight;
int[][] bests = new int[size][3];
System.arraycopy(rt, 0, bests, 0, size);
return bests;
}