Abschlussarbeiten
Das ist der letze Teil unseres Programmierkurses für Schach. Hier werden wir noch ein paar kleine Abschlussarbeiten erledigen. Wir werden die Bauernumwandlung und die Roachde einführen. Ausserdem definieren wir eine eigene Repräsentation des Schachbrettes für die Graphik.
Wir fangen mit der eigenen Schachbrettrepresentation für die Graphik an. Dadurch werden Darstellungsfehler während des Berechnens des KI Zuges vermieden. Zuerst definieren wir das Array:
//Das Schachbrett für die Graphik
int [] graphboard = new int [120];Nun sorgen wir dafür, dass das Brett initialisiert wird. Dafür schreiben wir die Mehtode
newgame ()um:
for (int i=0; i < 120; i++) {
board [i] = org [i];
graphboard [i] = org [i];
}Alle Zugriffe auf das Schachbrett für das Zeichnen der Figuren (in den Methoden
paintField (),mousePressed ()undmouseDragged ()schreiben wir folgendermassen um:
//Die Figur zeichnen
try {
g.drawImage (pieces [graphboard [index] % 100 - 10], x * 40, y * 40, 40, 40, parent);
} catch (ArrayIndexOutOfBoundsException e) {}Natürlich müssen die Züge, die auf dem Normalen Schachbrett ausgeführt werden, auch auf dem Graphikschachbrett ausgeführt werden. Dazu ändern wir die Methode
execute ().
graphboard [start] = board [start];
graphboard [end] = board [end];Als nächstes werden wir die Bauernumwandlung schreiben. Dabei wird sich der Bauer immer in eine Dame verwandeln. Dazu müssen wir Änderungen an
execute ()undsimulize ()vornehmen. Da sich der neue Code in beiden Methoden nicht unterscheidet, drucken wir ihn nur einmal ab:
//Bauernumwandlung?
if ((board [end] % 10 == 1) && ((end < 29) || (end > 90)))
board [end] += 4;;Die Änderungen für die Rochade sind komplexer. Die Methode
genmove ()muss erkennen, ob eine Rochade gültig ist. Des weiteren mussexecute ()in der Lage sein, den Turm automatisch zu bewegen, wenn der König Rochiert, da nur der Königszug angegeben wird. Als erstes ändern wirexecute ():
//Rochade ?
if (board [end] % 10 == 6) {
if ( end == start + 2) {
//kleine Rochade
board [start + 1] = board [start + 3] % 100;
board [start + 3] = 0;
graphboard [start + 1] = board [start + 1];
graphboard [start + 3] = 0;
paintField (start + 3);
paintField (start + 1);
}
if (end == start - 2) {
//grosse Rochade
board [start - 1] = board [start - 4] % 100;
board [start - 4] = 0;
graphboard [start - 1] = board [start - 1];
graphboard [start - 4] = 0;
paintField (start - 4);
paintField (start - 1);
}
}In der Methode
genmove ()wird überprüft, ob die Rochade gültig ist. Dazu wird zuerst überprüft, ob sich der König im Schach befindent. Dann wird der König um ein Feld verschoben und wiedre überprüft, ob er sich im Schach befindet.Dann wird der König zurückgesetzt, der Turm bewegt und der Zug simuliert.
if ((board [i] / 100 == 1) && (! ischeck ())) {
if (((board [i+1] == 0) && (board [i+2] == 0)) && (board [i+3] / 100 == 1)) {
//kleine Rochade
board [i+1] = board [i] % 100;
board [i] = 0;
if (! ischeck ()) {
//König zurück
board [i] = board [i+1];
//Turm ziehen
board [i + 1] = board [i + 3] % 100;
board [i + 3] = 0;
simulize (i, i+2);
//Rückgängig
board [i + 3] = board [i + 1] + 100;
board [i+1] = board [i];
}
// Ursprungsstellung wiederherstellen
board [i] = board [i + 1] + 100;
board [i + 1] = 0;
}
if (((board [i-1] == 0) && (board [i-2] == 0)) && ((board [i-3] == 0) && (board [i-4] / 100 == 1))) {
//grosse Rochade
board [i-1] = board [i] % 100;
board [i] = 0;
if (! ischeck ()) {
//König zurück
board [i] = board [i-1];
//Turm ziehen
board [i - 1] = board [i - 4] % 100;
board [i - 4] = 0;
simulize (i, i-2);
//Rückgängig
board [i - 4] = board [i - 1] + 100;
board [i - 1] = board [i];
}
// Ursprungsstellung wiederherstellen
board [i] = board [i - 1] + 100;
board [i - 1] = 0;
}
}Damit währen wir am Ende unseres Kurses über die Schachprogrammierung angelangt. Ich hoffe, Sie werden viel Spass bei der Weiterentwicklung ihres Schachprogrammes haben.
Applet Stufe 10 anzeigen
Quelltexte der Stufe 10