Zehn Spiele, eine Engine
Eine neue Solitär-Variante hinzuzufügen kostet hier ein einziges Konfigurationsobjekt. Alles andere, Ziehen, Rückgängig, Tipps, Punktevergabe, Speichern, gibt es bereits.
Zehn Spiele sind neun Spiele zu viel
Klondike, Spider, FreeCell, Yukon, Russisches Solitär, Pyramid, TriPeaks, Golf, Vierzig Diebe und Canfield sind aus Sicht der Spieler zehn verschiedene Spiele. Aus Sicht des Codes sind es zehn Variationen einer bemerkenswert kleinen Menge an Ideen: Stapel aus Karten, eine Regel darüber, was wohin gelegt werden darf, eine Regel darüber, wann das Spiel gewonnen ist, und ein Layout.
Der naive Weg, eine solche Seite zu bauen, wäre, zehn Spiele zu schreiben. Das ergäbe zehn separate Implementierungen fürs Ziehen, zehn Rückgängig-Systeme, zehn subtil unterschiedliche Bugs und eine dauerhafte Steuer auf jede künftige Änderung. Wir haben stattdessen eine Engine geschrieben.
Was die Engine übernimmt
Alles, was keine Regel ist, gehört zur gemeinsamen Engine. Das stellt sich als fast die gesamte Arbeit heraus.
| Das übernimmt die Engine | Warum es geteilt wird |
|---|---|
| Layout und Größenanpassung | Jedes Spiel ist eine Anordnung von Stapelpositionen auf einem Feld, das auf jeden Bildschirm passen muss |
| Ziehen & Ablegen, Tippen zum Spielen | Identische Bedienung in allen zehn Spielen; Spieler sollen sie nie neu lernen müssen |
| Rückgängig | Der gesamte Zustand wird gesichert und wiederhergestellt, absichtlich unabhängig von den Regeln |
| Timer, Punktestand, Zugzähler | Überall dieselbe Anzeige, mit spielabhängigen Punkteregeln als Parameter |
| Tipps | Die Engine fragt das Spiel „Was ist hier ein guter Zug?“ und animiert die Antwort |
| Speichern und Fortsetzen | Ein Serialisierer für jedes Spiel |
| Sieg-Erkennung und Feier | Das Spiel liefert den Test, die Engine liefert das Konfetti |
Was ein Spiel eigentlich ist
Ein Spiel ist in dieser Codebasis ein Objekt, das eine Handvoll Fragen beantwortet. Wie viele Decks? Wo liegen die Stapel? Wie sieht die anfängliche Verteilung aus? Ist ein bestimmter Zug einer Karte auf einen Zielstapel legal? Ist das Spiel gewonnen? Was ist ein sinnvoller Tipp?
Yukon und Russisches Solitär veranschaulichen das am deutlichsten. Es ist dasselbe Spiel, nur dass Yukon absteigend in abwechselnden Farben baut und Russisches Solitär absteigend farbrein. Beide teilen sich eine Datei, und der Unterschied zwischen ihnen ist ein einziger Boolean-Wert, der an dieselbe Factory-Funktion übergeben wird.
Kein Framework, kein Build-Schritt
Es gibt hier kein React, keinen Bundler, keinen Transpiler und kein node_modules in dem, was ausgeliefert wird. Die Seiten sind statisches HTML, die Gestaltung besteht aus zwei Stylesheets, und die Logik sind einfache JavaScript-Module, die der Browser direkt lädt.
Die Seiten selbst sind generiert: Spielseiten, Guides und dieser Blog entstehen aus kleinen Node-Skripten, die eine Inhaltsdatei einlesen und HTML schreiben. Das bringt uns den einen echten Vorteil eines Build-Systems, nämlich dass gemeinsame Seitenelemente nicht auseinanderdriften können, ohne die Kosten, dass nichts funktioniert, bevor die Toolchain funktioniert.
Selbst die Soundeffekte folgen diesem Muster. Jedes Umdrehen, Ablegen, Klingeln und Brummen wird live mit der Web Audio API synthetisiert statt als Audiodatei geladen, sodass es nichts herunterzuladen und nichts zu lizenzieren gibt.
Was es beim Laden kostet
Das praktische Ergebnis ist eine Spielseite mit wenigen Dutzend Kilobyte an Markup, Stilen und Skript, dazu die Kartenbilder, die auf Spielseiten vorab geladen werden, damit das erste Umdrehen nie leer erscheint, und die aggressiv gecacht werden, weil sich ein Kartendeck nicht ändert.
Keine Tracker, keine Werbeskripte, keine Consent-Mauer vor dem Spielfeld. Das ist teils eine Wertentscheidung und teils eine Performance-Entscheidung: Das schnellste Skript eines Drittanbieters ist das, das gar nicht erst da ist.
Das Einzige, was davor sitzt, ist Cloudflare, das die Seite cacht und bösartigen Traffic filtert. Es fügt den Spielseiten nichts hinzu. Die Datenschutzerklärung erklärt genau, was Cloudflare sieht.
Wo die Engine aufhört
Die Seite hat inzwischen zwölf Spiele, zehn davon laufen auf der oben beschriebenen Engine. Hearts und Spades, im August 2026 hinzugefügt, tun das nicht, und der Grund lässt sich klar benennen: Es sind keine Patience-Spiele.
Alles oben Beschriebene setzt einen einzelnen Spieler gegen ein Deck voraus. Stapel, zwischen denen du Karten ziehst, ein Feldzustand, ein Test dafür, ob das Spiel gewonnen ist. Hearts und Spades sind Stichspiele für vier Spieler. Karten werden ausgeteilt, abgegeben oder es wird geboten, vier Plätze spielen reihum, Stiche werden gewonnen, und die Punktzahl wächst Runde für Runde, bis jemand ein Ziel erreicht. Es gibt keinen Stapel, auf den man eine Karte ablegt, und keine einzelne Gewinnposition. Das durch ein für Tableaus gebautes Konfigurationsobjekt zu erzwingen, hätte eine schlechtere Version beider Spiele und eine schlechtere Engine ergeben.
Also teilen sie sich, was tatsächlich gemeinsam ist: das Deck, die Kartengrafiken, die Soundeffekte, den Filz, den Header und die Gewohnheit, Spielstände zu speichern und fortzusetzen, sowie die übrigen Seitenelemente. Darunter haben sie ihr eigenes kleines Table-Modul, das etwas über Plätze, eine Zugreihenfolge, einen Stich in der Mitte und Computergegner weiß, die überlegen, welche Karte sie spielen, statt zufällig eine legale auszuwählen. Zwei Engines, zwölf Spiele. Es gilt dieselbe Regel, die schon die erste Engine hervorgebracht hat: Teile, was wirklich dasselbe ist, und hör dort auf.
Häufig gestellte Fragen
Funktioniert diese Seite offline?
Teilweise. Die Seiten sind statisch und lassen sich gut cachen, und jedes Spiel speichert seinen Zustand lokal, sodass eine wacklige Verbindung deine Runde nicht verliert. Eine vollständige Offline-Installation gibt es nicht.
Werden Spieler getrackt?
Spielstand und Gesamtstatistiken werden über localStorage in deinem eigenen Browser gespeichert. Sie werden nirgendwohin gesendet, und wenn du deine Browserdaten löschst, sind sie weg.
Kommen weitere Spiele dazu?
Ja. Für Solitär-Varianten ist die Engine so gebaut, dass ein neues Spiel ein Konfigurationsobjekt ist statt einer neuen Codebasis, das macht das Hinzufügen realistisch. Spiele, die gar kein Solitär sind, wie Hearts und Spades, bekommen ein eigenes Modul, statt hindurchgezwängt zu werden.