Skip to content

Vaynerov Technologies

Wir entwickeln nicht einfach — wir zaubern jede Codezeile und jeden Pixel.

Alle ArtikelDeep Dives

Schach in vier Dimensionen: in der Tesseract-Engine

Tesseract ist heute im Lab live gegangen: vollwertiges Schach auf einem 5×5×5×5-Brett, mit zwei Sorten Bauern, Figuren, die durch Ebenen und Hyperebenen gleiten, einer deterministischen Engine in einem Web Worker und einer Aufgabensammlung, deren Lösungen vor dem Ausliefern per Suche bewiesen sind. So viel steckt darin.

Vaynerov TechnologiesDas Studio
Veröffentlicht 9 Min. Lesezeit
Auf dieser Seite
  1. Ein Brett mit 625 Feldern
  2. Achtzig Angriffsrichtungen
  3. Eine Grundstellung, die ein Satz ist
  4. Jeden Zug zweimal zählen
  5. Vier Dimensionen lesbar machen
  6. Ein Gegner, der in einen Web Worker passt
  7. Aufgaben mit maschinell geprüften Lösungen
  8. Vierdimensionales Schach über eine ungesicherte Leitung

Schachvarianten hängen einem Brett, das jeder versteht, für gewöhnlich einen Gimmick an. Wir wollten das Gegenteil: die Regeln erkennbar bei Schach lassen und den Raum ändern — von zwei Dimensionen auf vier. Herausgekommen ist Tesseract, das dreizehnte Spiel in unserem Lab und mit einigem Abstand das mathematisch anspruchsvollste Stück, das wir je in einen Browser gebracht haben.

Vier Dimensionen klingen nach Marketing, bis man den Zuggenerator schreiben muss. Dann wird es sehr wörtlich: Ein Turm greift hier entlang von acht Strahlen an, nicht entlang von vieren. Ein Läufer entlang von vierundzwanzig. Es gibt zwei neue Gleitfiguren, weil der 4D-Raum zwei neue Sorten Diagonalen kennt, und es gibt zwei Sorten Bauern, weil ein Bauer eine Vorwärtsachse braucht und das Brett jetzt zwei übrige davon hat. Jede dieser Aussagen musste einen unabhängig geschriebenen Prüfer überstehen, bevor wir sie selbst geglaubt haben.

625
Felder — 5⁴-Gitter
80
Angriffsrichtungen
226
legale Eröffnungszüge
11.66M
perft(3)-Knoten, 0 Abweichungen

Der Suchraum von Tesseract, am 26.07.2026 gegen einen unabhängig geschriebenen Generator verifiziert.

Ein Brett mit 625 Feldern

Das Brett ist ein 5×5×5×5-Gitter — 625 Felder, Koordinaten (x, y, z, w), jede von 1 bis 5. Intern ist ein Feld eine einzige ganze Zahl: idx = (x−1) + 5(y−1) + 25(z−1) + 125(w−1). Der Renderer benutzt dieselbe Packung, ein Feldindex überquert die Grenze zwischen Engine und Renderer also ohne Übersetzung — keine Koordinatenfehler an der Naht, weil es keine Naht gibt.

Das klassische Engine-Problem, vom Brett zu fallen, wird in 4D schlimmer: Jeder Gleitstrahl muss in achtzig Richtungen wissen, wo der Rand ist. Klassische 2D-Engines lösen das mit einer Mailbox — einem gepolsterten Brett, dessen Randfelder als ungültig markiert sind — und die Idee verallgemeinert sich erstaunlich gut. Tesseract benutzt eine 9⁴-Mailbox: 6.561 32-Bit-Einträge, rund 26 KB, in denen das spielbare 5⁴-Brett zwei Felder Abstand zu jedem Rand hält — genau die Reichweite eines Springers. Die Off-Board-Erkennung wird zu einem einzigen Array-Zugriff. Die Alternative, Strahltabellen pro Feld, hätte rund 350 KB gekostet und deutlich mehr Cache-Misses.

Achtzig Angriffsrichtungen

In n Dimensionen ist die natürliche Verallgemeinerung der Schachbewegung die Menge der Richtungsvektoren ungleich null mit Komponenten aus {−1, 0, 1}. In 4D ergibt das 3⁴ − 1 = 80 Richtungen, und sie zerfallen danach, wie viele Achsen sich gleichzeitig ändern: 8 Richtungen ändern eine Achse, 24 ändern zwei, 32 ändern drei, 16 ändern alle vier.

Diese vier Klassen sind der Figurensatz. Der Turm behält Klasse eins. Der Läufer behält Klasse zwei — die vertrauten Diagonalen, von denen es jetzt vierundzwanzig gibt. Klasse drei gehört dem Einhorn, einer Figur aus dem Raumschach, der dreidimensionalen Variante von 1907 — es gleitet durch Raumdiagonalen, die es auf einem flachen Brett nicht gibt. Klasse vier gehört dem Drachen, unserem Namen für die Figur, die sich entlang der echten 4-Agonalen bewegt, also der Richtungen, in denen sich alle vier Koordinaten auf einmal ändern. Dame und König nehmen alle achtzig. Auch der Springer verallgemeinert sich: ein (2, 1, 0, 0)-Sprung in jeder Achsen- und Vorzeichenkombination — 48 verschiedene Sprünge.

Die 80 Gleitrichtungen des 4D-Schachs, gruppiert danach, wie viele Achsen sich gleichzeitig ändern. Jede Klasse ist das Revier einer Figur: Turm (8), Läufer (24), Einhorn (32), Drache (16).

Die Intuition versagt hier auf interessante Weise, also haben wir gezählt. Summiert man die legalen Züge einer Figur über jedes Feld des leeren Bretts, schafft der Turm 10.000, der Läufer 18.000. Auf dem flachen Brett ist der Turm der stärkere Gleiter; in vier Dimensionen hat der Läufer schlicht mehr Platz. Der Drache, Herr der exotischsten Richtungsklasse, bringt nur 5.664 zusammen — die 4-Agonalen sind von den meisten Feldern aus kurz und selten —, weshalb das Paar in der dritten Reihe der Platte steht und keine Ecke hält. Das ist kein Bauchgefühl, sondern sind eingefrorene Konstanten in der Selbstprüfung der Engine, und der Build schlägt fehl, sobald der Zuggenerator ihnen widerspricht.

FigurRichtungenZüge auf leerem Brett (alle 625 Felder)
Dame8049.664
König8027.936
Läufer2418.000
Einhorn3216.000
Springer48 Sprünge14.400
Turm810.000
Drache165.664

Gesamtmobilität je Figur, summiert über jedes Feld eines leeren 5⁴-Bretts. In 4D reicht der Läufer weiter als der Turm — umgekehrt zum flachen Schach.

Eine Grundstellung, die ein Satz ist

Eine Grundstellung für ein Brett zu entwerfen, das nie jemand gespielt hat, ist eine Falle: Woher wissen Sie, dass Weiß nicht in vier Zügen matt ist oder dass eine Bauernmauer die Partie nicht per Konstruktion zum Remis macht? Wir haben die Stellung beweisbar gemacht statt plausibel. Die schwarze Armee ist die exakte Punktspiegelung der weißen — jede Figur bildet über σ: p → 6−p auf allen vier Koordinaten ab. Punktsymmetrie garantiert perfekte materielle und positionelle Balance, und sie hat eine leisere Folge, die uns noch besser gefällt: nichts steht zu Beginn im Angriff. Griffe eine weiße Figur bei Zug null eine schwarze an, gäbe es wegen der Symmetrie auch den umgekehrten Angriff, und die Stellung wäre ein taktisches Durcheinander. Ist sie nicht — und das lässt sich prüfen.

Die Grundstellung ist ein Satz, keine Konvention — ihre Balance folgt aus der Punktsymmetrie, und die Engine verifiziert sie bei jedem Build.

Die zwölf Offiziere stehen auf einer 5×5-Platte bei y=1, w=1 (der König in der Mitte der ersten Reihe, das Drachenpaar in der dritten), und die Bauern beantworten die seltsamste Entwurfsfrage des ganzen Bretts: Wo ist eigentlich vorwärts? Tesseract hat Y-Bauern, die entlang der y-Achse vorrücken, und W-Bauern, die entlang w vorrücken, und beide Sorten stehen auf den zwei zentralen Hyperebenen — dem einzigen Band des Bretts, auf dem ein weißer Bauer seinem schwarzen Spiegelbild exakt gegenübersteht. Drei Armeegrößen sind an Bord (leicht, Standard, dicht), erzeugt durch Verbreitern des Bauernbands; Standard sind 32 Figuren pro Seite, dieselbe Zählung wie im klassischen Schach, was sich richtig anfühlte.

Jeden Zug zweimal zählen

Eine Schach-Engine ist nur so vertrauenswürdig wie ihr Zuggenerator, und ein 4D-Zuggenerator hat Fehlerbilder, die kein Mensch mit bloßem Auge erwischt — niemandes Intuition schlägt bei einer fehlenden Einhorn-Fesselung entlang einer Triagonale an. Also ist Tesseract so verifiziert, wie ernsthafte Engines verifiziert werden: mit perft, der erschöpfenden Zählung aller in einer gegebenen Tiefe erreichbaren Blattknoten, zweimal berechnet von zwei Generatoren, die sich nichts teilen.

Der schnelle Generator ist legal, nicht pseudolegal: Er ermittelt Schachgebote und Fesselungen einmal pro Knoten, indem er vom König aus nach außen scannt, und gibt dann nur Züge aus, die das überstehen — Doppelschach liefert ausschließlich Königszüge, einfaches Schach nur Schlagen oder Blocken, eine gefesselte Figur darf sich nur entlang ihres Fesselungsstrahls bewegen. Der naive Generator ist absichtlich dumm und langsam. Die beiden stimmten über 50.618 kreuzvalidierte Knoten überein, mit null Abweichungen; das vollständige perft(3) aus der Grundstellung sind 11.661.294 Knoten. Ein eigenes Bauernlabor — eine Stellung, gebaut für Doppelschritte, beide Schlagachsen, en passant und Umwandlung — steuert weitere 559.319 übereinstimmende Knoten bei. Und weil die gesamte Engine ganzzahlig arbeitet, ohne jede Fließkommazahl in der Spiellogik, muss ein eingefrorenes Skript über 40 Halbzüge in jedem Browser und jedem Build auf demselben Zobrist-Hash landen. Determinismus ist kein Bonus; er ist der Grund, warum der Online-Modus überhaupt möglich ist.

Vier Dimensionen lesbar machen

Das schwerste Problem war nie die Engine. Es war der Bildschirm. Eine 4D-Stellung muss auf einem 2D-Monitor landen, ohne die Geometrie zu belügen, und der Standardtrick — ein hübscher rotierender Schatten eines Tesserakts — taugt zum Spielen nicht. Unsere Antwort ist fast schon peinlich flach: Wir zeichnen das 5⁴-Gitter als 5×5-Raster aus 5×5-Brettern. Die x- und die y-Achse leben in jedem kleinen Brett; z und w wählen aus, welches Brett gemeint ist. Die Abbildung lautet worldX = (w−3)·PITCH + (x−3)·CELL, und die entscheidende Eigenschaft ist, dass sie in allen vier Koordinaten affin ist: Jede 4D-Gerade — ein Turmstrahl, eine Einhorn-Triagonale, eine Drachen-4-Agonale — projiziert auf eine gerade Linie hervorgehobener Felder auf dem Schirm. Über Geradheit lernt Ihr Auge die Geometrie.

Eine affine Abbildung, keine Perspektive: x und y leben im Teilbrett, z und w wählen das Teilbrett. 4D-Strahlen bleiben auf dem Schirm gerade — und genau so wird die Geometrie lernbar.

Die Kamera ist mit Absicht orthografisch — Perspektive würde diese Affinität krümmen und obendrein das Picking zerstören, das hier eine geschlossene Umkehrung der Projektion ist und kein GPU-Raycast. Das ganze Feld rendert als ein texturiertes Quad (alle 25 Schachmuster in eine einzige Canvas-Textur gebacken), dazu sechzehn instanzierte Meshes für die Armeen und fünf für Hervorhebungen: im schlimmsten Fall rund 24 Draw Calls, auf einem Canvas mit frameloop="demand", das exakt null Frames rendert, während Sie nachdenken. Für die Momente, in denen Sie die ehrliche Gestalt der Sache sehen wollen, zeichnet eine zweite Ansicht den echten Tesserakt — innerer Würfel bei w=1, äußerer bei w=5, gedreht in einer isoklinen Rotation — und gibt die Geometriestunde an Ihre Augen zurück.

Ein Gegner, der in einen Web Worker passt

Die Grundstellung hat 226 legale Züge, gegenüber zwanzig im klassischen Schach, und das ist der gemessene Verzweigungsfaktor, mit dem die Suche leben muss. Eine Suche in dieser Breite muss bescheiden sein und sie muss vom Haupt-Thread herunter; die Meisterstufe denkt bis zu 3,5 Sekunden nach, was den Tab einfrieren würde, liefe sie dort, wo React wohnt. Also fährt die Engine Fail-Soft-Negamax mit iterativer Vertiefung in einem Web Worker und stützt sich schwer auf Null-Move-Pruning, Late-Move-Reductions und Futility-Pruning, um die Breite zu überstehen. Vier Schwierigkeitsstufen sind an Bord, vom sofortigen Gegner mit 60 ms und absichtlich verrauschter Bewertung bis zum Meister mit 16-MB-Tabelle, der Tiefe sechs erreicht. Selbst der Zufall der KI ist deterministisch — das Jitter der Wurzelzüge kommt aus einem geseedeten Generator, der an die Partieaufzeichnung gebunden ist, eine wiederholte Partie läuft also identisch ab.

Aufgaben mit maschinell geprüften Lösungen

Jede Schach-App hat Aufgaben; die meisten haben ein paar kaputte. In vier Dimensionen wäre eine kaputte Aufgabe per Nutzermeldung nicht zu reparieren — niemand sieht einer 4D-Widerlegung eines Matts in drei mit bloßem Auge an, dass sie eine ist. Also geht keine Aufgabe auf unser Wort hin live. Jede der zwölf Studien der Sammlung muss drei maschinelle Prüfungen bestehen: Exaktheit (eine Suche bis zur doppelten behaupteten Tiefe findet Matt in genau N, beginnend mit dem angegebenen Schlüsselzug), Eindeutigkeit (kein anderer erster Zug mattsetzt genauso schnell) und Erzwungenheit (jede Verteidigung verliert weiterhin). Das geführte Tutorial bekommt dieselbe Behandlung — seine acht Lektionen sind als gewinnbar bewiesen, indem jeder legale Zug der jeweiligen Lektionsfigur durch die echte Engine gespielt wird. Kann eine Lektion scheitern, scheitert vorher der Build.

Vierdimensionales Schach über eine ungesicherte Leitung

Das Online-Spiel läuft über einen Realtime-Broadcast-Kanal, und wir behandeln diesen Kanal als genau das, was er ist: ein nicht vertrauenswürdiges Relais. Die Peers einigen sich per ECDH auf einen Schlüssel, und jeder Zug überquert die Leitung authentifiziert — ein HMAC über eine kanonische Serialisierung, die Protokollversion, Match-ID, die gebundene 128-Bit-Identität des Absenders und eine Halbzugnummer enthält. Und dann kommt die Prüfung, die den Rest fast zur Dekoration macht: Der empfangende Client validiert jeden eingehenden Zug erneut gegen seinen eigenen Generator legaler Züge. Mit einem gefälschten oder beschädigten Zug wird nicht diskutiert; er ist schlicht illegal, und weil die Engine deterministisch ist, stimmen beide Bretter entweder perfekt überein oder erkennen die Desynchronisation schon beim nächsten Zug am Zobrist-Hash.

// A move on the wire: eight digits (from-xyzw, to-xyzw) + optional promotion.
const WIRE_MOVE = /^[1-5]{8}[QRBNUD]?$/;

"22132313";  // Y-pawn at (2,2,1,3) steps forward along y to (2,3,1,3)
"24132513Q"; // the same pawn reaching y=5 promotes: Q R B N U or D

Das Wire-Format ist mit Absicht dumm. Legalität wird nie aus dem Netzwerk gelesen — sie wird lokal neu berechnet, Zug für Zug.

Tesseract hat die Plattform genommen, die wir über dreizehn Spiele hinweg gebaut haben — die gemeinsamen Qualitätsstufen, den Audio-Synth, den Fullscreen-Vertrag, die Ein-Canvas-Regel — und sie ganz auf eine einzige Frage gerichtet: Kann ein Browser einem Menschen beibringen, in vier Dimensionen zu sehen? Nach einer Woche voller Niederlagen gegen unsere eigene Anfängerstufe lautet die ehrliche Antwort: langsam — und genau das ist der Spaß.