Hi!
Ich habe TicTacToe in Java programmiert. Jetzt bin ich dabei meine KI zu verbessern. Auf der Suche nach weiteren Informationen stolpert man zwangsläufig über den Minimax-Algorithmus. Jetzt hapert es da aber noch an der Umsetzung.
Die Bewertungsfunktion hab ich einfach gehalten (Sieg= +1, Niederlage= -1 und Unentschieden= 0), da dürfte das Problem aber auch nicht liegen (oder?). Der Computer reagiert auch auf meine Züge, er spielt jedoch verdammt schlecht. Eigentlich sollte er mit dieser Bewertungsfunktion aber perfekt spielen:
Zitat Wikipedia:
Eine ideale Bewertungsfunktion ordnet einer Stellung den Wert +1 zu, wenn Spieler A gewinnt,
und den Wert -1, wenn Spieler B gewinnt, und 0 bei Unentschieden. Kann man von sämtlichen
Spielpositionen den Suchbaum bis zur maximalen Tiefe aufbauen (bis zur Endstellung, wo man
sieht, wer gewinnt), so spielt der Algorithmus ein perfektes Spiel.
Daraus schließe ich, dass mein Algorithmus einen Fehler hat, ich weiß aber nicht wo.
Wäre nett, wenn mir jemand helfen könnte!
Hier ist mein Code:
Den MiniMax Algorithmus rufe ich folgendermaßen auf:
Bitte um Hilfe
Ich habe TicTacToe in Java programmiert. Jetzt bin ich dabei meine KI zu verbessern. Auf der Suche nach weiteren Informationen stolpert man zwangsläufig über den Minimax-Algorithmus. Jetzt hapert es da aber noch an der Umsetzung.
Die Bewertungsfunktion hab ich einfach gehalten (Sieg= +1, Niederlage= -1 und Unentschieden= 0), da dürfte das Problem aber auch nicht liegen (oder?). Der Computer reagiert auch auf meine Züge, er spielt jedoch verdammt schlecht. Eigentlich sollte er mit dieser Bewertungsfunktion aber perfekt spielen:
Zitat Wikipedia:
Eine ideale Bewertungsfunktion ordnet einer Stellung den Wert +1 zu, wenn Spieler A gewinnt,
und den Wert -1, wenn Spieler B gewinnt, und 0 bei Unentschieden. Kann man von sämtlichen
Spielpositionen den Suchbaum bis zur maximalen Tiefe aufbauen (bis zur Endstellung, wo man
sieht, wer gewinnt), so spielt der Algorithmus ein perfektes Spiel.
Daraus schließe ich, dass mein Algorithmus einen Fehler hat, ich weiß aber nicht wo.
Wäre nett, wenn mir jemand helfen könnte!
Hier ist mein Code:
Java:
public class GuldeKI extends Daten {
public Point next;
public int maxWert(int tiefe) {
int ermittelt = -1000000000;
int zugWert;
for (int y = 0; y < feld[0].length; y++) {
for (int x = 0; x < feld.length; x++) {
//Suche mögliche Züge
if (feld[x][y] == 0) {
//Simuliere den Zug
feld[x][y] = 2;
//Wenn keine Züge mehr möglich
if (tiefe <= 1 || isWinner(2) || remis()) {
zugWert = bewertungsFunktion();
} else {
zugWert = minWert(tiefe - 1);
//System.out.println("kuckuckmax");
}
//Zugsimulation zurücksetzen
feld[x][y] = 0;
if (zugWert > ermittelt) {
ermittelt = zugWert;
next = new Point(x, y); //für das Hauptprogramm (Position des nächsten Zugs)
}
}
}
}
return ermittelt;
}
public int minWert(int tiefe) {
int ermittelt = 1000000000;
int zugWert;
for (int y = 0; y < feld[0].length; y++) {
for (int x = 0; x < feld.length; x++) {
//Suche mögliche Züge
if (feld[x][y] == 0) {
//Simuliere den Zug
feld[x][y] = 1;
//Wenn keine Züge mehr möglich
if (tiefe <= 1 || isWinner(1) || remis()) {
zugWert = bewertungsFunktion();
} else {
zugWert = maxWert(tiefe - 1);
//System.out.println("kuckuckmin");
}
//Zugsimulation zurücksetzen
feld[x][y] = 0;
if (zugWert < ermittelt) {
ermittelt = zugWert;
}
}
}
}
return ermittelt;
}
private int bewertungsFunktion() {
if (isWinner(2)) { //X -> KI
return -1;
} else if (isWinner(1)) {
return 1;
} else {
return 0;
}
}
Den MiniMax Algorithmus rufe ich folgendermaßen auf:
Java:
int x = ki.maxWert(9 - ki.count());
ki.setElement(ki.next.x, ki.next.y, 2);
Bitte um Hilfe
Zuletzt bearbeitet: