极大极小搜索 α-β剪枝的实现
//---------搜索当前搜索状态极大值--------------------------------//
//alpha 祖先节点得到的当前最小最大值,用于alpha 剪枝//beta 祖先节点得到的当前最大最小值,用于beta 剪枝。
//step 还要搜索的步数
//return 当前搜索子树极大值
protected int findMax(int alpha, int beta, int step) {
int max = alpha;
if (step == 0) {
return evaluate();
}
int[][] rt = getBests(1 - sbw);
for (int i = 0; i < rt.length; i++) {
int x = rt[i][0];
int y = rt[i][1];
if (getType(x, y, 1 - sbw) == 1) //电脑可取胜
return 100 * ( getMark(1) + step*1000 );
isChessOn[x][y] = 1 - sbw;
// 预存当前边界值
int temp1=x_min,temp2=x_max,temp3=y_min,temp4=y_max;
resetMaxMin(x,y);
int t = findMin(max, beta, step - 1);
isChessOn[x][y] = 2;
// 还原预设边界值
x_min=temp1;
x_max=temp2;
y_min=temp3;
y_max=temp4;
if (t > max)
max = t;
//beta 剪枝
if (max >= beta)
return max;
}
return max;
}
//alpha 祖先节点得到的当前最小最大值,用于alpha 剪枝
//beta 祖先节点得到的当前最大最小值,用于beta 剪枝
//step 还要搜索的步数
//return 当前搜索子树极小值。
protected int findMin(int alpha, int beta, int step) {
int min = beta;
if (step == 0) {
return evaluate();
}
int[][] rt = getBests(sbw);
for (int i = 0; i < rt.length; i++) {
int x = rt[i][0];
int y = rt[i][1];
int type = getType(x, y, sbw);
if (type == 1) //玩家成5
return -100 * ( getMark(1) + step*1000 );
// 预存当前边界值
int temp1=x_min,temp2=x_max,temp3=y_min,temp4=y_max;
isChessOn[x][y] = sbw;
resetMaxMin(x,y);
int t = findMax( alpha, min, step - 1 );
isChessOn[x][y] = 2;
// 还原预设边界值
x_min=temp1;
x_max=temp2;
y_min=temp3;
y_max=temp4;
if (t < min)
min = t;
//alpha 剪枝
if (min <= alpha) {
return min;
}
}
return min;
}