Matchmaking — abbinare i giocatori
Costruire la lobby che mette insieme due sconosciuti in una partita
⏱ Stima ~7 min
01 · Leggi
Il matchmaking è la parte che trasforma un gioco per uno in un'esperienza multiplayer. Il concetto è semplice: mantieni una lista d'attesa. Quando ci sono due giocatori in attesa, abbinali, crea una stanza di gioco e inizia la partita.
La parte difficile sono i casi limite: cosa succede se un giocatore si disconnette mentre aspetta? E se si disconnette durante la partita? E se entrambi vogliono rigiocare? Un buon sistema di matchmaking gestisce tutto questo con eleganza.
💡 Immagina cosìImmagina il receptionist di un ristorante che gestisce la lista d'attesa. Quando si libera un tavolo da due, accompagna le prime due persone della lista. Se qualcuno lascia la lista, lo rimuove. Se qualcuno se ne va a metà cena, non tiene più il suo posto.
Punti chiave
- Il matchmaking mantiene una coda di giocatori in attesa
- Quando ci sono due giocatori in coda, vengono abbinati in una stanza
- Ogni stanza ha la sua istanza di TicTacToeGame
- La gestione delle disconnessioni è fondamentale — sia in coda che durante la partita
02 · Modello di prompt
Chiedi a Claude di costruire il modulo di matchmaking. Descrivi con precisione le strutture dati e la logica di abbinamento.
Aiutami a creare un modulo matchmaking.js per il mio gioco di tic-tac-toe. Requisiti: (1) Mantieni una coda d'attesa (array di socket). (2) Esporta la funzione addToQueue(socket, io): se c'è già qualcuno in attesa, abbina i due — genera un room ID univoco, crea una nuova istanza di TicTacToeGame, assegna X e O casualmente, fai entrare entrambi i socket nella stanza ed emetti 'game-start' a entrambi con il rispettivo simbolo e room ID. Se non c'è nessuno in attesa, aggiungi il socket alla coda ed emetti 'waiting'. (3) Esporta la funzione removeFromQueue(socket) che rimuove un socket disconnesso dalla coda. (4) Usa una Map per tenere traccia delle partite attive (roomId -> { game, players }) e un'altra Map per sapere in quale stanza si trova ogni socket (socketId -> roomId). (5) Esporta la funzione handleDisconnect(socket, io): se il socket è in coda, rimuovilo; se è in una partita attiva, emetti 'opponent-left' all'avversario e pulisci la stanza. Importa la classe TicTacToeGame da ./game.03 · Esempio di codice
Il tuo modulo di matchmaking usa tre strutture dati. Capisci cosa contiene ciascuna e perché esiste.
Le tre strutture dati
// 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 contiene i socket che hanno cliccato 'Find Game' ma non sono ancora stati abbinati. activeGames mappa ogni stanza allo stato della partita e ai socket dei giocatori — è così che il server sa a quale partita appartiene una mossa. playerRooms è il lookup inverso — dato un socket ID (dall'evento di disconnessione), trova in quale stanza si trovava, così possiamo avvisare l'avversario.
04 · Modello di prompt
Ora collega il matchmaking al server. Chiedi a Claude di aggiornare server.js per usare il nuovo modulo.
Aggiorna server.js per usare il modulo di matchmaking. Nell'evento 'connection', ascolta 'find-game' inviato dal client e chiama addToQueue. Nell'evento 'disconnect' chiama handleDisconnect. Ascolta anche 'make-move' — quando un giocatore invia una mossa, trova la sua stanza da playerRooms, trova la partita corrispondente in activeGames, chiama game.makeMove(index), e se la mossa è valida emetti 'move-made' alla stanza con i dettagli della mossa. Se la partita è finita, emetti 'game-over' alla stanza con il risultato.
05 · Leggi
Fermati a leggere quello che Claude ha prodotto. Questa è l'abitudine più importante che puoi sviluppare: non eseguire subito — prima leggi.
Segui il flusso di quello che succede quando:
1. Il primo giocatore si connette e clicca Find Game 2. Il secondo giocatore fa lo stesso 3. Vengono abbinati in una stanza 4. Il primo giocatore fa una mossa
Il codice corrisponde al piano della lezione 2? Il server valida le mosse prima di trasmetterle? La gestione delle disconnessioni pulisce correttamente?
Se qualcosa non corrisponde al tuo piano, chiedi a Claude di correggerlo. Tu sei l'architetto — Claude è il costruttore.
Punti chiave
- Leggi prima di eseguire — sempre
- Segui mentalmente i vari scenari
- Confronta il codice con il tuo piano
- Se non corrisponde, chiedi a Claude di correggere
06 · Quiz
Un giocatore si disconnette mentre è in coda nel matchmaking. Cosa dovrebbe succedere?
- Niente — si riconnetterà automaticamente
- Deve essere rimosso dalla coda, altrimenti verrebbe abbinato con il prossimo giocatore che entra
- Il server deve andare in crash e riavviarsi
- Il suo posto deve essere mantenuto per 5 minuti
07 · Completa
Quando ci sono due giocatori in coda, il sistema di matchmaking crea una _____ di gioco e assegna a ogni giocatore il suo simbolo (X o O).
Altre lezioni di questo capitolo
⚠ L'esperienza interattiva completa richiede JavaScript. Attivalo e ricarica la pagina.
※ Questo è un progetto educativo indipendente — non è un prodotto ufficiale di Anthropic. Claude™ è un marchio di Anthropic, PBC.