Минимаксный алгоритм поиска наилучшего движения для тиктактого - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь создать игру TicTacToe в android, используя минимаксный алгоритм, чтобы найти наилучший возможный ход для компьютера. Но он возвращает следующее доступное место на доске каждый раз. Я пытался найти учебники и решения для этой проблемы, но до сих пор не получил ответа.

Это мой код, что я пытался.

private void compMove() {
    final String pos =bestMove();

    matrix[turn][turn2] = 'O';
    vars.get(pos).setImageDrawable(getDrawable(R.drawable.zero)); //put O in position
    whosmov="pm";
    getWinner(checkWinner());               //check if O has won
    }

    //finding best possible move for computer
    private String bestMove(){
        int bestscore=100,a=0,b=0;
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                if(matrix[i][j]==0){
                    matrix[i][j]='O';
                    int score=miniMax(matrix,0,true);
                    matrix[i][j]=0;
                    if(score<bestscore){
                        a=i;
                        b=j;
                        bestscore=score;
                    }
                }
            }
        }
        turn=a;         //position x for matrix
        turn2=b;        //position y for matrix
        return a+""+b;
    }

private int miniMax(char[][] matrix,int depth,boolean ismax) {
    int result=checkWinner();

    if(result!=0){
        return result;
    }

    if(ismax){
        int best = -100;
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                if(matrix[i][j]==0){
                    matrix[i][j]='X';
                  int score = miniMax(matrix,depth+1, false);
                  best=Math.max(score,best);
                    matrix[i][j]=0;
                }
            }
        }
        return best;
    }
    else{
        int best = 100;
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                if(matrix[i][j]==0){
                    matrix[i][j]='O';
                    int score = miniMax(matrix,depth+1, true);

                    best=Math.min(score,best);
                    matrix[i][j]=0;
                }
            }
        }
        return best;
    }
}

private int checkWinner() {
        //horizontal check
        for(int i=0;i<3;i++){
            if(matrix[i][0]==matrix[i][1] && matrix[i][1]==matrix[i][2]){
                if(matrix[i][0]=='X'){
                    return 1;
                }
                if(matrix[i][0]=='O'){
                    return -1;
                }
            }
        }
        //vertical check
    for(int i=0;i<3;i++){
        if(matrix[0][i]==matrix[1][i] && matrix[2][i]==matrix[0][i]){
            if(matrix[0][i]=='X'){
                return 1;
            }
            if(matrix[0][i]=='O'){
                return -1;
            }
        }
    }
    // Diagonal check
    if(matrix[0][0]==matrix[1][1] && matrix[1][1]== matrix[2][2]){
        if(matrix[0][0]=='X'){
            return 1;
        }
        if(matrix[0][0]=='O'){
            return -1;
        }
    }
    if(matrix[2][0]==matrix[1][1] && matrix[1][1]== matrix[0][2]){
        if(matrix[2][0]=='X'){
            return 1;
        }
        if(matrix[2][0]=='O'){
            return -1;
        }

    }

    return 0;

}

Я думаю, что-то не так в функции минимакса. Пожалуйста, помогите мне.

...