为多人游戏minimax实施alpha beta prunning

时间:2018-04-02 18:05:04

标签: java minimax alpha-beta-pruning game-theory

我成功地为我编码的游戏实现了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,我需要一个大小相等于我得到的玩家数量的数组。

我只是不知道如何实现它。

如果有人可以帮助我,我会很高兴。

问候,芬恩

0 个答案:

没有答案