© Corel 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 () und mouseDragged () 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 () und simulize () 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 muss execute () in der Lage sein, den Turm automatisch zu bewegen, wenn der König Rochiert, da nur der Königszug angegeben wird. Als erstes ändern wir execute ():

//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


Zur Übersicht | Zurück