Matchmaking — parear jogadores
Construir o lobby que junta dois desconhecidos num jogo
⏱ Estim. ~7 min
01 · Ler
Matchmaking é a parte que transforma o jogo de um único jogador numa experiência multiplayer. A ideia é simples: manter uma lista de espera. Quando há dois jogadores esperando, parear, criar uma sala e começar a partida.
A parte difícil são os casos de borda: e se o jogador desconectar durante a espera? E se desconectar no meio do jogo? E se os dois quiserem jogar de novo? Um bom sistema de matchmaking lida com tudo isso de forma elegante.
💡 Imagine assimImagine a recepcionista de um restaurante cuidando da lista de espera. Quando uma mesa de duas pessoas vagar, ela chama as próximas duas. Se alguém sai da lista, ela retira. Se a pessoa some no meio da refeição, a recepcionista não fica segurando o lugar.
Pontos-chave
- O matchmaking mantém uma fila de jogadores em espera
- Com dois jogadores na fila, eles são pareados numa sala
- Cada sala tem sua própria instância de TicTacToeGame
- Tratar desconexão é essencial — tanto na fila quanto no jogo
02 · Modelo de prompt
Peça ao Claude para construir o módulo de matchmaking. Descreva com clareza as estruturas de dados e a lógica de pareamento.
Me ajuda a criar um módulo matchmaking.js para o jogo da velha. Requisitos: (1) mantenha uma fila de espera (array de sockets); (2) exporte a função addToQueue(socket, io): se já tem alguém esperando, pareie os dois — gere um room ID único, crie uma nova instância de TicTacToeGame, sorteie X e O, faça os dois sockets entrarem nessa sala e emita 'game-start' para os dois com seu símbolo e o room ID. Se não tem ninguém esperando, adicione o socket na fila e emita 'waiting' para ele; (3) exporte a função removeFromQueue(socket) que tira o socket desconectado da fila; (4) use um Map para rastrear jogos em andamento (roomId -> { game, players }) e outro Map para rastrear em que sala cada socket está (socketId -> roomId); (5) exporte a função handleDisconnect(socket, io): se o socket está na fila, remove; se está num jogo em andamento, emite 'opponent-left' para o oponente e limpa essa sala. Importe a class TicTacToeGame de ./game.03 · Exemplo de código
Seu módulo de matchmaking usa três estruturas de dados. Entenda o que cada uma guarda e por que existe.
As três estruturas de dados
// 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 guarda os sockets que clicaram em 'Find Game' mas ainda não foram pareados. activeGames mapeia cada sala para o estado do jogo e os sockets dos jogadores — é assim que o servidor sabe a que jogo pertence uma jogada. playerRooms é o inverso — dado um socket ID (vindo do evento disconnect), descobre em que sala ele está, para podermos avisar o oponente.
04 · Modelo de prompt
Agora conecte o matchmaking ao servidor. Peça ao Claude para atualizar o server.js usando o novo módulo.
Atualize o server.js para usar o módulo matchmaking. No evento 'connection', escute o evento 'find-game' enviado pelo cliente e chame addToQueue. No evento 'disconnect', chame handleDisconnect. Também escute 'make-move' — quando um jogador envia uma jogada, descubra em que sala ele está via playerRooms, busque o game correspondente em activeGames, chame game.makeMove(index) e, se for válida, emita 'move-made' para a sala com os detalhes da jogada. Se o jogo terminou, emita 'game-over' para a sala com o resultado.
05 · Ler
Pare e leia o que o Claude gerou. Esse é o hábito mais importante que você pode cultivar: não saia rodando — leia primeiro.
Acompanhe o que acontece quando:
1. O primeiro jogador conecta e clica em Find Game 2. O segundo jogador faz o mesmo 3. Eles são pareados numa sala 4. O primeiro jogador faz uma jogada
O código bate com o plano da lição 2? O servidor valida a jogada antes de transmitir? A desconexão é tratada com limpeza correta?
Se algo não bater com seu plano, peça ao Claude para ajustar. Você é o arquiteto — o Claude é o construtor.
Pontos-chave
- Leia antes de rodar — sempre
- Acompanhe o cenário mentalmente
- Compare o código com o seu plano
- Se não bater, peça ao Claude para corrigir
06 · Quiz
Um jogador desconecta enquanto espera na fila do matchmaking. O que deve acontecer?
- Nada — ele reconecta automaticamente
- Ele deve ser removido da fila para não ser pareado com novos jogadores
- O servidor deve travar e reiniciar
- Seu lugar deve ser reservado por 5 minutos
07 · Preencher
Quando dois jogadores estão na fila, o sistema de matchmaking cria uma _____ de jogo e atribui a cada um seu símbolo (X ou O).
Outras lições deste capítulo
⚠ A experiência interativa completa precisa de JavaScript. Ative-o e recarregue a página.
※ Este é um projeto educacional independente — não é um produto oficial da Anthropic. Claude™ é uma marca registrada da Anthropic, PBC.