Construye el motor del juego
Pídele a Claude que construya las reglas del tic-tac-toe
⏱ Estim. ~7 min
01 · Leer
El motor del juego es el cerebro de tu app. No sabe nada de WebSocket, HTML ni jugadores. Solo sabe cómo funciona el tic-tac-toe: tablero 3x3, dos símbolos, turnos, condiciones de victoria.
Poner esta lógica en su propio archivo — separada del código del servidor — se llama patrón de separación de responsabilidades (separation of concerns). El motor del juego es un módulo independiente que puede usar cualquier servidor, cualquier framework de testing o cualquier UI.
💡 Imagínalo asíImagina al árbitro de un partido de básquet. El árbitro no abre la cancha, ni vende boletos, ni opera el marcador. Solo aplica las reglas. Tu motor de juego es el árbitro: solo le importa si el movimiento es válido y si alguien ganó.
Puntos clave
- Separación de responsabilidades: la lógica del juego vive en su propio archivo
- El motor del juego no sabe nada de WebSocket ni HTML
- Maneja: estado del tablero, validación de movimientos, seguimiento de turnos, detección de victoria
- Hace que sea fácil de probar y reutilizar
02 · Plantilla de prompt
Pídele a Claude que construya el módulo del motor del juego. Sé específico sobre lo que debe hacer la clase — eso da un resultado mucho mejor que «hazme un juego de tic-tac-toe».
Ayúdame a crear un módulo game.js que contenga una clase TicTacToeGame. Requisitos: (1) Inicializa el board como un arreglo de longitud 9, todo lleno de null. (2) Lleva el turno actual — X siempre va primero. (3) Provee un método makeMove(cellIndex) que valide si el movimiento es legal (la cell debe estar entre 0-8, la cell debe estar vacía, debe ser el turno de ese jugador), coloque el símbolo correspondiente, verifique victoria o empate, y devuelva un objeto { valid, symbol, winner, isDraw, board }. (4) Provee un método getState() que devuelva el board actual y de quién es el turno. (5) Verifica las 8 líneas ganadoras (3 horizontales, 3 verticales, 2 diagonales). (6) Exporta la clase con module.exports.03 · Ejemplo de código
Cuando Claude termine de generar el motor del juego, busca la lógica de verificación de victoria. Esta es la parte que debes entender, no solo aceptar.
Detección de victoria: las 8 líneas ganadoras
const WINNING_LINES = [
[0, 1, 2], [3, 4, 5], [6, 7, 8], // rows
[0, 3, 6], [1, 4, 7], [2, 5, 8], // columns
[0, 4, 8], [2, 4, 6] // diagonals
];
// Board layout:
// 0 | 1 | 2
// ---+---+---
// 3 | 4 | 5
// ---+---+---
// 6 | 7 | 8
El tablero es un arreglo plano de 9 casillas. Los índices 0-2 son la fila de arriba, 3-5 la del medio, 6-8 la de abajo. Un jugador gana cuando llena tres casillas en cualquiera de las 8 líneas posibles. Después de cada movimiento, el motor revisa las 8 líneas — si alguna tiene tres símbolos iguales no nulos, ese jugador gana. Si se llenan las 9 casillas sin ganador, es empate.
04 · Práctica real
Prueba el motor del juego directo en el REPL de Node.js. Así validan los ingenieros de verdad su código antes de conectarlo a nada.
05 · Lista de verificación
Confirma que tu motor de juego maneja estos casos límite. Pruébalos en el REPL de Node o pídele a Claude que escriba un test rápido.
- X siempre va primero — el primer movimiento es siempre X
- Colocar un movimiento en una casilla ocupada devuelve valid: false
- Jugar fuera de turno devuelve valid: false
- No se permiten más movimientos después de ganar
- Un tablero lleno sin ganador reporta empate correctamente
06 · Quiz
¿Por qué vale la pena construir el motor del juego como un módulo separado del servidor?
- Se puede probar de forma independiente, reutilizar en otros proyectos y mantiene enfocado el código del servidor
- JavaScript exige que cada clase esté en su propio archivo
- Hace que el código sea más difícil de entender pero más rápido de ejecutar
- Socket.io no puede acceder a código del mismo archivo que Express
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.