Hallo, nochmal eine kurze Frage von mir. Ich habe für 4 Gewinnt meinen MinMax von TicTacToe umgeschrieben und er funktioniert auch soweit ganz gut bis auf die Tatsache dass er mich irgendwie immer erst einen Zug zu spät blockt und ich komme einfach nicht drauf warum.
Also eigentlich sollte er wenn der Wert currentScore 0 ist in diese Spalte werfen um mich dann logischerweise zu blocken, dass macht er aber irgendwie immer erst wenn ich dann schon wieder dran bin und gewinnen könnte. Die Suchtiefe die wir benutzen ist 6.
Paar Infos:
- gameDepth ist die angesprochene Suchtiefe von 6, also ein int-Wert
- Ich bin Spieler 2, der Computer ist Spieler 1
- Die listMoves()-Methode ist für die noch freien Spalten in die eingeworfen werden kann
- undoMove() macht einen Zug rückgängig
- in der Ausgabe die ich als Syso hab steht auch immer der Wert für die Spalte (in dem Fall 0) wo er mich blocken müsste, aber er macht es wie gesagt einen Zug zu spät.
Vielleicht hat ja jemand von euch eine Idee woran das liegen könnte, ansonsten spielt er nämlich in Ordnung. Die Anforderung ist nicht dass er perfekt spielen soll, aber er sollte schon korrekt blocken.
Danke schonmal
Also eigentlich sollte er wenn der Wert currentScore 0 ist in diese Spalte werfen um mich dann logischerweise zu blocken, dass macht er aber irgendwie immer erst wenn ich dann schon wieder dran bin und gewinnen könnte. Die Suchtiefe die wir benutzen ist 6.
Java:
public int negamax(int depth, int player, Board brd) {
List<Integer> availableMoves = brd.listMoves();
if (availableMoves.isEmpty() || depth == 0) {
return 0;
}
if (brd.isWin(2)) {
return -1;
}
if (brd.isWin(1)) {
return +1;
}
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for (int i = 0; i < availableMoves.size(); i++) {
Integer gameMove = availableMoves.get(i);
if (player == 1) {
brd.makeMove(gameMove, 1);
int currentScore = negamax(depth - 1, 2, brd);
max = Math.max(currentScore, max);
log.log("Generierter Spielzug von MinMax in Spalte: " + Integer.toString(gameMove)
+ " des Spielers 1 und dem Feld " + (i + 1) + " = " + currentScore);
if (depth == gameDepth) {
System.out.println("Der erreichbare Score für den PC für die Bordposition " + (i + 1) + " lautet: "
+ currentScore);
}
if (currentScore >= 0) {
computersGameMove = gameMove;
} else if (currentScore == -1) {
brd.undoMove(player);
continue;
}
if (i == availableMoves.size() - 1 && max > 0) {
if (depth == gameDepth)
computersGameMove = gameMove;
}
} else if (player == 2) {
brd.makeMove(gameMove, 2);
int currentScore = negamax(depth - 1, 1, brd);
min = Math.min(currentScore, min);
log.log("Generierter Spielzug von MinMax in Spalte: " + Integer.toString(gameMove)
+ " des Spielers 2 und dem Feld " + (i + 1) + " = " + currentScore);
if (min == -1) {
brd.undoMove(player);
break;
}
}
brd.undoMove(player);
}
return (player == 1) ? max : min;
}
Paar Infos:
- gameDepth ist die angesprochene Suchtiefe von 6, also ein int-Wert
- Ich bin Spieler 2, der Computer ist Spieler 1
- Die listMoves()-Methode ist für die noch freien Spalten in die eingeworfen werden kann
- undoMove() macht einen Zug rückgängig
- in der Ausgabe die ich als Syso hab steht auch immer der Wert für die Spalte (in dem Fall 0) wo er mich blocken müsste, aber er macht es wie gesagt einen Zug zu spät.
Vielleicht hat ja jemand von euch eine Idee woran das liegen könnte, ansonsten spielt er nämlich in Ordnung. Die Anforderung ist nicht dass er perfekt spielen soll, aber er sollte schon korrekt blocken.
Danke schonmal