Java:正确使用条件语句

时间:2015-05-04 18:39:38

标签: java algorithm artificial-intelligence minimax

我是初学者,我正在尝试通过应用minimax算法开发Connect4游戏,我陷入了确定它是最小玩家转弯还是最大玩家转弯的状态。我觉得这是减少的东西,但我一直想着两天试图解决它。 有什么帮助吗?

private int evaluatePlayerMove(int depth, int maxDepth, int col, int alpha, int beta) {
    boardsAnalyzed++;

    int evaluatedMove=0; // For evaluating min player move or max player move

    int min = Integer.MAX_VALUE, minScore = 0; // For min player

    int max = Integer.MIN_VALUE, maxScore = 0; // For max player


    if (col != -1) {

    // Check whether it's min player turn or max player turn

    // If it's min player turn then evaluate min move:

    if(//it's min player turn){
        minScore = board.getHeuristicScore(Board.MARK_BLACK, col, depth, maxDepth);
        if(board.blackWinFound()) {
            blackWinFound = true;
            return minScore;
        }


    if (depth == maxDepth) {
        return minScore;
    }
    for (int c = 0; c < Board.COLUMNS; c++) {
        if (board.isColumnAvailable(c)) {
            board.mark(c, Board.MARK_RED);
            int value = evaluatePlayerMove(depth + 1, maxDepth, c, alpha, beta);
            board.unset(c);
            if (value < min) {
                min = value;
                if (depth == 0) {
                    column = c;
                }
            }
            if (value < beta) {
                beta = value;
            }
            if (alpha >= beta) {
                return beta;
            }
        }


    }

    if (min == Integer.MAX_VALUE) {
        return 0;
    }
     evaluatedMove = min;
    }


   // If it's max player turn then evaluate max move:

    if(//it's max player turn) {
        maxScore = board.getHeuristicScore(Board.MARK_RED, col, depth, maxDepth);
      if (board.redWinFound()) {
            redWinFound = true;
           return maxScore;
       }
    if (depth == maxDepth) {
        return maxScore;
    }
    for (int c = 0; c < Board.COLUMNS; c++) {
        if (board.isColumnAvailable(c)) {
            board.mark(c, Board.MARK_BLACK);
            int value = evaluatePlayerMove(depth + 1, maxDepth, c, alpha, beta);
            board.unset(c);
            if (value > max) {
                max = value;
                if (depth == 0) {
                    column = c;
                }
            }
            if (value > alpha) {
                alpha = value;
            }
            if (alpha >= beta) {
                return alpha;
            }
        }


    }
    if (max == Integer.MIN_VALUE) {
        return 0;
    }

     evaluatedMove= max;
    } 


} 
return evaluatedMove;

}

1 个答案:

答案 0 :(得分:0)

在大多数实时AI情况下,它是您的AI程序与人类玩家。因此,通常情况下,如果要构建最小 - 最大树,AI程序将只是最小值或最大值,并且相同的树将是树的根。对于例如如果您尝试将AI程序作为最大值,则树的根将始终保持最大值,您只需要计算最大移动(最小移动将是用户输入)。对于这种情况,我建议使用树的深度作为检查条件。

if(root == max){
     for any node n:
            if(n.depth%2 == 0){
                  n is max
            }
            else{
                 n is min
            }
 }

因为深度通常用于几乎所有问题,所以这将是一种有效的方式。

但是,如果它是一个家庭作业问题而你确实需要计算min和max的移动,我建议使用一个实例静态布尔变量isMax,它应该在每次移动后翻转。