編集: 誰かが私の質問の重複として TicTacToe をリンクしている理由がわかりません。その中に MinMax-Algorithm さえありません。
現在、MinMax-Algorithm を使用する必要があるコンピューターに対して Connect4 ゲームに取り組んでいます。その前に、MinMax も使用する TicTacToe を作成しましたが、Connect4-Game に一致するように古いアルゴリズムを変更する方法がわかりません :/. TicTacToe では、私が書いた勝利条件で考えられる各動きを評価しました。うまくいきましたが、新しい条件ではうまくいきません。私のmakeAMoveなどはうまくいきます!
これらは私の古い条件と TicTacToe の 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;
私はそれがたくさんのテキストであることを知っていますが、誰かが私にいくつかの役に立つヒントを教えてくれるかもしれません:)
ありがとう!
マックス