Die Game-Engine bauen
Bitte Claude, die Tic-Tac-Toe-Regeln zu bauen
⏱ ca. ~7 Min
01 · Lesen
Die Game-Engine ist das Gehirn deiner App. Sie weiß nichts von WebSocket, HTML oder Spielern. Sie weiß nur, wie Tic-Tac-Toe funktioniert: ein 3x3-Spielfeld, zwei Symbole, abwechselnde Züge, Siegbedingungen.
Diese Logik in eine eigene Datei zu legen — getrennt vom Server-Code — ist das Muster der Separation of Concerns. Die Game-Engine ist ein eigenständiges Modul, das von jedem Server, jedem Test-Framework und jedem UI verwendet werden kann.
💡 Stell dir das so vorStell dir einen Schiedsrichter im Basketball vor. Der Schiedsrichter eröffnet nicht die Halle, verkauft keine Tickets und bedient nicht die Anzeigetafel. Er setzt nur die Regeln durch. Deine Game-Engine ist der Schiedsrichter — sie interessiert sich nur dafür, ob ein Zug gültig ist und ob jemand gewonnen hat.
Kernpunkte
- Separation of Concerns: Spiellogik in eine eigene Datei
- Die Game-Engine weiß nichts von WebSocket oder HTML
- Übernimmt: Spielfeld-Zustand, Zug-Validierung, Zug-Reihenfolge, Sieg-Erkennung
- Macht das Modul leicht testbar und wiederverwendbar
02 · Prompt-Vorlage
Bitte Claude, das Game-Engine-Modul zu bauen. Sei konkret, was die Klasse leisten soll — das liefert deutlich besseren Output als "bau ein Tic-Tac-Toe-Spiel".
Hilf mir, ein Modul game.js mit einer Klasse TicTacToeGame zu bauen. Anforderungen: (1) Initialisiere das Board als Array der Länge 9, komplett mit null gefüllt. (2) Merke dir, wer dran ist — X beginnt immer. (3) Stelle eine Methode makeMove(cellIndex) bereit, die den Zug validiert (Zelle muss zwischen 0–8 liegen, Zelle muss leer sein, es muss der Zug des Spielers sein), das passende Symbol setzt, auf Sieg oder Unentschieden prüft und ein Objekt { valid, symbol, winner, isDraw, board } zurückgibt. (4) Stelle eine Methode getState() bereit, die das aktuelle Board und den aktuellen Zug zurückgibt. (5) Prüfe alle 8 Gewinnlinien (3 Zeilen, 3 Spalten, 2 Diagonalen). (6) Exportiere die Klasse mit module.exports.03 · Code-Beispiel
Nachdem Claude die Game-Engine generiert hat, schau dir die Logik der Sieg-Prüfung an. Das ist der Teil, den du verstehen solltest, nicht nur akzeptieren.
Sieg-Erkennung: die 8 Gewinnlinien
const WINNING_LINES = [
[0, 1, 2], [3, 4, 5], [6, 7, 8], // rows
[0, 3, 6], [1, 4, 7], [2, 5, 8], // columns
[0, 4, 8], [2, 4, 6] // diagonals
];
// Board layout:
// 0 | 1 | 2
// ---+---+---
// 3 | 4 | 5
// ---+---+---
// 6 | 7 | 8
Das Spielfeld ist ein flaches Array von 9 Zellen. Index 0–2 ist die obere Reihe, 3–5 die mittlere, 6–8 die untere. Ein Spieler gewinnt, wenn er drei Zellen auf einer der 8 möglichen Linien füllt. Nach jedem Zug prüft die Engine alle 8 Linien — hat eine Linie drei identische, nicht-null Symbole, hat dieser Spieler gewonnen. Sind alle 9 Zellen gefüllt ohne Sieger, ist es ein Unentschieden.
04 · Echte Übung
Teste die Game-Engine direkt in der Node.js-REPL. So validieren echte Entwicklerinnen und Entwickler Code, bevor sie irgendetwas verdrahten.
05 · Checkliste
Vergewissere dich, dass deine Game-Engine diese Edge Cases sauber behandelt. Probier jeden in der Node-REPL aus oder bitte Claude um einen schnellen Test.
- X beginnt immer — der erste Zug ist immer X
- Ein Zug auf eine belegte Zelle gibt valid: false zurück
- Ein Zug außer der Reihe gibt valid: false zurück
- Nach einem Sieg sind keine weiteren Züge erlaubt
- Volles Brett ohne Sieger meldet korrekt ein Unentschieden
06 · Quiz
Warum ist es sinnvoll, die Game-Engine als eigenständiges Modul, getrennt vom Server, zu bauen?
- Sie lässt sich isoliert testen, in anderen Projekten wiederverwenden und hält den Server-Code fokussiert
- JavaScript verlangt, dass jede Klasse in einer eigenen Datei liegt
- Es macht den Code schwerer verständlich, aber schneller
- Socket.io kann nicht auf Code in derselben Datei wie Express zugreifen
Andere Lektionen aus diesem Kapitel
⚠ Das volle interaktive Erlebnis braucht JavaScript. Bitte aktiviere es und lade die Seite neu.
※ Diese Seite ist ein unabhängiges Bildungsprojekt — kein offizielles Anthropic-Produkt. Claude™ ist eine eingetragene Marke von Anthropic, PBC.