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 intégration
Jeu à deux joueurs sur le même appareil. Rubrique publique jeux-juniper-green, dans Ressources/Jeux/Jeux de strategie/Juniper Green, ordre 2 après Hex. Route /rubriques/jeux-juniper-green, chargée par src/pages/rubriques/[id].astro après contrôle habituel du niveau du catalogue. Aucun accès parallèle ni bloc d’attente. Mention Jeux de stratégie et charte des autres jeux : bleu #2365a0 et rouge #ae4433, règles toujours visibles, options après les règles.
Règles et interface
Nombres 1 à N ; grilles 16 (4 × 4), 49 (7 × 7) et 100 (10 × 10). 16 par défaut. Joueur 1 bleu commence obligatoirement par un nombre pair. Ensuite chaque nombre doit être un multiple ou diviseur entier du précédent, et ne pas avoir déjà été choisi. Cliquer pose immédiatement ; un coup interdit est refusé avec explication sans passer le tour. Les nombres gardent la couleur de leur joueur et le dernier nombre a un contour doré. Le joueur sans coup possible perd immédiatement ; pas de nul ni limite de tours.
Annuler le dernier coup restaure l’état complet précédent, y compris après une victoire ; bouton de la couleur du dernier joueur. Nouvelle partie demande confirmation et permet de changer la taille avant validation. La taille est verrouillée après le premier coup. Continuer la partie conserve la taille en cours.
Option Afficher les coups possibles désactivée par défaut, modifiable à tout moment : seuls les nombres autorisés et non joués sont surlignés en vert transparent. Au premier coup, seuls les pairs sont indiqués. Après fin de partie, aucun coup n’est proposé. L’aide n’altère pas la partie et reste choisie après remise à zéro. Clavier : Tab atteint le conteneur défilant puis la case active, flèches pour se déplacer, Entrée/Espace pour jouer. Les grandes grilles défilent horizontalement sur petit écran pour préserver la taille des cases.
Moteur et données
src/lib/juniper-green.mjs est indépendant de Svelte/DOM. Exports : GRID_SIZES, initialJuniper(limit=16), moveError(state,number), legalNumbers(state), playNumber(state,number). État : limit, owners (tableau de N valeurs : -1 libre, 0 bleu, 1 rouge), last (dernier nombre ou null), player (identité au trait), winner (identité ou null), moves (nombre de coups). Les actions utilisent les nombres 1 à N ; owners est indexé de 0 à N−1.
playNumber valide l’action, copie owners, alterne player, puis détecte le blocage. Après victoire, player désigne le perdant, winner le dernier joueur. legalNumbers retourne [] quand la partie est terminée. Aucune mutation des états précédents ; ne pas modifier leurs tableaux en place. Les fonctions supposent un état produit par le moteur, sans validation complète d’états importés.
Historique, focus, réglage de grille et aide dans src/components/JuniperGreen.svelte. En mode local, tout reste en mémoire du composant ; recharger perd la partie et rétablit les réglages par défaut. Aucun stockage persistant, appel serveur ou dépendance ajoutée.
Futur adversaire informatique (non implémenté)
Réutiliser legalNumbers pour les actions et playNumber pour les transitions ; ne pas dupliquer les règles. La condition de premier nombre pair ne vaut que quand last est null. L’état de recherche doit distinguer les nombres disponibles, last, le joueur au trait et la taille. L’aide verte est une préférence visuelle, pas un paramètre des règles.
Prévoir un Worker avec budget de calcul et identifiants de requête si la recherche est coûteuse. Bloquer les clics et le clavier pendant le tour de l’ordinateur ; annuler le calcul et rejeter les réponses périmées après nouvelle partie, changement de taille/mode, annulation ou démontage. Garder le mode local à deux joueurs. Définir avec le propriétaire le camp, la difficulté et si Annuler revient au dernier choix humain ou d’un seul tour. Aucun algorithme, niveau ni performance d’IA n’est implémenté ou évalué.
Validation
node –test tests/juniper-green.test.mjs : tailles, ouverture paire, multiples/diviseurs sur chaque ouverture paire des trois tailles, réutilisation interdite, entrées invalides, alternance, propriété, immutabilité, victoire des deux joueurs et blocage après fin. Vérifier dans le navigateur l’aide avant/après un coup, les trois grilles, un coup interdit, une victoire, l’annulation et le clavier. Ne pas assimiler un contrôle HTTP à une partie jouée.
Règles consultées : https://mathsclubs.co.za/activities/juniper-green/ et https://tab-sa.org/wp-content/updir/2016/07/Maths-Primary-Level-Workshop-3.pdf .
Vérifications effectuées le 26 octobre 2026
- 4 tests du moteur réussis ; compilation réussie.
- Navigateur : accès depuis Jeux, tailles 16/49/100, aide verte après 12 (1, 2, 3, 4, 6), désactivation de cette aide, refus de 5 après 12, victoire avec 12 → 1 → 13, annulation après victoire, changement de taille et pose au clavier vérifiés. Grille de 100 inspectée avec aide sur les multiples/diviseurs de 4.
- Contrôle visuel à environ 790 px ; gestes tactiles et affichage sur téléphone réel non vérifiés.
- Catalogue actualisé après contrôle des fichiers non déclarés : 76 rubriques, 596 ressources. Serveur existant conservé sans redémarrage.
Mode distant — 27 octobre 2026
L’hôte choisit 16/49/100 cases et l’aide aux coups possibles. L’aide peut être appliquée en cours de partie pour les deux joueurs ; changer la taille exige une nouvelle partie acceptée. Annuler restaure un seul nombre et la dernière valeur de référence.
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 (juniper-green-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.