2016-06-21 6 views
-1

編集:誰かが私の質問に重複してTicTacToeをリンクしている理由は分かりませんが、そこにはMinMax-Algorithmもありません。Java Connect 4 MinMaxアルゴリズム

現在、私はMinMax-Algorithmを使用するコンピュータに対してConnect4ゲームを作成しています。 これまで、私たちはMinMaxも使用するTicTacToeを書いていましたが、Connect4-Game:/に合致するように私の古いアルゴリズムを変更する方法がわかりません。 TicTacToeでは、私が書いた勝利条件でそれぞれの可能な動きを評価しましたが、うまくいきましたが、今は新しい条件ではうまくいかないでしょう。 私のmakeAMoveなどはうまくいきます!

これらは私の古い条件と三目並べのためのMinMaxです:

//プレイヤー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; 

:私は、私がチェックする評価関数を記述するために持っていると思うこの例では(これは、行のための私のwinconditionです) ips :)

ありがとうございます!

マックス

+0

[チックタックトーの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; 
    } 

} 
関連する問題