Schach-Applet

Das hier beschriebene, zugegebenermaßen schlecht (immer noch besser als ich) spielende und ineffiziente Schachprogramm ist in Java geschrieben und als Applet unter http://www.qrst.de/extras/chessapplet.html zu finden.

Die Implementierung basiert im wesentlichen auf den folgenden Klassen:

Piece (Bishop, King, Knight, Pawn, Queen, Rook),
Color,
Move (Capture, EnPassant, PromotionAndCapture, Castling, Promotion),
Moves und
Board.

Die Klasse Position repräsentiert eine Position auf dem Schachbrett (z.B. e2).

Die Klasse Color repräsentiert die am Spiel beteiligten Farben (weiß und schwarz). Die hier definierte Methode opposite liefert zu einer gegebenen Farbe die gegnerische Farbe.

Die Klasse Piece repräsentiert die Figuren und ihre Positionen während des Schachspiels. Die verschiedenen Figurenarten sind durch Subklassen für z.B. König, Turm, ... realisiert. Jede Figur vermerkt die Historie ihrer Bewegungen. Neben Methoden zum Abfragen der elementaren Eigenschaften wie Farbe, Position und Art der Figur ist eine Methode definiert, die abhängig von der Stellung der anderen Figuren auf dem Schachbrett alle mit der Figur möglichen Halbzüge in eine Prioritätswarteschlange (Klasse Moves) einfügt.

Die Klasse Move stellt einen Halbzug dar. Ein Halbzug wird durch Verweise auf bis zu drei Instanzen der Klasse Piece beschrieben. Ein gewöhnlicher Halbzug wie z.B. e2-e4 erfordert nur einen Verweis auf eine Figur, den Verweis auf einen Bauern in Position e4. Die vorherige Position des Bauern wird, wie bei der Beschreibung der Klasse Piece erwähnt, vom Figuren-Objekt selbst gespeichert. Eine Rochade oder das Schlagen einer Figur erfordert das Vermerken von zwei Verweisen auf die beiden beteiligten Figuren. Drei Verweise sind notwendig, wenn z.B. ein weißer Bauer durch Schlagen einer schwarzen Figur auf die schwarze Grundlinie gelangt und dann durch eine höherwertige Figur ersetzt werden darf.

Die Klasse Moves implementiert eine PriorityQueue für Halbzüge. Ein Halbzug (1) wird vor einem Halbzug (2) in die Schlange eingefügt, wenn

(1) der beste Zug aus der vorangegangenen Suche ist,
bei (1) eine Figur geschlagen wird und bei (2) nicht,
bei (1) eine höherwertige Figur geschlagen wird als bei (2),
der Zug (1) auf ein Feld führt, das besser durch andere Figuren verteidigt wird als bei (2).

Die Kriterien werden in der obigen Reihenfolge überprüft. Wenn die Halbzüge aus der PriorityQueue entnommen werden um im Min-Max-Algorithmus verarbeitet zu werden, ergibt sich aufgrund der Ordnung ein kleinerer Suchbaum.

Die Klasse Board verwaltet eine Stellung auf dem Schachbrett. Es werden alle beteiligten Figuren, die geschlagenen Figuren, die Farbe am Zug sowie ein Verweis auf die vorangegangene Stellung gespeichert. Die Klasse Board definiert eine Methode zum Generieren aller möglichen Halbzüge sowie eine Methode, die die Stellung statisch bewertet. Die Bewertung erfasst insbesondere die geschlagenen Figuren. Der wichtigste Teil des Schachprogramms, der Suchalgorithmus, ist ebenfalls in der Klasse Board enthalten.

Die Quelltexte unterliegen der Modified Artistic License v1 finden sich in der Version v3 in der Jar-Datei unter dieser URL: http://www.qrst.de/downloads/chesssrc.jar

Zusätzlich werden noch das Collections-Package und das Threads-Package benötigt.