Ein Schachprogramm ist ein Computerprogramm, das in der Lage ist, Schach zu spielen. Nach den kommerziellen Anfängen in den 1970er-Jahren, in denen erste zum Schachspielen speziell angefertigte Schachcomputer im Handel angeboten wurden, läuft es inzwischen zumeist auf handelsüblichen Computern (PCs) oder auf diversen Mobilgeräten wie beispielsweise den allgegenwärtigen Handys. Die Entwicklung von Schachprogrammen ist eine Disziplin des Computerschachs.
Während bei früheren Schachprogrammen die gesamte Funktionalität in einem Programm vereint war, besteht moderne Schachsoftware in der Regel aus zwei Teilen: der sogenannten Engine, der „Maschine“, das die vom Computer gespielten Züge berechnet, und dem Schach-Frontend, der „Oberfläche“, das deren Darstellung und die Benutzerinteraktion übernimmt. Für die interne Kommunikation zwischen Engine und Frontend gibt es zwei weit verbreitete offene Schach-Kommunikationsprotokolle: das XBoard-Protokoll und das neuere Universal Chess Interface (UCI). Die Stellungen und Partien werden in proprietären Formaten oder im offenen Portable-Game-Notation-Format (PGN) gespeichert.
Aktuelle Programme
Graphische Schachfrontends Schachprogramme stehen auf vielen Geräten und Betriebssystemen zur Verfügung.
Zur komfortablen Bedienung wird eine als Schach-Frontend bezeichnete Benutzeroberfläche benötigt. Hierzu kann beispielsweise das Programm XBoard genutzt werden. Es läuft unter den Betriebssystemen Microsoft Windows (unter dem Namen WinBoard), Unix/Linux und Amiga und wird zusammen mit GNU Chess ausgeliefert. Ein graphisches Java-basierendes Schach-Frontend mit Datenbankfunktionen ist das ebenfalls unter der GPL veröffentlichte José. Eine weitere beliebte Benutzeroberfläche unter Windows für mehr als 250 Schachprogramme ist Arena, die als Freeware verfügbar ist. Es gibt auch weitere Freeware, die sich für den Einsteiger eignet, so beispielsweise Arasan. Das Schach-Frontend von KDE ist Knights.mini| José-Schachdatenbank und Schach-Frontend
Inzwischen kann man hochklassiges Schach auch auf Mobiltelefonen, PDAs und sonstigen Handhelds spielen. Auf Palm-OS-basierten Geräten steht beispielsweise mit OpenChess ein freies Schachprogramm zur Verfügung, das die Auswahl zwischen mehreren Schachengines bietet.
Ambitionierte Spieler greifen oft zu kommerziellen Programmen, die neben dem reinen Schachspiel auch viele Zusatzmöglichkeiten bieten, wie beispielsweise Partieanalyse und Schachtraining. Sehr bekannt dürften die Programme Shredder und Fritz sein. Diese Programme werden unter anderem von der Hamburger Firma ChessBase vertrieben, die den (europäischen) Markt für professionelle Schachsoftware zunehmend beherrscht.
Engines Seit Mitte der 2000er Jahre sind Schachengines stärker als menschliche Spieler. Sie werden seitdem häufiger zum Training genutzt oder mit speziellen Einstellungen, die die Spielstärke beschränken, genutzt. Beispielsweise Ufim bietet die Möglichkeit einer solchen Beschränkung.
Das Open-Source-Programm Stockfish ist für verschiedene Betriebssysteme mit 32-Bit- oder 64-Bit-Architektur verfügbar und zählt zu den spielstärksten Schachprogrammen überhaupt. Wegen seiner offenen Entwicklung steht Stockfish nicht in Verdacht, ein Plagiat zu sein. Es ist kostenlos erhältlich.
Die Spielstärke von Schachengines wird in eigenen Turnieren ermittelt und verglichen. In der Top Chess Engine Chess Championship dominieren seit Saison 9, also 2016 Stockfish und LCZero und lösten die Dominanz von Komodo und Houdini ab.
Anfänge und frühe Kontroversen Eines der bekanntesten kostenlos erhältlichen Schachprogramme ist Crafty, ein Open-Source-Projekt von Robert Hyatt. Ein weiteres spielstarkes Schachprogramm ist Fruit, das bei der Weltmeisterschaft im Computerschach 2005 den zweiten Platz belegte. Bis zur Version 2.1 ist Fruit ebenfalls unter einer Open-Source-Lizenz erhältlich, genauso wie das ungefähr gleich starke Glaurung 2.1. Stockfish führt die Entwicklung von Glaurung Open Source fort.
Das kommerzielle Programm Houdini gehört seit Jahren zu den spielstärksten,CEGT-Rangliste. Abgerufen am 9. Januar 2021. ist allerdings umstritten. Der Programmierer des Schachprogramms Rybka behauptet, ihm sei Quelltext gestohlen worden und auf dieser Basis seien diverse, sehr spielstarke Schachprogramme (IPPOLIT-Familie) entstanden, darunter auch Houdini. Ein Beleg für diese Behauptung wurde – zumindest öffentlich – nicht erbracht. Dem Programmierer des Schachprogramms Rybka wiederum wird nachgesagt, sein Programm Rybka basiere auf Fruit. Aufgrund dieser Kontroversen wurde Houdini – ebenso wie einige andere Programme der Ippolit-Familie – von diversen Ranglistenbetreibern zeitweilig nicht gelistet. Im weiteren Verlauf wurde das Programm Rybka als Plagiat von Fruit eingestuft, wodurch Rybka alle Titel und Erfolge aberkannt wurden. Der Programmierer von Rybka wurde auf Lebenszeit für alle Computerschachturniere gesperrt. Houdini hingegen, das wiederum auf Rybka basieren soll, war dann anerkannt die stärkste Schach-Engine und wurde zusammen mit dem Frontend Aquarium bei den Schachweltmeisterschaften zur Analyse genutzt.
Seit 2005 sorgte das Programm Rybka für Schlagzeilen in Fachzeitschriften und Computerforen. Rybka hat ausgeprägte Fertigkeiten auf positionellem, schachstrategischem Terrain und ist damit der menschlichen Spielweise näher gekommen als die meisten anderen Schachprogramme. Rybka führte die wichtigsten Computerschach-Ranglisten mit 50–150 Punkten Vorsprung an. Schachgroßmeister wie Anand, Topalow oder Morosewitsch nutzten Rybka zur Analyse, inzwischen wird häufiger Stockfish, Critter oder Houdini eingesetzt.
Seit 2014 werden die Rankinglisten, die mittels Partien zwischen den Programmen ermittelt werden, vom kommerziellen Programm Komodo und der oben beschriebenen Open-Source-Entwicklung Stockfish Kopf an Kopf angeführt.CCRL 40/4. Abgerufen am 9. Januar 2021.CCRL 40/40. Abgerufen am 9. Januar 2021.CCRL 404FRC. Abgerufen am 9. Januar 2021.CEGT 40/4. Abgerufen am 9. Januar 2021.CEGT 40/20. Abgerufen am 9. Januar 2021.
Aufbau Die Hauptbestandteile eines Schachprogramms sind der Zuggenerator, die Bewertungsfunktion und ein Programmteil zur Steuerung der Suche und der Auswahl des nächsten Zuges. Von der aktuellen Stellung (Spielsituation) ausgehend, führt das Programm eine iterative Tiefensuche durch. In jeder Iteration führt es verschiedene Zugfolgen der Reihe nach aus, bewertet die erreichten Stellungen (Blätter des Suchbaums) mit der Bewertungsfunktion, und von diesen Blattwerten ausgehend bewertet es nach dem Minimax-Prinzip die inneren Knoten des Suchbaums und damit auch die Züge, die jeweils zu einem Knoten führen. Nach der letzten Iteration spielt es den höchstbewerteten Zug im Wurzelknoten (der die aktuelle Stellung repräsentiert).
Ein wichtiges Merkmal eines Schachprogramms ist die Art der internen Brettdarstellung, derer sich alle anderen Bestandteile des Programms bedienen.
Zuggenerator und interne Brettdarstellung
Der Zuggenerator erzeugt eine Liste aller in einer bestimmten Stellung legalen (regelkonformen) Züge (mögliche Bewegungen der Spielfiguren). In der Anfangsstellung sind 20 Züge möglich (16 Bauernzüge, 4 Springerzüge), im weiteren Spielverlauf kann man im Mittel mit etwa 40 legalen Zügen in jeder Stellung rechnen, im Endspiel weniger. Der Zuggenerator muss auch komplizierte Züge wie Rochaden, Bauernumwandlungen und En-passant-Schläge berücksichtigen.
In der Regel lässt man den Zuggenerator alle pseudolegalen Züge berechnen, d. h., die Königsregel wird nicht beachtet; z. B. könnte ein solcher Zug den König auf ein bedrohtes Feld ziehen. Der Zuggenerator wird dadurch erheblich einfacher und schneller. Die illegalen Züge werden später durch den Programmteil zur Steuerung der Suche aussortiert: Ein Zug war illegal, wenn die darauf folgende Zugliste einen Zug enthält, der den König schlägt.
Zur Kodierung der Figuren werden hier in den Beispielen folgende Ganzzahlen verwendet: Figur Kodierung Weiß Schwarz Leeres Feld 0 0 Bauer 1 2 Turm 11 21 Springer 12 22 Läufer 13 23 Dame 14 24 König 10 20 Ungültiges Feld −1 −1
Die Implementierung des Zuggenerators hängt eng mit der internen Brettdarstellung zusammen. Hier gibt es vier wichtige Vertreter:
12×10-Darstellung + Spielstellung nach: 1. e4 e5 2. Sc3 −1 (0) −1 (1) −1 (2) −1 (3) −1 (4) −1 (5) −1 (6) −1 (7) −1 (8) −1 (…) −1 (10) −1 −1 −1 −1 −1 (15) −1 −1 −1 −1 (19) −1 (20) 21 22 23 24 20 23 22 (27) 21 −1 −1 2 2 2 2 0 (35) 2 2 2 −1 (39) −1 0 0 0 0 0 0 (46) 0 0 (48) −1 −1 0 0 0 0 2 0 0 0 −1 −1 0 0 0 0 1 0 0 0 −1 −1 0 0 12 0 0 0 0 0 −1 −1 1 1 1 1 0 1 1 1 −1 −1 11 0 13 14 10 13 12 11 −1 −1 −1 −1 −1 −1 −1 −1 −1 −1 −1 −1 −1 −1 −1 −1 (…) −1 (115) −1 (116) −1 (117) −1 (118) −1 (119)
Das Spielbrett wird auf ein eindimensionales und 120 Elemente großes Array abgebildet. Der Index (Zahlen in Klammern) läuft in der Regel zeilenweise, hier von 0 (links oben) bis 119 (rechts unten). Zusätzlich zu den 64 gültigen Feldern enthält das Array Felder, die eine Figur beim Verlassen des Brettes erreichen würde und die quasi einen Rand um das reguläre Brett bilden. Auf diesen Randfeldern wird ein bestimmter Wert (hier −1) gespeichert, und wenn eine Figur auf ein Feld mit diesem Eintrag ziehen würde, heißt das, dass sie damit das Brett verlassen würde. Dies kann leicht abgefragt werden, da man ohnehin nachsehen muss, ob das Zielfeld von einer eigenen Figur besetzt ist, wodurch der Zug illegal wäre. Diese Technik macht den Zuggenerator einfach und schnell. Der linke und rechte Rand an jeder Seite muss nur ein Feld groß sein, denn ein Springer, der seitlich vom Brett zieht, landet immer entweder auf der linken oder der rechten Randreihe.
Durch Addition der folgenden Konstanten zu einem Feldindex lassen sich die möglichen Zielfelder für eine Figur auf diesem Feld bestimmen. Bewegung Konstanten Horizontale und vertikale Bewegung (Turm, Dame, König) −10, −1, +1, +10 Diagonale Bewegung (Läufer, Dame, König) −11, −9, +9, +11 Bewegung wie ein Springer −21, −19, −12, −8,+8, +12, +19, +21
Betrachten wir den schwarzen Springer auf Feld 27 (Sg8). Die Addition dieser Konstanten zu 27 ergibt die potentiellen Zielfelder: 6, 8, 15, 19, 35, 39, 46 und 48. Ist der Wert im Zielfeld −1, dann ist der Zug nicht möglich, da der Springer über den Rand ziehen würde. Ist der Wert 1 oder 10 bis 14, ist eine weiße Figur auf dem Feld, die geschlagen werden kann, und ist er gleich Null, ist ein Zug auf das leere Feld möglich. Der Springer kann hier also drei verschiedene Züge auf die Zielfelder 35, 46 und 48 ausführen, die der Zugliste hinzugefügt werden. Falls der Zuggenerator nur legale Züge – und nicht alle pseudolegalen – erzeugen soll, muss man noch beachten, ob der Springer gefesselt ist oder ein Schachgebot besteht, das man abwehren muss.
Ähnlich geht es mit den anderen Figurenarten. Die langschrittigen (Dame, Läufer, Turm) können ein besetztes Feld nicht überspringen. Nachdem ein solches erreicht wurde, ist in dieser Richtung kein weiterer Zug möglich und man geht zur nächsten Zugrichtung.
Während der Zuggenerator recht einfach aufgebaut und schnell ist, sind die statischen Bewertungsfunktionen langsamer.
8×8-Darstellung + Spielstellung nach: 1. e4 e5 2. Sc3 21 22 23 24 20 23 22 21 2 2 2 2 0 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 1 0 0 0 0 0 12 0 0 0 0 0 1 1 1 1 0 1 1 1 11 0 13 14 10 13 12 11
Die 8×8-Darstellung ist der menschlichen Sicht am nächsten. Das Programm GNU Chess verwendete sie bis Version 4. Das Brett wird, wie auch bei 12×10, als eindimensionales Array modelliert, hier mit Indexbereich 0 bis 63 (alternativ 1 bis 64). Ein zweidimensionales Array scheint näherliegend, ist aber langsamer, denn ein Feld muss hier mit zwei Zahlen (Reihe und Linie) bezeichnet werden, zu beiden muss bei der Zugerzeugung eine Konstante addiert werden, und beim Zugriff auf ein Feld ist die Adressberechnung mit zwei Indizes komplizierter.