Construir o motor do jogo
Peça ao Claude para implementar as regras do jogo da velha
⏱ Estim. ~7 min
01 · Ler
O motor do jogo é o cérebro do seu app. Ele não sabe nada sobre WebSocket, HTML ou jogadores. Ele só sabe como o jogo da velha funciona: tabuleiro 3x3, dois símbolos, turnos, condições de vitória.
Colocar essa lógica num arquivo próprio — separada do código do servidor — é o padrão chamado separação de interesses (separation of concerns). O motor é um módulo independente que pode ser usado por qualquer servidor, qualquer framework de testes, qualquer UI.
💡 Imagine assimImagine um árbitro de basquete. O árbitro não inaugura a quadra, vende ingressos nem opera o placar. Ele só aplica as regras. Seu motor de jogo é o árbitro — ele só se importa se a jogada é válida e se alguém venceu.
Pontos-chave
- Separação de interesses: a lógica do jogo vai num arquivo próprio
- O motor do jogo não sabe nada sobre WebSocket ou HTML
- Cuida de: estado do tabuleiro, validação de jogadas, controle de turnos, detecção de vitória
- Facilita testar e reutilizar
02 · Modelo de prompt
Peça ao Claude para criar o módulo do motor do jogo. Seja específico sobre o que a class deve fazer — isso gera um resultado muito melhor do que "faz um jogo da velha".
Me ajuda a criar um módulo game.js com uma class TicTacToeGame. Requisitos: (1) inicialize o board como um array de tamanho 9 preenchido com null; (2) acompanhe de quem é a vez — X sempre começa; (3) ofereça um método makeMove(cellIndex) que valida se a jogada é legal (a célula precisa estar entre 0-8, precisa estar vazia, precisa ser a vez do jogador), coloca o símbolo correspondente, verifica vitória ou empate e retorna um objeto { valid, symbol, winner, isDraw, board }; (4) ofereça um método getState() que retorna o board atual e de quem é a vez; (5) verifique todas as 8 linhas de vitória (3 horizontais, 3 verticais, 2 diagonais); (6) exporte a class com module.exports.03 · Exemplo de código
Quando o Claude gerar o motor, procure a lógica de verificação de vitória. Essa é a parte que você precisa entender, não apenas aceitar.
Detecção de vitória: as 8 linhas vencedoras
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
O tabuleiro é um array plano de 9 células. Os índices 0-2 são a linha de cima, 3-5 a do meio e 6-8 a de baixo. Um jogador vence quando preenche três células de qualquer uma das 8 linhas possíveis. Depois de cada jogada, o motor checa as 8 linhas — se alguma tem três símbolos iguais e não-null, esse jogador venceu. Se todas as 9 células estão preenchidas e ninguém venceu, é empate.
04 · Prática real
Teste o motor direto no REPL do Node.js. É assim que devs de verdade validam o código antes de conectar qualquer coisa.
05 · Lista de verificação
Confirme que seu motor lida com estes casos de borda. Teste cada um no REPL do Node ou peça ao Claude um teste rápido.
- X sempre começa — a primeira jogada é sempre de X
- Jogar numa célula ocupada retorna valid: false
- Jogar fora da vez retorna valid: false
- Depois da vitória, novas jogadas são bloqueadas
- Tabuleiro cheio sem vencedor é reportado como empate corretamente
06 · Quiz
Por que vale a pena construir o motor do jogo como um módulo separado do servidor?
- Permite testar isolado, reutilizar em outros projetos e manter o código do servidor focado
- JavaScript exige que cada class fique em um arquivo próprio
- Deixa o código mais difícil de entender, mas roda mais rápido
- Socket.io não acessa código que está no mesmo arquivo do Express
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.