Matchmaking — apparier les joueurs
Construire le lobby qui apparie deux inconnus dans une partie
⏱ Estim. ~7 min
01 · Lire
Le matchmaking, c'est ce qui transforme un jeu solo en expérience multijoueur. Le concept est simple : garder une liste d'attente. Quand deux joueurs attendent, on les apparie, on crée une salle, on lance la partie.
Le difficile, ce sont les cas limites : que se passe-t-il si un joueur se déconnecte pendant qu'il attend ? Pendant la partie ? Si les deux veulent rejouer ? Un bon système de matchmaking gère tout ça proprement.
💡 Imagine çaImagine la personne d'accueil d'un restaurant qui gère la waitlist. Quand une table de deux se libère, elle place les deux suivants. Si quelqu'un quitte la waitlist, elle le retire. Si quelqu'un part au milieu du repas, elle ne garde pas la place.
Points clés
- Le matchmaking maintient une file d'attente de joueurs
- Quand deux joueurs sont dans la file, on les apparie dans une salle
- Chaque salle a sa propre instance TicTacToeGame
- La gestion des déconnexions est cruciale — dans la file comme en partie
02 · Modèle de prompt
Demande à Claude de construire le module de matchmaking. Décris explicitement les structures de données et la logique d'appariement.
Aide-moi à créer un module matchmaking.js pour mon tic-tac-toe. Exigences : (1) Maintenir une file d'attente (un array de sockets). (2) Exporter une fonction addToQueue(socket, io) : si quelqu'un attend déjà, apparier les deux — générer un room ID unique, créer une nouvelle instance TicTacToeGame, attribuer X et O au hasard, faire rejoindre la room aux deux sockets, et emit 'game-start' aux deux avec leur symbole et le room ID. Si personne n'attend, ajouter ce socket à la file et lui emit 'waiting'. (3) Exporter une fonction removeFromQueue(socket) qui retire un socket déconnecté de la file. (4) Utiliser une Map pour suivre les parties en cours (roomId -> { game, players }), et une autre Map pour suivre la room de chaque socket (socketId -> roomId). (5) Exporter une fonction handleDisconnect(socket, io) : si le socket est dans la file, le retirer ; s'il est dans une partie en cours, emit 'opponent-left' à l'adversaire et nettoyer la room. Importe la class TicTacToeGame depuis ./game.03 · Exemple de code
Ton module de matchmaking utilise trois structures de données. Comprends ce que chacune stocke et pourquoi elle existe.
Les trois structures de données
// 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 contient les sockets qui ont cliqué 'Find Game' mais ne sont pas encore appariés. activeGames mappe chaque room à son état de jeu et aux sockets des joueurs — c'est comme ça que le serveur sait à quelle partie appartient un coup. playerRooms est un index inverse — à partir d'un socket ID (reçu dans l'événement disconnect), trouver dans quelle room il était, pour pouvoir prévenir son adversaire.
04 · Modèle de prompt
Maintenant, branche le matchmaking sur ton serveur. Demande à Claude de mettre à jour server.js pour utiliser le nouveau module.
Mets à jour server.js pour utiliser le module de matchmaking. Dans l'événement 'connection', écoute le 'find-game' envoyé par le client et appelle addToQueue. Dans l'événement 'disconnect', appelle handleDisconnect. Écoute aussi 'make-move' — quand un joueur envoie un coup, trouve sa room dans playerRooms, récupère le game correspondant dans activeGames, appelle game.makeMove(index), et si le coup est valide emit 'move-made' à la room avec les détails. Si la partie est terminée, emit 'game-over' à la room avec le résultat.
05 · Lire
Arrête-toi et lis ce que Claude a produit. C'est l'habitude la plus importante à prendre : ne te contente pas de lancer — lis d'abord.
Trace ce qui se passe quand :
1. Le premier joueur se connecte, clique Find Game 2. Le deuxième joueur fait pareil 3. Ils sont appariés dans une room 4. Le premier joueur joue un coup
Est-ce que le code correspond au plan de la leçon 2 ? Le serveur valide-t-il bien les coups avant de diffuser ? La gestion des déconnexions nettoie-t-elle correctement ?
Si quelque chose ne colle pas avec ton plan, demande à Claude de corriger. Tu es l'architecte — Claude est l'artisan.
Points clés
- Lis avant de lancer — toujours
- Trace mentalement les scénarios
- Compare le code à ton plan
- Si ça ne colle pas, demande à Claude de corriger
06 · Quiz
Un joueur se déconnecte pendant qu'il attend dans la file de matchmaking. Que doit-il se passer ?
- Rien — il va se reconnecter automatiquement
- Il doit être retiré de la file, sinon il sera apparié avec le prochain joueur qui arrive
- Le serveur doit crasher et redémarrer
- Sa place doit être réservée pendant 5 minutes
07 · Compléter
Quand deux joueurs sont dans la file, le système de matchmaking crée une _____ de jeu et attribue à chaque joueur un symbole (X ou O).
Autres leçons de ce chapitre
⚠ L'expérience interactive complète nécessite JavaScript. Active-le et recharge la page.
※ Ce site est un projet éducatif indépendant — pas un produit officiel d'Anthropic. Claude™ est une marque déposée d'Anthropic, PBC.