РЕДАКТИРОВАТЬ: я не знаю, почему кто-то связывает меня с 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;
Я знаю, что это много текста, но, возможно, кто-то может дать мне несколько полезных советов :)
Спасибо!
Максимум