Spieler A soll immer zufällig wählen, und Spieler B negamax:
Aber etwas stimmt nicht, zum Beispiel sollte er hier:
im vierten Zug die Mitte besetzen (sonst hätte Spieler A ja sofort gewonnen)...
Habt ihr eine Idee?
Anmerkung: Ich habe nicht Chat gpt danach gefragt.
Java:
import java.util.Random;
public class TicTacToeAI {
public int evaluate(int[] b) {
for (int i = 0; i < 3; i++) {
int j;
for (j = 0; j < 2; j++) {
int idx1 = 3 * i + j;
int idx2 = 3 * i + j + 1;
if (b[idx1] == 0 || b[idx2] == 0 || b[idx1] != b[idx2]) {
break;
}
}
if (j == 2) {
return b[3 * i];
}
for (j = 0; j < 2; j++) {
int idx1 = j * 3 + i;
int idx2 = (j + 1) * 3 + i;
if (b[idx1] == 0 || b[idx2] == 0 || b[idx1] != b[idx2]) {
break;
}
}
if (j == 2) {
return b[i];
}
for (j = 0; j < 2; j++) {
if (i == 2) {
break;
}
int idx1 = j * 4 - i * (j - 1) * 2;
int idx2 = (j + 1) * 3 + j + 1 - i * j * 2;
if (b[idx1] == 0 || b[idx2] == 0 || b[idx1] != b[idx2]) {
break;
}
}
if (j == 2) {
return b[4];
}
}
return 0;
}
public int negamax(int depth, int player, int[] board) {
if (depth == 0) {
return evaluate(board);
}
int bestValue = Integer.MIN_VALUE;
for (int i = 0; i < 9; i++) {
if (board[i] == 0) {
board[i] = player;
int value = -negamax(depth - 1, -player, board);
board[i] = 0;
bestValue = Math.max(bestValue, value);
}
}
return bestValue;
}
public void simulateRandomA() {
int[] board = new int[9];
for (int i = 0; i < 9; i += 2) {
int move = new Random().nextInt(9);
while (board[move] != 0) {
move = new Random().nextInt(9);
}
board[move] = -1;
printBoard(board);
int best = -1;
int best_nm = Integer.MAX_VALUE;
for (int j = 0; j < 9; j++) {
if (board[j] == 0) {
board[j] = +1;
int nm = negamax(9 - i - 4, -1, board);
// Weshalb "- 4" ?
board[j] = 0;
if (best_nm > nm) {
best = j;
best_nm = nm;
}
}
}
if (best != -1) {
board[best] = +1;
printBoard(board);
}
}
}
private int number = 1;
public void printBoard(int[] board) {
System.out.println("Number: " + number++);
for (int i = 0; i < 9; i++) {
if (board[i] == -1) {
System.out.print("a ");
}
if (board[i] == +1) {
System.out.print("b ");
}
if (board[i] == 0) {
System.out.print("_ ");
}
if ((i + 1) % 3 == 0) {
System.out.println();
}
}
System.out.println();
}
public static void main(String[] args) {
new TicTacToeAI().simulateRandomA();
}
}
Aber etwas stimmt nicht, zum Beispiel sollte er hier:
Code:
Number: 1
_ _ _
a _ _
_ _ _
Number: 2
b _ _
a _ _
_ _ _
Number: 3
b _ _
a _ a
_ _ _
Number: 4
b _ b
a _ a
_ _ _
Number: 5
b _ b
a a a
_ _ _
Number: 6
b b b
a a a
_ _ _
Number: 7
b b b
a a a
a _ _
Number: 8
b b b
a a a
a b _
Number: 9
b b b
a a a
a b a
im vierten Zug die Mitte besetzen (sonst hätte Spieler A ja sofort gewonnen)...
Habt ihr eine Idee?
Anmerkung: Ich habe nicht Chat gpt danach gefragt.