我成功地为我编码的游戏实现了minimax算法。
问题在于可能的移动量。对其中的一些进行排序是行不通的,因为这些行动的每个人都可能有意义。
我的实施如下:
public int[] max (int depth, int player) {
HashSet<Vector3i> vector3is = possibleMoves(); //Vector3i is equal to a move
if(depth == 0 || vector3is.size() == 0){
int[] ret = gameMap.getEvaluation();
return ret;
}
int[] val = new int[players];
int diff = -10000000;
for(Vector3i v:vector3is){
gameMap.place((int)v.x,(int)v.y,(int)v.z, player); //takes the move
int nextID = (player + 1) % players; //nextPlayer ID
int[] ar = max(depth-1, nextID);
int diffN = 0;
for(int i = 0; i < ar.length; i++) {
if(i == player){
diffN += ar[i];
}else{
diffN -= (int)(1.1 * ar[i]);
}
}
if(diffN >= diff) {
if(depth == this.depth) {
move = v;
}
diff = diffN;
val = ar;
}
gameMap.undoPlace();
}
return val;
}
gameMap.getEvaluation()
不包括最小化其他玩家的价值。
因此,在forloop中,我的代码尝试最大化值diffN
,其考虑了其他玩家在该给定状态下的定位。
评估以int []给出。 index 0是索引为0等的玩家的定位。
现在,我想用这个实现alphabeta-prunning。我假设,而不是2个值,alpha和beta,我需要一个大小相等于我得到的玩家数量的数组。
我只是不知道如何实现它。
如果有人可以帮助我,我会很高兴。
问候,芬恩