Stefan Zörner
10.01.2018
Eine Micro Moves Randnotiz
Die Randnotizen ergänzen die Blog-Serie “Micro Moves” wie ein Anhang. Sie beschreiben querschnittliche Aspekte, die das Verständnis der Quelltexte oder der Fachlichkeit (also Schach bzw. Computerschach) generell erleichtern. Sie passen nicht zu einem speziellen Bauteil/Modul. Stellt es Euch stets am Rand notiert vor.
Im Computer-Schach gibt es für verschiedene Themen (de facto) Standards, so etwa für den Datenaustausch (Partien, Eröffnungen, …) oder die Kommunikation zwischen Schachprogrammen im Rahmen von Partien oder Turnieren. Eine sehr verbreite Notation für Spielsituationen (Schachstellungen) geht sogar ins 19. Jahrhundert zurück, als man Schachaufgaben effizient in Zeitschriften abdrucken wollte, ähnlich wie in jüngerer Vergangenheit Sudokus (zum Ursprung der Notation siehe Wikipedia).
Diese Notation heißt “Forsyth-Edwards-Notation” (abgekürzt: FEN). Sie erlaubt die Angabe einer kompletten Spielsituation als kompakte Zeichenkette ohne Zeilenumbruch. Sie ist z.B. ideal für den Einsatz bei (Unit-)Tests im Computer-Schach. Da viele Schach-Tools die Notation unterstützen empfehle ich sehr sie auch Eure Schachpläne zu verwenden. FLEXess tut es auch.
Die Abbildung zeigt ein Schachbrett zu Beginn einer Partie, am Rand sind die Bezeichnungen für Linien (a-h) und Reihen (1-8) notiert. In FEN wird die Grundstellung wie folgt notiert (die Gänsefüßchen kennzeichnen String-Anfang und -Ende und gehören nicht zur Notation):
"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"
Die zu Beginn mit Schrägstrichen ‘/’ getrennten Folgen von Buchstaben und Ziffern beschreiben die Situation auf dem Brett. Kleine Buchstaben stehen für schwarze, große für weiße Figuren. Die Notation verwendet die englischen Bezeichnungen für Figurenarten (Rook für Turm, Pawn für Bauer, …). Der erste Block “rnb…” liest sich daher “schwarzer Turm, schwarzer Springer, schwarzer Läufer …”. Weitere Informationen der FEN-Zeichenkette beschreiben unter anderem wer am Zug ist, Rochade-Rechte etc. – Alles Dinge, die man den Figuren auf dem Brett allein nicht ansieht.
Das FEN-Format besteht aus 6 Bestandteilen (“Gruppen”), jeweils mit Leerzeichen voneinander getrennt:
Die Rochade-Rechte (3.) zeigen an, welche Rochaden noch möglich sind. Die Gruppe ist erforderlich, da die Figuren am Brett allein das nicht erkennen lassen (konkret: ob eine Figur schon einmal bewegt wurde). “K” und “Q” für weiß (K = kurze Rochade, Q= lange Rochade), “k” und “q” für schwarz (k steht für kingside, q für queenside). Falls eine Rochade nicht mehr möglich ist entfällt der Buchstabe. Ist gar keine Rochade möglich enthält die Gruppe ein Minus (-).
Das en Passant-Feld (4.) enthält das übersprungene Feld, falls im Zug direkt zuvor ein Bauer 2 Felder nach vorn gegangen ist. Bei “e2-e4” also “e3”. Der Gegner könnte dann en passant schlagen (wenn einer seiner Bauern passend steht). Bei allen anderen Zügen enthält die Gruppe ein Minus (-).
Die 50-Züge-Regel besagt, dass ein Spieler ein Remis reklamieren kann, wenn 50 Züge lang kein Bauer bewegt und keine Figur geschlagen wurde. Die Halbzüge (5.) zählen solche Züge. Nach einem Bauernzug oder dem Schlagen einer Figur ist der Wert wieder 0.
Die Nummer des nächsten Zuges (6.) zählt nach einem schwarzen Zug hoch, d.h. erst macht weiß seinen 1. Zug, dann schwarz seinen 1. Zug, dann weiß seinen 2. Zug usw.
Für die Notation des Brettes (1. Gruppe in FEN) hier noch ein weiteres Beispiel!
"6r1/6pp/7r/1B5K/1P3k2/N7/3R4/8 w - - 30 79"
Die Schrägstriche (/) trennen die Reihen des Brettes, angegeben von oben nach unten (also Reihe 8 bis 1). Eine Ziffer (1-8) gibt an wie viele Felder frei sind. Im Beispiel oben die erste Reihe (“6r1”): 6 Felder frei, ein schwarzer Turm (r), 1 Feld frei.Die Schrägstriche sind eigentlich redundant und erhöhen lediglich die Lesbarkeit.
Das Beispiel oben entstammt einer langen Partie zwischen zwei (schwachen) Computer-Gegnern. Am Ende wurde herumgeeiert (daher die hohe Zahl bei den Halbzügen für die 50-Züge-Regel), bis schwarz endlich gewonnen hatte (Weiß am Zug ist matt).
Viele Schach-Softwarelösungen (freie und kommerzielle) unterstützen das FEN-Format. Das legt seine Verwendung in eigenen Schach-Programmiervorhaben nahe. Eine Spielsituation ist flink in einem graphischen Editor zusammengeklickt, dann als FEN in die Zwischenablage kopiert, und Standpunkt für einen Unit-Test …
...
String fen = "6r1/6pp/7r/1B5K/1P3k2/N7/3R4/8 w - - 30 79";
Position pos = new Position(pos);
Assert.assertTrue(rules.isMate(pos));
...
Das setzt voraus, dass der eigene Code FEN versteht (wie im Beispiel der Konstruktor für die Position-Klasse). Umgekehrt eignet sich FEN auch prima für LOG-Ausgaben, da es sich leicht aus der Zwischenablage in geeignete graphische Tools kopieren lässt. So lässt sich eine problematische Situation leicht visualisieren.
Die Abbildung oben zeigt den Editor des Schachwerkzeuges (chessX). Es kann so einiges mehr neben dem Editieren und dem Im- und Export aus und von FEN. Hier einige freie Softwarelösungen, die unter anderem zum Datenaustausch mit FEN geeignet sind …
Die folgende Webseite erlaubt das Editieren und kopieren von/nach FEN online:
Eine Regel im Schach besagt, dass ein Spieler ein Remis reklamieren kann, wenn dieselbe Stellung mindestens zum dritten Mal innerhalb einer Partie auftritt. Das FEN-Format enthält nicht genügend Informationen, um eine Stellungswiederholung nachzuvollziehen. Weiterhin bildet FEN alternative Schachregeln (allen voran Chess960) nicht vollständig ab. Hierzu gibt es verschiedene Vorschläge, siehe Wikipedia.
Das games-Modul (Bauteil 1) nutzt FEN zur Speicherung des Spielzustandes. Verwendet Ihr etwa die REST-Schnittstelle des Services, um Euch die Details einer Partie abzurufen, seht Ihr:
$ curl http://localhost:8080/api/games/1
{
"gameId":1, "playerWhite":"pinky", "playerBlack":"brain", "status":"ENDED",
"activeColour":"w",
"activePlayer":"pinky",
"fullMoveNumber":3,
"fen":"rnb1kbnr/pppp1ppp/8/4p3/6Pq/5P2/PPPPP2P/RNBQKBNR w KQkq - 0 3",
"created":"2018-04-01T18:39:12","modified":"2018-04-01T18:39:13"
}
$
Der Service des chess-diagrams-Moduls (Bauteil 2) nimmt einen FEN-String als Request-Parameter entgegen und generiert daraus ein PNG. Die Diagramme in diesem Beitrag hier sind damit erzeugt.
(Weitere Bauteile, die FEN nutzen, folgen …)
Bei StackExchange findet Ihr eine schöne Aufgabe, bei der Ihr einen FEN-String (nur die erste Gruppe) in ASCII-Art verwandelt müsst. Ein eingereichter Beitrag in Perl kommt dazu mit nur 28 Bytes Quelltext aus.