Hallo Leute.
ich schreibe gerade eine Prüfungsvorleistung im Modul Programmieren an der Uni und muss dafür ein Schach-ähnliches Spiel implementieren. Das funktioniert auch schon alles, Mensch gegen Mensch, ne Art Dummy-Computer der willkürlich Züge verrichtet und nun ist es noch meine Aufgabe einen Computer zu implementieren, der mit dem Schiedsrichterprogramm meines Dozenten arbeiten kann.
Der Dummy tut das auch schon, aber ich muss noch eine Variante mit dem Minimax-Algorithmus implementieren. Und die WILL UND WILL EINFACH NICHT. Ich hab schon tausendfach mein Programm umstrukturiert um es besser zu machen, aber ich krieg immer irgendwo einen Fehler raus. Aktuell ist es ein ArrayOutOfBounds (beim ermitteln der möglichen Spielzüge) und ich ich weiß einfach nicht, wie der zustande kommt.
Allgemeines zum Programm:
Der Spieler wird sozusagen über den Schiedsrichter initialisiert und mit dem Attribut Spieler A oder B (boolean) versehen. Dann erfolgt entweder der erste Zug des Gegners (falls dieser A ist) und wird ausgeführt und anschließend der Zug meines Spielers ermittelt, lokal (eigenes Spielbrett) ausgeführt und dann zurückgegeben (oder das ganze andersrum).
Ich habe dafür eine Minimax-Methode geschrieben. Die ruft doch IMMER Max auf, sofern der Spieler, der an der Reihe ist, Spieler A ist und Min, sofern dies Spieler B ist oder? Und an der Reihe ist ja immer der, der die Methode aufruft, also brauch ich ja nur auf "meinen" Spieler zu überprüfen.
Und in der Max-Methode muss ich doch auch nur die Züge ermitteln, die für A gültig sind oder? Dann kommt die Simulation der Züge, die Überprüfung etc... auf der Min-Ebene müsste ich doch nur Züge für den Spieler B überprüfen dann und diese wieder bewerten?
Mein eigentliches Problem an der Sache ist - und ich finde den Fehler partout nicht - ich bekomme im ersten Aufruf des Minimax noch einen Zug für den jeweiligen Spieler, also SCHEINT es ja zu funktionieren. Im zweiten Durchlauf (nachdem der Gegner wieder gezogen hat) bekomme ich immer besagte Exception, da ja angeblich kein gültiger Zug ermittelt werden kann und das schon auf der ersten Ebene, quasi bei der Wurzel. Ich kann das Auszugsweise mal zur Verfügung stellen, da ja kein Kommilitone mich kopieren soll^^, auf Anfrage schick auch per PN o.ä.
NaechsterSpielzug:
Minimax-Methode:
Max-Methode:
MöglicheZüge:
Die Zug-Ermittlung unterscheidet sich dabei nicht wirklich von der des willkürlichen Dummies, nur dass nicht alle möglichen Züge ermittelt werden und ein zufälliger zurückgegeben wird, sondern alle Züge eines bestimmten Spielers ermittelt werden und diese dann im Array zurückgegeben werden (und nachfolgend simuliert etc.)
Über Hilfe wäre ich außerordentlich dankbar da ich mir Tage um die Ohren schlage und den eigentlichen Fehler scheinbar nicht finde.
Ich kann im Fall der Fälle auch mal das Package herschicken.
Danke schonmal!
ich schreibe gerade eine Prüfungsvorleistung im Modul Programmieren an der Uni und muss dafür ein Schach-ähnliches Spiel implementieren. Das funktioniert auch schon alles, Mensch gegen Mensch, ne Art Dummy-Computer der willkürlich Züge verrichtet und nun ist es noch meine Aufgabe einen Computer zu implementieren, der mit dem Schiedsrichterprogramm meines Dozenten arbeiten kann.
Der Dummy tut das auch schon, aber ich muss noch eine Variante mit dem Minimax-Algorithmus implementieren. Und die WILL UND WILL EINFACH NICHT. Ich hab schon tausendfach mein Programm umstrukturiert um es besser zu machen, aber ich krieg immer irgendwo einen Fehler raus. Aktuell ist es ein ArrayOutOfBounds (beim ermitteln der möglichen Spielzüge) und ich ich weiß einfach nicht, wie der zustande kommt.
Allgemeines zum Programm:
Der Spieler wird sozusagen über den Schiedsrichter initialisiert und mit dem Attribut Spieler A oder B (boolean) versehen. Dann erfolgt entweder der erste Zug des Gegners (falls dieser A ist) und wird ausgeführt und anschließend der Zug meines Spielers ermittelt, lokal (eigenes Spielbrett) ausgeführt und dann zurückgegeben (oder das ganze andersrum).
Ich habe dafür eine Minimax-Methode geschrieben. Die ruft doch IMMER Max auf, sofern der Spieler, der an der Reihe ist, Spieler A ist und Min, sofern dies Spieler B ist oder? Und an der Reihe ist ja immer der, der die Methode aufruft, also brauch ich ja nur auf "meinen" Spieler zu überprüfen.
Und in der Max-Methode muss ich doch auch nur die Züge ermitteln, die für A gültig sind oder? Dann kommt die Simulation der Züge, die Überprüfung etc... auf der Min-Ebene müsste ich doch nur Züge für den Spieler B überprüfen dann und diese wieder bewerten?
Mein eigentliches Problem an der Sache ist - und ich finde den Fehler partout nicht - ich bekomme im ersten Aufruf des Minimax noch einen Zug für den jeweiligen Spieler, also SCHEINT es ja zu funktionieren. Im zweiten Durchlauf (nachdem der Gegner wieder gezogen hat) bekomme ich immer besagte Exception, da ja angeblich kein gültiger Zug ermittelt werden kann und das schon auf der ersten Ebene, quasi bei der Wurzel. Ich kann das Auszugsweise mal zur Verfügung stellen, da ja kein Kommilitone mich kopieren soll^^, auf Anfrage schick auch per PN o.ä.
NaechsterSpielzug:
Java:
...
if (this.isSpielerA()) { //Falls dies Spieler A ist
//Spieler A ist am Zug
setNextToA();
} else { //Fall dies Spieler B ist
//Spieler B ist am Zug
setNextToB();
}
//Ermittle den besten Zug für Spieler A / Spieler B
int value = this.minmax(spielerAistAmZug(), 3);
//Der Spielzug wird beim ersten Aufruf von Max/Min am Ende der Bewertungs-/Simulationsphase in einer Attributs-Variable gespeichert
...
Minimax-Methode:
Java:
public int minmax(boolean aIsNext, int resttiefe) {
this.testBoard = this.brett.clone();
//Ist Spieler A am Zug?
if (aIsNext) {
//Spieler A -> Zug mit maximalem Wert
return this.maxWert(resttiefe, true);
} else {
//Spieler B -> Zug mit minimalem Wert
return this.minWert(resttiefe, true);
}
}
Max-Methode:
Java:
//Speichere eine Kopie des aktuellen Simulationsbrettes
//Spielbrett b = new Spielbrett(this.testBoard);
Spielbrett b = this.testBoard.clone();
Regeln r = new Regeln(this.testBoard);
//Ermittle mögliche Züge auf dem Simulationsbrett
Spielzug[] validMoves = this.getPossibleMovesForPlayer("A",r);
...
-> Simulation/Bewertung/Zugauswahl
MöglicheZüge:
Java:
public Spielzug[] getPossibleMovesForPlayer(String spieler, Regeln r) {
ArrayList<Spielzug> zuege = new ArrayList<Spielzug>();
for (int row = 1; row <= 8; row++) {
for (char col = 'a'; col <= 'g'; col++) {
for (int row2 = 1; row2 <= 8; row2++) {
for (char col2 = 'a'; col2 <= 'g'; col2++) {
Spielzug zug = new Spielzug(row,col, row2, col2);
if (r.isCorrect(zug, spieler)) {
zuege.add(zug);
}
}
}
}
}
return zuege.toArray(new Spielzug[0]);
}
Die Zug-Ermittlung unterscheidet sich dabei nicht wirklich von der des willkürlichen Dummies, nur dass nicht alle möglichen Züge ermittelt werden und ein zufälliger zurückgegeben wird, sondern alle Züge eines bestimmten Spielers ermittelt werden und diese dann im Array zurückgegeben werden (und nachfolgend simuliert etc.)
Über Hilfe wäre ich außerordentlich dankbar da ich mir Tage um die Ohren schlage und den eigentlichen Fehler scheinbar nicht finde.
Ich kann im Fall der Fälle auch mal das Package herschicken.
Danke schonmal!