Алгоритм Java Connect 4 MinMax

РЕДАКТИРОВАТЬ: я не знаю, почему кто-то связывает меня с TicTacToe как дубликат для моего вопроса, в нем даже нет алгоритма MinMax.

В настоящее время я работаю над игрой Connect4 против компьютера, который должен использовать алгоритм MinMax. До этого мы написали TicTacToe, который также использует MinMax, но я не уверен, как изменить мой старый алгоритм, чтобы он соответствовал Connect4-Game :/. В TicTacToe я оценивал каждый возможный ход с написанными мной условиями победы, это работало нормально, но теперь это не будет работать с моими новыми условиями. Мой makeAMove и т. д. работает нормально!

Это мои старые условия и MinMax для TicTacToe:

//Игрок 1 выигрывает

static boolean has1Won(int[][] array) {
gameBoard = array;
//Diagonal
if ((gameBoard[0][0] == gameBoard[1][1] && gameBoard[0][0] == gameBoard[2][2] && gameBoard[0][0] == 1)
|| (gameBoard[0][2] == gameBoard[1][1] && gameBoard[0][2] == gameBoard[2][0] && gameBoard[0][2] == 1)) {

    return true;
}
//Spalten/Zeilen
for (int i = 0; i < 3; ++i) {
if (((gameBoard[i][0] == gameBoard[i][1] && gameBoard[i][0] == gameBoard[i][2] && gameBoard[i][0] == 1) 
|| (gameBoard[0][i] == gameBoard[1][i] && gameBoard[0][i] == gameBoard[2][i] && gameBoard[0][i] == 1))) {
        return true;
    }
}
return false;

}

// Игрок 2 выигрывает

static boolean has2Won(int[][] array) {
gameBoard = array;
    //Diagonal
    if ((gameBoard[0][0] == gameBoard[1][1] && gameBoard[0][0] == gameBoard[2][2] && gameBoard[0][0] == 2)
    || (gameBoard[0][2] == gameBoard[1][1] && gameBoard[0][2] == gameBoard[2][0] && gameBoard[0][2] == 2)) {

        return true;
    }
    //Spalten/Zeilen
    for (int i = 0; i < 3; ++i) {
        if (((gameBoard[i][0] == gameBoard[i][1] && gameBoard[i][0] == gameBoard[i][2] && gameBoard[i][0] == 2) 
        || (gameBoard[0][i] == gameBoard[1][i] && gameBoard[0][i] == gameBoard[2][i] && gameBoard[0][i] == 2))) {

        return true;
        }
    }
    return false;

}

Как я уже сказал, я использовал эти условия для своего MinMax следующим образом:

public static int minimax(int depth, int turn) {

    if (Board.has1Won(Board.gameBoard)){
        return +1; // Der Computer gewinnt
    }
    if (Board.has2Won(Board.gameBoard)){
        return -1; // Der Spieler gewinnt
    }

    List<GameMove> gameMovesAvailable = GameMove.getAvailableGameMoves();
    if (gameMovesAvailable.isEmpty()){
        return 0; // Das Spiel endet unentschieden
    }

...

Я не уверен, как я могу заставить это работать с моими новыми условиями:

Я думаю, что мне нужно написать функцию оценки, которая проверяет это, например (это мое условие победы для строк):

boolean getWinnerInRow (Playboard brd){

    int count = 0;

    for (int i = 0; i < 6; i++){
        for (int j = 0; j < 7; j++){
            if (brd.gameBoard[i][j] != 0 && brd.gameBoard[i][j] ==   brd.gameBoard[i][j+1]){
                count++;
        } else {
                count = 1;
        }
        if (count >= 4){
          return true;
      }
    }
  }
    return false;

Я знаю, что это много текста, но, возможно, кто-то может дать мне несколько полезных советов :)

Спасибо!

Максимум


person Max Kirsch    schedule 21.06.2016    source источник
comment
Возможный дубликат Tic Tac Toe java   -  person Vikrant Kashyap    schedule 21.06.2016
comment
Пожалуйста, попробуйте решить проблему самостоятельно и задайте более конкретный вопрос. Напишите код, протестируйте его, и если он не будет работать так, как вы ожидаете, вернитесь с конкретной ошибкой или неправильным поведением.   -  person J Fabian Meier    schedule 21.06.2016


Ответы (1)


Я не уверен, что ваш тест на определение победителя правильный. Попробуйте это (вам нужно будет немного изменить его, но, по крайней мере, я уверен, что это правильно):

public static boolean testWinner(int[][] game, int lastColumn, Integ e) {

    int lastRow = 0; 
    while (lastRow < 6 && game[lastRow][lastColumn] == 0) {
        lastRow++; 
    }
    lastRow = lastRow; 

    int i = 0; 
    int j = 0; 
    int currentPlayer = game[lastRow][lastColumn]; 
    e.setI(currentPlayer);
    int sequence = 0; 

    i = lastRow; 
    boolean b = i < 3
            && game[i][lastColumn] == currentPlayer 
            && game[i+1][lastColumn] == currentPlayer
            && game[i+2][lastColumn] == currentPlayer
            && game[i+3][lastColumn] == currentPlayer; 
    if(b) {
        return true; 
    }

    sequence = 0; 
    j = lastColumn; 
    do {
        j--;
    } while(0 < j && game[lastRow][j] == currentPlayer); 
    if(j < 0 || game[lastRow][j] != currentPlayer) {
        j++; 
    }
    while(j <= 6 && game[lastRow][j] == currentPlayer) {
        j++; 
        sequence++; 
    }
    if (sequence >= 4) {
        return true; 
    }


    sequence = 0; 
    i = lastRow; 
    j = lastColumn; 
    do {
        i--; 
        j--; 
    } while(0 < i && 0 < j && game[i][j] == currentPlayer); 
    if(i < 0 || j < 0 || game[i][j] != currentPlayer) {
        i++; 
        j++; 
    }
    while(i <= 5 && j <= 6 && game[i][j] == currentPlayer) {
        i++; 
        j++; 
        sequence++; 
    }
    if (sequence >= 4) {
        return true; 
    }


    sequence = 0; 
    i = lastRow; 
    j = lastColumn; 
    do {
        i++; 
        j--; 
    } while(i < 5 && 0 < j && game[i][j] == currentPlayer); 
    if (5 < i || j < 0 || game[i][j] != currentPlayer) {
        i--; 
        j++; 
    }
    while(0 <= i && j <= 6 && game[i][j] == currentPlayer) {
        i--; 
        j++; 
        sequence++; 
    }
    if (sequence >= 4) {
        return true; 
    }

    return false; 
}

Integ — это просто класс с целым числом. Я создал его, потому что оболочка на самом деле не является объектом (не может передаваться по ссылке).

private static class Integ {

    private int i; 

    public Integ() {
        this.i = 0; 
    }

    public void increment() {
        this.i = this.i + 1; 
    }

    public int getI() {
        return this.i;
    }

    public void setI(int i) {
        this.i = i;
    }

}
person ardayigit    schedule 09.07.2016