2016-06-21 11 views
-1

EDIT: Я не знаю, почему кто-то связывает меня TicTacToe как дубликат для моего вопроса, в нем нет даже MinMax-алгоритма.Java Connect 4 MinMax Algorithm

В настоящее время я работаю над игрой Connect4 против компьютера, который должен использовать алгоритм MinMax-Algorithm. До этого мы написали TicTacToe, который также использует MinMax, но я не уверен, как изменить свой старый алгоритм в соответствии с Connect4-Game: /. В TicTacToe я оценил каждое возможное движение с условиями выигрыша, которые я написал, он отлично работал, но теперь он не будет работать с моими новыми условиями. My 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 
    } 

...

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

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

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; 

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

Спасибо!

Макс

+0

Возможный дубликат [Tic Tac Toe Java] (http://stackoverflow.com/questions/10961749/tic-tac-toe-java) –

+2

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

ответ

0

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

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; 
    } 

}