Construire le moteur de jeu
Demander à Claude de coder les règles du tic-tac-toe
⏱ Estim. ~7 min
01 · Lire
Le moteur de jeu, c'est le cerveau de ton app. Il ne connaît pas WebSocket, ni HTML, ni les joueurs. Il sait juste comment marche le tic-tac-toe : plateau 3x3, deux symboles, tours, conditions de victoire.
Mettre cette logique dans son propre fichier — séparée du code serveur — c'est le pattern de la séparation des préoccupations (separation of concerns). Le moteur de jeu est un module indépendant qui peut être utilisé par n'importe quel serveur, n'importe quel framework de test, n'importe quelle UI.
💡 Imagine çaPense à un arbitre dans un match de basket. L'arbitre ne gère pas la salle, ne vend pas les billets, ne s'occupe pas du tableau d'affichage. Il applique juste les règles. Ton moteur de jeu, c'est l'arbitre — il se contente de savoir si un coup est valide et si quelqu'un a gagné.
Points clés
- Séparation des préoccupations : la logique du jeu dans son propre fichier
- Le moteur de jeu ne connaît ni WebSocket ni HTML
- Il gère : l'état du plateau, la validation des coups, le suivi des tours, la détection des victoires
- Ça le rend facile à tester et à réutiliser
02 · Modèle de prompt
Demande à Claude de construire le module moteur de jeu. Sois précis sur ce que la class doit faire — c'est bien meilleur que « fais un jeu de tic-tac-toe ».
Aide-moi à créer un module game.js qui contient une class TicTacToeGame. Exigences : (1) Initialiser le board comme un array de longueur 9, rempli de null. (2) Suivre à qui c'est le tour — X commence toujours. (3) Fournir une méthode makeMove(cellIndex) qui valide le coup (la cell doit être entre 0-8, vide, et c'est le tour du joueur), pose le symbole correspondant, vérifie victoire ou match nul, et renvoie un objet { valid, symbol, winner, isDraw, board }. (4) Fournir une méthode getState() qui renvoie le board actuel et à qui c'est le tour. (5) Vérifier les 8 lignes de victoire (3 horizontales, 3 verticales, 2 diagonales). (6) Exporter la class avec module.exports.03 · Exemple de code
Une fois que Claude a produit le moteur de jeu, repère la logique de détection de victoire. C'est la partie que tu dois comprendre, pas juste accepter.
Détection de victoire : les 8 lignes gagnantes
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
Le plateau est un array plat de 9 cases. Les index 0-2 sont la rangée du haut, 3-5 la rangée du milieu, 6-8 la rangée du bas. Un joueur gagne en remplissant trois cases sur une des 8 lignes possibles. Après chaque coup, le moteur vérifie les 8 lignes — si une ligne contient trois symboles non-null identiques, ce joueur gagne. Si les 9 cases sont remplies sans vainqueur, c'est un match nul.
04 · Pratique réelle
Teste le moteur de jeu directement dans le REPL Node.js. C'est exactement comme ça que les vrais devs valident leur code avant de tout brancher.
05 · Liste de vérification
Vérifie que ton moteur gère ces cas limites. Essaie chacun dans le REPL Node, ou demande à Claude d'écrire un petit test.
- X commence toujours — le tout premier coup est forcément un X
- Jouer sur une case occupée renvoie valid: false
- Jouer hors de son tour renvoie valid: false
- Une fois la partie gagnée, plus aucun coup n'est autorisé
- Un plateau plein sans vainqueur déclare correctement un match nul
06 · Quiz
Pourquoi est-ce utile de construire le moteur de jeu comme un module séparé du serveur ?
- On peut le tester indépendamment, le réutiliser dans d'autres projets, et garder le code serveur concentré
- JavaScript exige que chaque class soit dans son propre fichier
- Ça rend le code plus difficile à comprendre mais plus rapide à l'exécution
- Socket.io ne peut pas accéder au code du même fichier qu'Express
Autres leçons de ce chapitre
⚠ L'expérience interactive complète nécessite JavaScript. Active-le et recharge la page.
※ Ce site est un projet éducatif indépendant — pas un produit officiel d'Anthropic. Claude™ est une marque déposée d'Anthropic, PBC.