Costruire il motore di gioco
Chiedere a Claude di implementare le regole del tic-tac-toe
⏱ Stima ~7 min
01 · Leggi
Il motore di gioco è il cervello della tua app. Non sa niente di WebSocket, HTML o giocatori. Conosce solo le regole del tic-tac-toe: tabellone 3x3, due simboli, turni, condizioni di vittoria.
Mettere questa logica in un file separato — distinto dal codice del server — si chiama pattern di separation of concerns (separazione delle responsabilità). Il motore di gioco è un modulo indipendente, utilizzabile da qualsiasi server, qualsiasi framework di test o qualsiasi UI.
💡 Immagina cosìPensa all'arbitro di una partita di basket. L'arbitro non gestisce il campo, vende i biglietti né aziona il tabellone. Si occupa solo di far rispettare le regole. Il tuo motore di gioco è l'arbitro — gli interessa solo se una mossa è valida e se qualcuno ha vinto.
Punti chiave
- Separation of concerns: la logica di gioco va nel suo file dedicato
- Il motore di gioco non sa niente di WebSocket o HTML
- Gestisce: stato del tabellone, validazione delle mosse, tracciamento dei turni, rilevamento della vittoria
- Così è più facile da testare e riutilizzare
02 · Modello di prompt
Chiedi a Claude di costruire il modulo del motore di gioco. Sii preciso su cosa deve fare la classe — questo produce risultati molto migliori rispetto a "fai un gioco di tic-tac-toe".
Aiutami a creare un modulo game.js che contenga una classe TicTacToeGame. Requisiti: (1) Inizializza il tabellone come un array di lunghezza 9, tutto null. (2) Tiene traccia di chi è il turno — X va sempre per primo. (3) Fornisce un metodo makeMove(cellIndex) che valida se la mossa è legale (la cella deve essere tra 0 e 8, deve essere vuota, deve essere il turno del giocatore), piazza il simbolo, controlla se c'è vittoria o pareggio e restituisce un oggetto { valid, symbol, winner, isDraw, board }. (4) Fornisce un metodo getState() che restituisce il tabellone corrente e di chi è il turno. (5) Controlla tutte e 8 le linee vincenti (3 orizzontali, 3 verticali, 2 diagonali). (6) Esporta la classe con module.exports.03 · Esempio di codice
Dopo che Claude ha generato il motore di gioco, cerca la logica di controllo della vittoria. Questa è la parte che devi capire davvero, non solo accettare.
Rilevamento vittoria: le 8 linee vincenti
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
Il tabellone è un array piatto di 9 celle. Gli indici 0-2 sono la riga superiore, 3-5 la riga centrale, 6-8 la riga inferiore. Un giocatore vince quando riempie tre celle in una qualsiasi delle 8 linee possibili. Dopo ogni mossa, il motore controlla tutte e 8 le linee — se una linea ha tre simboli uguali non nulli, quel giocatore ha vinto. Se tutte e 9 le celle sono piene e nessuno ha vinto, è pareggio.
04 · Pratica reale
Testa il motore di gioco direttamente nel REPL di Node.js. È esattamente così che i veri ingegneri verificano il codice prima di collegarlo a qualsiasi altra cosa.
05 · Lista di controllo
Verifica che il motore di gioco gestisca questi casi limite. Provali nel REPL di Node oppure chiedi a Claude di scrivere un test rapido.
- X va sempre per primo — il primo movimento è sempre X
- Muoversi su una cella già occupata restituisce valid: false
- Giocare fuori turno restituisce valid: false
- Dopo una vittoria non sono permesse altre mosse
- Il tabellone pieno senza un vincitore riporta correttamente il pareggio
06 · Quiz
Perché è utile costruire il motore di gioco come modulo separato dal server?
- Può essere testato in modo indipendente, usato in altri progetti e mantiene il codice del server focalizzato
- JavaScript richiede che ogni classe stia nel proprio file
- Rende il codice più difficile da capire ma più veloce da eseguire
- Socket.io non può accedere al codice che si trova nello stesso file di Express
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.