1. Ein Spiel definieren 🧩
Wir definieren ein Spiel, indem wir ein Objekt erstellen, das boardgame.io mitteilt, wie das Spiel funktioniert. Fast alles daran ist optional — wir fangen also klein an und füllen nach und nach mehr aus.
📌 Eine Datei für das ganze Tutorial. Rechts siehst du deine Datei
TicTacToe.js— den Code-Editor. Das Spielfeld und der Spielzustand stecken in der Spiel-Sektion oben am Bildschirmrand. Sie ist anfangs eingeklappt; klick auf ▶ Ausführen (im Editor oder in der Sektion), dann läuft dein Code und die Spiel-Sektion klappt auf. Im Moment enthält deine Datei nursetupundmovesals leeres Gerüst; in jedem Kapitel kommt ein neuer Teil dazu, den du selbst ausfüllst. Deine Änderungen bleiben gespeichert und wandern mit dir von Kapitel zu Kapitel.
💡 Du kannst den Editor mit ✕ ausblenden wegklappen (und über den Reiter am rechten Rand wieder einblenden), falls du mehr Platz zum Lesen brauchst.
Der Spielzustand G — die setup-Funktion
Die setup-Funktion legt den Anfangswert des Spielzustands G fest.
boardgame.io ruft sie zu Beginn eines Spiels für dich auf.
📌 Info — Der Spielzustand
Gist ein einfaches JavaScript-Objekt, das den Zustand des Spiels repräsentiert (so wie wir es während der Präsenzveranstaltung besprochen haben). Wenn du irgendwann eine Frage zu boardgame.io oder einem Konzept hast, frag gerne nach und schau dich in der restlichen Dokumentation um.
Für Tic-Tac-Toe besteht G aus einem Array cells mit 9 Feldern. Am Anfang
ist jedes Feld leer — das stellen wir mit null dar. setup soll also ein Objekt
der Form { cells: [...] } zurückgeben, in dem cells neun null-Werte
enthält.
📌 Info — Die Syntax
setup: function setup() { ... }definiert eine Funktion in einem Objekt. Sie ist dann alsTicTacToe.setup()verfügbar. Aufrufen musst du sie nicht selbst — boardgame.io macht das für uns.
👉 Deine Aufgabe: Fülle das TODO Kapitel 1 in setup (rechts) aus.
Spielzüge — der clickCell-Move
Ein Move (Spielzug) ist eine Funktion, die eine Eingabe entgegennimmt (z. B.
die Zelle, auf die geklickt wurde) und G auf den gewünschten neuen Zustand
aktualisiert. Moves repräsentieren das, was ein Spieler im Spiel tun kann. Bei
Tic-Tac-Toe: auf eine Zelle klicken und dort seine Markierung setzen. Das
moves-Objekt ist eine Sammlung aller möglichen Spielzüge mit ihren Namen.
Move-Funktionen bekommen als erstes Argument ein Objekt (wir nennen es move)
mit nützlichen Feldern — vor allem move.G (der Spielzustand) und move.playerID
(die ID, kurz für Identifikator, des ziehenden Spielers — bei uns "0" oder
"1"). Das zweite Argument ist alles Weitere, das wir brauchen — bei
clickCell der cellIndex, also welches Feld geklickt wurde.
Um den Zustand zu ändern, schreiben wir die playerID an die passende Stelle im
cells-Array:
move.G.cells[cellIndex] = move.playerID;
💡 Du kannst zum Ausprobieren auch erstmal nur etwas ausgeben, z. B.
console.log("Spieler " + move.playerID + " klickt Feld " + cellIndex). Die Ausgabe erscheint unter dem Spielfeld. Für die Übung brauchst du dann aber die Zeile oben, dieGverändert.
📌 Info — Die
setup-Funktion bekommt übrigens auch ein Objekt als erstes Argument (mitctx), genau wie ein Move. Das ist nützlich, wenn man den Anfangszustand z. B. an die Anzahl der Spieler anpassen will — für Tic-Tac-Toe brauchen wir das aber nicht.
👉 Deine Aufgabe: Fülle das TODO Kapitel 1 in clickCell aus.
Das Debug-Menü — spiel selbst ein bisschen 🛠️
Sobald setup und clickCell funktionieren, kannst du dein Spiel ausprobieren.
boardgame.io bringt dafür ein eingebautes Debug-Menü mit — im echten Projekt
(auf localhost:3000) erscheint es automatisch neben dem Spielfeld. Damit löst
du Moves und Events von Hand aus, wechselst
den aktiven Spieler, siehst den Zustand und setzt das Spiel zurück — ganz ohne
eigene Oberfläche.
So öffnest du es: In der Spiel-Sektion oben (beim Spielzustand) gibt es einen Button 🛠️ Debug-Menü öffnen/schließen. Klick ihn — das Menü dockt rechts am Bildschirmrand an. Ein erneuter Klick schließt es wieder.
So benutzt du es:
- Unter Available Moves steht dein
clickCell. Klick darauf (oder drück den angezeigten Tastenkürzel-Buchstaben), tipp als Argument die Feld-Nummer0–8ein und drück Enter. Das Feld wird gesetzt — Spielfeld und Spielzustand aktualisieren sich sofort. - Unter den Events übergibst du mit
endTurnden Zug an den nächsten Spieler. Auch hier musst du Enter drücken, um die Funktion auszuführen. - Über die Players kannst du direkt zwischen Spieler
0und1umschalten. - reset setzt das Spiel auf den Anfangszustand zurück.
👉 Probier’s aus: Setz ein paar Markierungen mit clickCell, klick zwischendurch
endTurn und schau zu, wie sich Spieler 0 (✕) und Spieler 1 (◯) abwechseln.
💡 Du kannst dieselben Felder auch einfach direkt im Spielfeld anklicken — das Debug-Menü ist nur der direktere Weg, jeden Move einzeln und gezielt auszulösen.
Übung 🎯
Wenn du beide TODO Kapitel 1 ausgefüllt hast, prüft ein Klick auf “Ausführen” (in der
Spiel-Sektion, über dem Spielfeld) automatisch:
setupgibt{ cells: [...] }mit 9-malnullzurück.clickCellträgt dieplayerIDan der StellecellIndexein.
Immer wenn du deinen Code änderst, musst du einmal auf “Ausführen” klicken, damit die Änderungen übernommen werden.
Geschafft! 🚀
Du hast in diesem Kapitel gelernt:
- Ein Spiel ist ein Objekt mit Feldern wie
setupundmoves. setuplegt den AnfangszustandGfest (bei uns: 9 leerecells).- Ein Move wie
clickCellverändertG— er bekommt dasmove-Objekt (mitGundplayerID) und einencellIndex.
Aber: Man kann noch in belegte Felder klicken, und der Spieler wechselt nicht automatisch. Das beheben wir als Nächstes.