在我的 minimax 算法中,当计算机出现一个有两种方法来赢得计算机的玩家时,他只会选择棋盘上的第一个空位。以下面为例。X 可以在位置 0,2 和位置 1,0 中获胜。
X | |
__________
| x |
__________
x | o | o
目前我的算法会将 o 放在 0,1 的位置。我相信它这样做是因为当 minimax 运行并将 o 放置在位置 0,1 并且因为这不是胜利时,它再次调用 minimax,这次是 x。X 然后移动到位置 0,2 以获得胜利。对于这个职位,这将返回 -10。如果计算机移动到位置 0,2,则调用 minimax,并且 x 最终被放置在位置 1,0 中,这也为这次移动返回 -10。事实上,无论计算机将 o 放在哪里,都会返回 -10,因为无论玩家赢什么。因为对于放置的每个位置 o,它返回 -10,计算机将 o 放置在第一个可用插槽中,即 0,1,因为 max 永远不会从第一个位置更新。我希望它把 o 放在位置 1,0 或 0,2 只是为了表明它识别一个块。
我的算法如下。它适用于 3x3x3,但概念是相同的。
public int MiniMax(int pGameState[][][], int Depth, boolean IsMax){
FunctionCalls++;
if(CheckForWin(2, pGameState)){ //Max Player (since the computer is always 2)
return 10 - Depth;
}
if(CheckForWin(1, pGameState)){ //Player will win therefore we return -10. If this is the first level of the tree
//then the value return is -10. If the second ply then the value returned is -8.
//It is more important for the computer to win sooner than later.
return -10 - Depth;
}
if(Depth >= 2){
return 0;
}
if(IsMax){
int Value = Integer.MIN_VALUE;
for(int i=0; i<3; i++){
for(int j=0; j<3; j++){
for(int k=0; k<3; k++){
if(pGameState[i][j][k] == 0){
pGameState[i][j][k] = 2;
int best = MiniMax(CopyArray(pGameState), Depth+1, !IsMax);
if(best > Value)
Value = best;
pGameState[i][j][k] = 0;
}
}
}
}
return Value;
}
我最初这样称呼 minimax
best = MiniMax(CopyArray(GameState), 0, false);
然后我将最好的与我以前的 Max 进行比较。如果最好是更大的我把这个动作保存为我的电脑的动作。
函数式编程
翻翻过去那场雪
相关分类