Matchmaking — emparejar jugadores
Construye el lobby que empareja a dos desconocidos en una partida
⏱ Estim. ~7 min
01 · Leer
El matchmaking es lo que convierte un juego para un jugador en una experiencia multijugador. El concepto es simple: mantén una lista de espera. Cuando hay dos jugadores esperando, empareja, crea una sala de juego y empieza la partida.
Lo difícil son los casos límite: ¿qué pasa si un jugador se desconecta mientras espera? ¿Y si se desconecta a mitad de partida? ¿Y si ambos quieren volver a jugar? Un buen sistema de matchmaking maneja todo eso con elegancia.
💡 Imagínalo asíImagina al anfitrión de un restaurante manejando la lista de espera. Cuando se libera una mesa para dos, llama a los dos siguientes y los sienta. Si alguien se va de la lista, lo borra. Si alguien se va a la mitad de la cena, el anfitrión no le reserva el lugar para siempre.
Puntos clave
- El matchmaking mantiene una cola de jugadores en espera
- Cuando hay dos en la cola, se los empareja en una sala
- Cada sala tiene su propia instancia de TicTacToeGame
- El manejo de desconexión es clave — tanto en la cola como en partida
02 · Plantilla de prompt
Pídele a Claude que construya el módulo de matchmaking. Describe explícitamente las estructuras de datos y la lógica de emparejamiento.
Ayúdame a crear un módulo matchmaking.js para mi juego de tic-tac-toe. Requisitos: (1) Mantén una cola de espera (arreglo de sockets). (2) Exporta una función addToQueue(socket, io): si ya hay alguien esperando, empareja a los dos — genera un room ID único, crea una nueva instancia de TicTacToeGame, asigna X y O al azar, haz que ambos sockets entren a esa sala y emite 'game-start' a cada uno con su símbolo y el room ID. Si no hay nadie esperando, agrega este socket a la cola y emítele 'waiting'. (3) Exporta una función removeFromQueue(socket) que saque al socket desconectado de la cola de espera. (4) Usa un Map para rastrear las partidas activas (roomId -> { game, players }) y otro Map para rastrear en qué sala está cada socket (socketId -> roomId). (5) Exporta una función handleDisconnect(socket, io): si el socket está en la cola, lo saca; si está en una partida activa, emite 'opponent-left' al rival y limpia la sala. Importa la clase TicTacToeGame desde ./game.03 · Ejemplo de código
Tu módulo de matchmaking usa tres estructuras de datos. Entiende qué guarda cada una y por qué existe.
Las tres estructuras de datos
// 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 los sockets que tocaron 'Find Game' pero todavía no fueron emparejados. activeGames mapea cada sala a su estado de juego y a los sockets de los jugadores — así es como el servidor sabe a qué partida pertenece un movimiento. playerRooms es una búsqueda inversa: dado un socket ID (que viene del evento disconnect), te dice en qué sala está, para que podamos avisarle al rival.
04 · Plantilla de prompt
Ahora conecta el matchmaking a tu servidor. Pídele a Claude que actualice server.js para usar el nuevo módulo.
Actualiza server.js para que use el módulo de matchmaking. Dentro del evento 'connection', escucha el 'find-game' que envía el cliente y llama a addToQueue. En el evento 'disconnect', llama a handleDisconnect. También escucha 'make-move' — cuando un jugador envía un movimiento, busca en playerRooms la sala donde está, luego en activeGames el juego correspondiente, llama a game.makeMove(index) y, si el movimiento es válido, emite 'move-made' a la sala con los detalles del movimiento. Si el juego terminó, emite 'game-over' a la sala con el resultado.
05 · Leer
Detente y lee lo que generó Claude. Este es el hábito más importante que puedes desarrollar: no solo lo ejecutes — primero léelo.
Rastrea qué pasa cuando:
1. El primer jugador se conecta y toca Find Game 2. El segundo hace lo mismo 3. Se los empareja en una sala 4. El primer jugador hace un movimiento
¿El código coincide con el plan de la lección 2? ¿El servidor valida los movimientos antes de transmitirlos? ¿La lógica de desconexión limpia bien las cosas?
Si algo no encaja con tu plan, pídele a Claude que lo corrija. Tú eres el arquitecto — Claude es el albañil.
Puntos clave
- Lee antes de ejecutar — siempre
- Rastrea mentalmente los escenarios
- Compara el código con tu plan
- Si no encaja, pídele a Claude que lo corrija
06 · Quiz
Un jugador se desconecta mientras espera en la cola de matchmaking. ¿Qué debería pasar?
- Nada — se va a reconectar solo
- Hay que sacarlo de la cola, para que no lo emparejen con el próximo jugador que entre
- El servidor debería caerse y reiniciarse
- Su lugar debería guardarse durante 5 minutos
07 · Completar
Cuando hay dos jugadores en la cola, el sistema de matchmaking crea una _____ de juego y le asigna a cada jugador un símbolo (X u O).
Otras lecciones de este capítulo
⚠ La experiencia interactiva completa necesita JavaScript. Actívalo y vuelve a cargar la página.
※ Este es un proyecto educativo independiente — no es un producto oficial de Anthropic. Claude™ es una marca registrada de Anthropic, PBC.