为什么井字游戏中的算法不会阻止我的移动?

时间:2019-11-12 20:06:41

标签: java

我有一个正在工作的TicTacToe游戏,我试图在其中实现Ai以充当玩家“ O”。我遇到的问题是它不会阻碍我的行动。我已经使用断点阅读了很多次代码,但是仍然找不到问题。你们中的任何人都知道可能是什么问题吗? 这是minimax的主要功能:

public int miniMax(String player, int currentDepth, String[] board) {
    if(checkWin("O",board)){ //Checks if O wins. Returns 10-currentDepth to give value to terminal state (Ai wins)
        return 10-currentDepth;
    }
    if(checkWin("X",board)){ //checks if X wins. Returns -10-currentDepth to give value to terminal state (Ai loses)
        return -10-currentDepth;
    }
    if(checkTie(board)){ //Checks for tie. Returns 0-currentDepth
        return 0-currentDepth;
    }
    currentDepth++;//Increases depth
    if(player.equals("O")){ //If the player turn is O, I.E. the AI's turn/Max function of minimax
        bestVal=Integer.MIN_VALUE;
        bestSpot=0;
        for(int i=0;i<board.length;i++){ //For loop that iterates through each possible move for O.
            if(board[i].equals(" ")){ //Checks if the spot is empty before modifying it
                board[i] = "O"; //When spot is empty, sets equal to O
                int value = miniMax("X",currentDepth,board); //Recursive part of function. Recalls function changing the current player. Once it hits an end spot, gives it terminal value
                if((value)>bestVal){ //Checks if value is better then the best, to determine best possible move.
                    bestVal = value; //If value is better, then sets new best to it.
                    bestSpot = i;// The location of the next best move
                }
                board[i]=" ";//sets the original location to empty to prevent board from being permanently changed
            }
            else{}//When the spot isn't empty, just skips that check.
        }
        return bestSpot;//Returns the best spot to allow program to make a move. This is what gets sent to gamelogic
    }
    else{ //If the player turn is X, I.E. the players turn/Mini function of minimax
        minVal=Integer.MAX_VALUE;
        bestSpot=0;
        for(int i =0;i<board.length;i++){ //For loop that iterates through each possible move for X.
            if(board[i].equals(" ")){ //Checks if the spot is empty before modifying it
                board[i] = "X"; //When spot is empty, sets equal to X
                int value = miniMax("O",currentDepth,board); //Recursive part of function. Recalls function changing the current player. Once it hits an end spot, gives it terminal value
                if((value)<minVal){ //Checks if value is worse then the worst, to determine best possible move.
                    minVal = value; //If value is better, then sets new best to it.
                    bestSpot = i; //The location of the next best move
                }
                board[i] = " "; //Sets the original location to empty to prevent board from being permanently changed
            }
            else{} //When the spot isn't empty, just skips that check.
        }
        return bestSpot; //Returns the best move for X.
    }
}

这是我的双赢和平局功能:

private boolean checkWin(String player, String[] board){
    if(
            (board[0].equals(player) && board[1].equals(player) && board[2].equals(player)) ||//first col
            (board[3].equals(player) && board[4].equals(player) && board[5].equals(player)) ||//sec col
            (board[6].equals(player) && board[7].equals(player) && board[8].equals(player)) ||//third col
            (board[0].equals(player) && board[3].equals(player) && board[6].equals(player)) ||//first row
            (board[1].equals(player) && board[4].equals(player) && board[7].equals(player)) ||//second row
            (board[2].equals(player) && board[5].equals(player) && board[8].equals(player)) ||//third row
            (board[0].equals(player) && board[4].equals(player) && board[8].equals(player)) ||//diag \
            (board[2].equals(player) && board[4].equals(player) && board[6].equals(player)) //diag /
    ){
        return true;
    }
    else{
        return false;
    }
}
private boolean checkTie(String[] board){
    int inter=0;
    for (String s : board) {
        if(!s.trim().isEmpty()){
            inter++;
        }
    }
    return inter == 9;
}

让我知道您是否需要该程序中的更多代码。

1 个答案:

答案 0 :(得分:1)

在游戏状态下,您是否尝试过使用更复杂的奖励功能?我看到您只检查终端状态,“阻塞”对手没有额外的奖励。人工智能需要一种激励来执行某些动作,即您需要针对某些动作(例如封锁)来奖励它。