Modes actuels : deux joueurs locaux ou 1v1 à distance. Les descriptions d’annulation immédiate, de confirmation locale et de stockage dans le composant ci-dessous concernent le mode local. Le mode distant utilise un serveur et l’accord de l’adversaire ; voir la section dédiée en fin de fiche et le guide de déploiement (../DEPLOIEMENT_JEUX.md).
Fiche comparée aux sources, à l’interface et au catalogue le 26 octobre 2026. Voir l’audit commun des neuf activités (../JEUX.md#validation-documentaire). Les comptes de tests et recettes navigateur datés plus bas sont des vérifications historiques, pas un état de validation global actuel.
Accès et interface
Titre public de la page et de la carte : « Petits carrés ». Mode deux joueurs local, rubrique jeux-petits-carres et route /rubriques/jeux-petits-carres conservées. Le contrôle de niveau reste celui du catalogue (public). Bloc À venir retiré ; bloc de règles éditoriales conservé dans Ressources et rendu dans un slot de DotsAndBoxes.svelte, sous le plateau. Autres blocs éditoriaux conservés après le jeu.
Grille fixe de 6 lignes sur 7 colonnes de carrés : 42 cases, 7 × 8 points et 97 segments. Aucun sélecteur de taille. Les segments pâles sont directement cliquables : un clic ou toucher valide immédiatement le trait. Zone de clic de 28 pixels de large, sans glisser ni confirmation. Les segments prennent la couleur du joueur (bleu #2365a0, rouge #ae4433), les carrés une teinte pâle (35 % de la couleur du joueur mélangée au fond), sans coche ni autre symbole. Les segments rejoignent le centre des points gris-vert clair (#91a69c). Le remplissage s’étend jusqu’aux axes des côtés, sous les traits, pour éviter les espaces vides aux coins. Dernier trait marqué d’un point doré. Scores toujours affichés. Un carré fermé rapporte un point et donne un nouveau coup au même joueur ; deux carrés fermés simultanément donnent deux points mais pas deux coups en réserve. La main passe uniquement si aucun carré ne se ferme. Fin quand tous les carrés sont attribués, score majoritaire ou nul.
Annuler le dernier coup revient avant un seul trait (pas toute une chaîne de fermetures) et restaure scores, propriétaires, joueur, fin de partie et dernier trait. Bouton de la couleur de l’auteur du dernier trait. Nouvelle partie demande confirmation et réinitialise la même grille. Clavier : Tab pour entrer, Gauche/Droite pour parcourir une rangée de segments, Haut/Bas pour passer à la rangée visuelle voisine (alternance horizontaux/verticaux), Entrée/Espace pour tracer. Grandes grilles défilantes horizontalement sur petit écran.
Moteur et stockage
src/lib/dots-and-boxes.mjs : moteur pur, exports BOARD_ROWS=6, BOARD_COLS=7, initialBoxes(rows=6,cols=rows), edgeGeometry(rows,cols,id), boxEdges(rows,cols,box), drawEdge(state,id), nextEdge(rows,cols,id,key). Le composant appelle explicitement initialBoxes(BOARD_ROWS,BOARD_COLS). Attention : initialBoxes() seul crée 6 × 6 ; c’est l’appel explicite du composant qui impose le 6 × 7 public. Le moteur accepte 1 à 8 lignes/colonnes pour les tests et extensions.
État : rows, cols, edges (−1 libre, 0/1 propriétaire du trait), boxes (−1 libre, 0/1 propriétaire du carré), scores, player, moves (traits joués), last (id du dernier trait ou null), captured (carrés fermés au dernier coup), over, winner (identité ou null). Les premiers cols*(rows+1) segments sont horizontaux, indexés par ligne ; les suivants sont verticaux, aussi par ligne. Les carrés sont indexés par ligne. over=true et winner=null signifie une égalité ; winner=null seul ne signifie pas que la partie est finie.
drawEdge valide l’action, copie les tableaux, détecte tous les carrés nouvellement fermés, met à jour les scores et garde la main si nécessaire. Ne pas supposer une alternance à chaque transition. Les états et tableaux reçus ne doivent pas être modifiés en place. L’historique est géré par le composant. En mode local, aucun stockage persistant ni appel API ; recharger recommence la partie. Aucune dépendance ajoutée.
Futur ordinateur (non implémenté)
Générer les segments libres et simuler avec drawEdge. Conserver le point de vue de l’identité de joueur et respecter les coups supplémentaires : ne pas inverser systématiquement le signe d’une évaluation à chaque trait. La clé de cache doit représenter la grille, les segments occupés, le joueur et les scores/attributions nécessaires au résultat final. L’ordinateur ne doit pas être obligé de prendre un carré disponible.
Prévoir un Worker annulable si recherche coûteuse, identifiant de partie/requête, refus des résultats périmés et blocage des entrées humaines pendant le calcul. Définir le choix du camp, les difficultés et l’annulation solo, particulièrement après une chaîne de fermetures. Aucun algorithme ni niveau de jeu n’est évalué à ce jour.
Validation
node –test tests/dots-and-boxes.test.mjs : géométrie, segments partagés, validation, immutabilité, alternance, fermeture simple/double, absence de coups de réserve, victoire/nul et états précédents réutilisables. Vérifier aussi au navigateur les clics, points et traits, le même joueur après fermeture, les doubles carrés, annulation et clavier. Le tactile doit être testé sur appareil avant d’être déclaré vérifié.
Validation du 26 octobre 2026 : 104 tests passent, compilation de production réussie. Dans le navigateur : pose immédiate, fermeture double et conservation de la main, annulation rétablissant les deux carrés et le score, partie complète et annulation après victoire, flèche puis Espace pour tracer vérifiés. Le tactile reste à vérifier sur appareil.
Grille rectangulaire : tests de couverture des 97 segments, fermeture du coin inférieur droit et attribution des 42 carrés. Vérification après passage en 6 × 7 : les 6 tests ciblés passent et la compilation réussit. Capture immédiate, score et remplissage uni sans coche vérifiés dans le navigateur.
Navigation clavier : un seul arrêt Tab sur le plateau (segment courant), sans arrêt intermédiaire sur le conteneur. Le focus reste possible sur les traits déjà joués, sans autoriser leur rejeu. Les flèches restent aux bords de la grille. Test de parcours exhaustif des 97 segments, dont les 48 verticaux. Correction clavier vérifiée : 7 tests ciblés et compilation réussis. Dans le navigateur, Tab atteint directement le premier segment ; Bas atteint un vertical, Espace le trace, puis Droite/Bas rejoignent un horizontal de la rangée suivante.
Mode distant — 27 octobre 2026
La grille reste imposée à 6 × 7 carrés, sans option. Une capture peut conserver la main au même joueur ; aucune alternance réseau artificielle. Annuler retire un trait avec tous les carrés qu’il a fermés, pas toute une série de coups rejoués.
OnlineLobby.svelte gère création, invitation, présence et consentement ; OnlineSettings.svelte gère les options de l’hôte. L’invité ne peut pas les changer. Les API contrôlent la rubrique de ce jeu et réutilisent son moteur pur. Plateaux/historiques en mémoire serveur, clé de place dans sessionStorage (petits-carres-online-seat-v1). Recharger le même onglet retrouve le salon tant qu’il existe ; redémarrer le serveur le perd. Sélections préparatoires non envoyées non sauvegardées.
Annulation et nouvelle partie nécessitent l’accord adverse ; délai de demande d’une minute. Une coupure suspend le jeu et réserve la place cinq minutes par défaut. Ces délais et le plafond global sont décrits dans le contrat commun. La validation distante (tests de service, parties complètes, HTTP/SSE et scénario navigateur propre à ce jeu) est consignée dans cette fiche commune ; le tactile et l’hébergement public restent à valider. Les anciennes recettes datées ci-dessus restent un historique du mode local.
Revanche distante : le salon reste ouvert après victoire ou nul, jusqu’au départ ou à son expiration. Chaque nouvelle partie acceptée alterne le premier joueur (hôte, invité, hôte…), qui reçoit le joueur 1 et le bleu au départ. Les droits de l’hôte restent inchangés. Refus, retrait, expiration de demande, annulation de coup et reconnexion ne changent pas cet ordre. Voir les champs starterRole/playerIndex, délais et vérifications dans le contrat commun.