Matchmaking — Spieler zusammenführen
Eine Lobby bauen, die zwei Fremde in ein Spiel bringt
⏱ ca. ~7 Min
01 · Lesen
Matchmaking ist der Teil, der aus einem Singleplayer-Spiel ein Multiplayer-Erlebnis macht. Das Konzept ist einfach: führe eine Warteliste. Sobald zwei Spieler warten, führe sie zusammen, baue einen Spielraum, starte das Spiel.
Das Schwierige sind die Edge Cases: Was, wenn ein Spieler beim Warten die Verbindung verliert? Was, wenn er sich mitten im Spiel trennt? Was, wenn beide nochmal spielen wollen? Gutes Matchmaking behandelt all das sauber.
💡 Stell dir das so vorStell dir den Empfang im Restaurant vor, der die Warteliste verwaltet. Ein Zweiertisch wird frei, der nächste Zweier wird hingeführt. Geht jemand von der Warteliste, wird er entfernt. Verlässt jemand das Restaurant mitten im Essen, hält der Empfang den Tisch nicht weiter frei.
Kernpunkte
- Matchmaking pflegt eine Warteschlange von wartenden Spielern
- Zwei Spieler in der Warteschlange werden in einen Raum zusammengeführt
- Jeder Raum hat seine eigene TicTacToeGame-Instanz
- Disconnect-Handling ist entscheidend — sowohl in der Warteschlange als auch im laufenden Spiel
02 · Prompt-Vorlage
Bitte Claude, das Matchmaking-Modul zu bauen. Beschreib die Datenstrukturen und die Pairing-Logik explizit.
Bau mir ein Modul matchmaking.js für mein Tic-Tac-Toe-Spiel. Anforderungen: (1) Pflege eine Warteschlange (ein Array von Sockets). (2) Exportiere eine Funktion addToQueue(socket, io): wartet schon jemand, führe beide zusammen — erzeuge eine eindeutige Room-ID, lege eine neue TicTacToeGame-Instanz an, vergib X und O zufällig, lass beide Sockets dem Raum beitreten und emittiere 'game-start' an beide mit ihrem jeweiligen Symbol und der Room-ID. Wartet niemand, füge den Socket zur Warteschlange hinzu und emittiere 'waiting' an ihn. (3) Exportiere eine Funktion removeFromQueue(socket), die einen getrennten Socket aus der Warteschlange entfernt. (4) Verfolge laufende Spiele mit einer Map (roomId -> { game, players }) und eine weitere Map, in welchem Raum jeder Socket ist (socketId -> roomId). (5) Exportiere eine Funktion handleDisconnect(socket, io): ist der Socket in der Warteschlange, entfern ihn; ist er in einem laufenden Spiel, emittiere 'opponent-left' an den Gegner und räume den Raum auf. Bitte importiere die Klasse TicTacToeGame aus ./game.03 · Code-Beispiel
Dein Matchmaking-Modul nutzt drei Datenstrukturen. Versteh, was jede speichert und warum sie da ist.
Die drei Datenstrukturen
// Players waiting for a match
const waitingQueue = [];
// Active game rooms: roomId -> { game, players: { X: socket, O: socket } }
const activeGames = new Map();
// Which room each player is in: socket.id -> roomId
const playerRooms = new Map();
waitingQueue hält Sockets, die 'Find Game' geklickt haben, aber noch nicht zusammengeführt sind. activeGames mappt jeden Raum auf den Spielzustand und die Spieler-Sockets — so weiß der Server, zu welchem Spiel ein Zug gehört. playerRooms ist die umgekehrte Suche — gegeben eine Socket-ID (aus dem Disconnect-Event) finde den Raum, in dem dieser Spieler war, damit wir den Gegner benachrichtigen können.
04 · Prompt-Vorlage
Jetzt verdrahten wir das Matchmaking mit deinem Server. Bitte Claude, server.js so zu aktualisieren, dass es das neue Modul nutzt.
Aktualisiere server.js so, dass es das Matchmaking-Modul nutzt. Lausche im 'connection'-Event auf 'find-game' vom Client und rufe addToQueue auf. Rufe im 'disconnect'-Event handleDisconnect auf. Lausche außerdem auf 'make-move' — wenn ein Spieler einen Zug schickt, finde seinen Raum über playerRooms, hole das passende Spiel aus activeGames, rufe game.makeMove(index) auf und emittiere bei gültigem Zug 'move-made' an den Raum mit den Details. Ist das Spiel zu Ende, emittiere 'game-over' an den Raum mit dem Ergebnis.
05 · Lesen
Halt an und lies, was Claude erzeugt hat. Das ist die wichtigste Gewohnheit, die du dir aneignen kannst: nicht einfach laufen lassen — erst lesen.
Geh in Gedanken durch, was passiert, wenn:
1. Spieler 1 verbindet sich und klickt Find Game 2. Spieler 2 macht dasselbe 3. Beide werden in einem Raum zusammengeführt 4. Spieler 1 macht einen Zug
Passt der Code zum Plan aus Lektion 2? Validiert der Server jeden Zug, bevor er ihn sendet? Räumt das Disconnect-Handling sauber auf?
Was nicht zu deinem Plan passt, lass Claude reparieren. Du bist die Architektin, der Architekt — Claude ist die Baufirma.
Kernpunkte
- Lesen vor dem Ausführen — immer
- Geh die Szenarien gedanklich durch
- Vergleiche den Code mit deinem Plan
- Stimmt etwas nicht überein, lass Claude reparieren
06 · Quiz
Ein Spieler trennt sich, während er in der Matchmaking-Warteschlange wartet. Was sollte passieren?
- Nichts — er verbindet sich automatisch wieder
- Er sollte aus der Warteschlange entfernt werden, damit er nicht mit dem nächsten neuen Spieler zusammengeführt wird
- Der Server sollte abstürzen und neu starten
- Sein Platz sollte 5 Minuten lang reserviert bleiben
07 · Ausfüllen
Sobald zwei Spieler in der Warteschlange sind, erstellt das Matchmaking-System einen Spiel-_____ und weist jedem Spieler ein Symbol (X oder O) zu.
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.