AboutVibe-ProjekteBlog
SchachRustMartuniEngine

Martuni — wie ich anfing, eine Schachengine zu bauen

Ich liebe und spiele Schach, seit ich denken kann. Nicht gut, nicht schlecht — irgendwo in der Mitte, wo man genug weiß um zu leiden, aber zu wenig um es konsequent besser zu machen. Meine tatsächliche Spielstärke steht jedenfalls in keinem Verhältnis zu meiner Hingabe.

Worum es hier aber geht, ist mein alter Wunsch nach einer eigenen Schachengine. Den setze ich jetzt um. Davon werden die nächsten Beiträge berichten.


Die Idee

Der Plan war eigentlich klein: eine simple UCI-Engine in Rust schreiben. UCI ist das Protokoll, über das Schachoberflächen mit Engines kommunizieren — der Standard, den Stockfish, Leela und all die anderen sprechen. Wenn meine Engine das versteht, kann ich sie in jede GUI einbinden, auf meinem Server laufen lassen, gegen mich selbst spielen.

Rust war die Wahl, weil ich es lernen wollte. Nicht weil ich es konnte. Ich kann C, schon sehr lange, Ansi C — Rust muss ich erst lernen. Aber in 2026 beginnt man, glaubt es mir einfach, nichts Neues mit C.

Der Name war schnell gefunden: Martuni. Klingt gut. Und ist ein Ort in Armenien, der mir etwas bedeutet. Und der frei war — als Benutzername auf Lichess, als Domain. Ich verrate schon mal, wo wir zwei, drei Beiträge später angelangt sein werden: Sie ist immer noch in Entwicklung, aber du kannst bereits auf Lichess gegen sie spielen. Ich habe sie dafür in einen Bot gekapselt. Hier entlang, um sie zu einer Partie herauszufordern. 


Der erste Commit

Der erste echte Commit war am 9. April spät abends. Die Engine spielte zufällige legale Züge.

Das klingt wenig. Es war enorm.

Denn hinter “legale Züge kennen” steckt das gesamte Regelwerk: Schach, Rochade, En passant, Patt, Remis durch Wiederholung. Ich hätte das alles von Hand implementieren können — und wäre heute noch dabei. Stattdessen habe ich eine fertige Crate gewählt: chess von Jordan Bray. Die kümmert sich um die Brettrepräsentation und Zuggenerierung. Der Rest — die Logik, was die Engine entscheidet — das ist Eigenleistung. Das ist, was ich tun will: eine Schachengine, die vielleicht nicht im Ansatz mithalten kann mit Stockfish und Co, aber die von mir ist. Jedenfalls im Kern, in den Algorithmen.

Ich habe das bewusst so entschieden. Eine Schachengine ist kein Wettbewerb in Bitboard-Arithmetik. Sie ist der Such- und Bewertungsalgorithmus.

Die erste Version konnte also schon Schach spielen, im Wortsinn. Sie hat nur keine Ahnung gehabt, was sie tat.


Alpha-Beta: das Herzstück

Einen Tag später, am 10. April, kam der Schritt, der aus einer Zufalls-Engine eine denkende macht: Alpha-Beta-Suche mit Quiescence und Transpositionstabelle.

Alpha-Beta ist ein Algorithmus, der den Suchraum eines Schachbaums dramatisch verkleinert. Das Grundprinzip ist, dass man Äste abbricht, sobald feststeht, dass sie schlechter sind als bereits gefundene Möglichkeiten. Was erstaunlich ist: das optimale Spiel bleibt erhalten. Man schneidet nur den offensichtlichen Müll weg.

Dazu kommt iteratives Deepening — die Engine sucht erst auf Tiefe 1, dann 2, dann 3, und so weiter, bis die Zeit abläuft. So hat sie immer eine Antwort parat, auch wenn die Zeit plötzlich endet.

Und dann: Quiescence Search. Das ist eine Erweiterung der normalen Suche — wenn an der Wurzel der Berechnung eine “unruhige” Stellung steht, in der gerade Figuren getauscht werden, sucht die Engine diese Schlagzüge weiter, bis Ruhe einkehrt. Ohne das würde die Engine eine Stellung bewerten, auf der die Dame gerade im Schlagangriff steht, und sagen: “alles gut.”

Mit Alpha-Beta hat die Engine plötzlich angefangen, Dinge zu sehen. Nicht viel — Tiefe 2 oder 3 in normalen Stellungen. Aber genug, um offensichtliche Hänger zu vermeiden.

Das war ein aufregender Moment. Ich erinnere mich, wie ich die Engine gegen mich selbst gespielt habe. Ich habe einen Springer eingestellt — sie hat ihn genommen. Mein Herz hat kurz höher geschlagen.


Eröffnungsbücher

Wenig später: Polyglot-Eröffnungsbücher. Das sind kompilierte Dateien aus tausenden Großmeisterpartien. Die Engine schaut nach, ob die aktuelle Stellung im Buch steht — und spielt dann einen der dort hinterlegten Züge.

Das klingt wie schummeln. Ist es aber nicht. Alle Engines nutzen das. Und es macht Sinn: in der Eröffnung ist der Suchbaum riesig und die Bewertungsfunktion noch unzuverlässig. Warum nicht auf menschliches Wissen zurückgreifen, das Jahrhunderte von Schachtheorie destilliert?

Die Bücher werden der Reihe nach abgefragt. Nur wenn keines einen Zug kennt, fängt die Engine an selbst zu rechnen.

Das Ergebnis: in der Eröffnung spielt Martuni respektablen Schach. Doch hinter die Eröffnung haben die Götter das Mittelspiel gesetzt. Und da ist Martuni gnadenlos auf sich gestellt.


Weiter in Teil 2: Wie die Engine aufgehört hat, planlos zu spielen.

| Impressum | Feedback | Mein GitHubRSS