diff --git a/docs/superpowers/specs/2026-08-28-livrets-multiplication-game-design.md b/docs/superpowers/specs/2026-08-28-livrets-multiplication-game-design.md index d77069c..33de278 100644 --- a/docs/superpowers/specs/2026-08-28-livrets-multiplication-game-design.md +++ b/docs/superpowers/specs/2026-08-28-livrets-multiplication-game-design.md @@ -16,7 +16,7 @@ Application mobile Kotlin Multiplatform (Android + iOS) proposant un jeu d'entra | Persistance | JSON (kotlinx.serialization) via okio, chemin par `expect/actual` | | Navigation | État d'écran simple (sealed interface), pas de lib de navigation | | DI | Injection manuelle par constructeur | -| Tables | 1 à 12, tirage aléatoire, pas de sélection | +| Tables | Tirage aléatoire jusqu'à une table maximum paramétrable (1–12, défaut 12) | | Temps écoulé | Question comptée comme fausse, passage automatique | | Feedback | Auto-avance après 1,5 s | | Historique | Parties passées + stats cumulées par table | @@ -49,10 +49,14 @@ Timer : coroutine `Job` par question, annulée à la réponse ; tick de 100 ms p ### Types ```kotlin -data class GameConfig(val questionCount: Int, val secondsPerQuestion: Int) +data class GameConfig( + val questionCount: Int, + val secondsPerQuestion: Int, + val maxTable: Int, // ∈ 1..12 : les facteurs sont tirés dans 1..maxTable +) sealed interface Question { - val table: Int // a ou b ∈ 1..12 + val table: Int // a ou b ∈ 1..config.maxTable data class Direct(val a: Int, val b: Int) : Question // "a × b = ?" → a*b data class MissingFactor(val a: Int, val b: Int) : Question // "a × ? = b" → facteur manquant } @@ -80,7 +84,7 @@ data class GameResult( Événements : `AnswerSubmitted(n)`, `Timeout`, `Tick`, `FeedbackElapsed`. Règles : -- Génération : `a`, `b` tirés uniformément dans 1..12 ; forme `Direct` ou `MissingFactor` au hasard (~50/50) ; interdiction de répéter exactement la même question deux fois de suite. +- Génération : `a`, `b` tirés uniformément dans 1..`config.maxTable` (le joueur limite la difficulté en réduisant la table max) ; forme `Direct` ou `MissingFactor` au hasard (~50/50) ; interdiction de répéter exactement la même question deux fois de suite. - Pour `MissingFactor(a, b)` : la question s'affiche `a × ? = a*b`, la réponse attendue est `b`. - Réponse correcte → `Feedback` vert 1,5 s → question suivante. - Réponse fausse → `Feedback` rouge 1,5 s (bonne réponse affichée) → question suivante. @@ -93,7 +97,7 @@ Pavé numérique uniquement : chiffres 0-9 + retour arrière ; la saisie est val ## 5. Écrans & flux UX -1. **Accueil / Configuration** : nombre de questions (stepper 5–50, défaut 10) ; temps par question (stepper 3–30 s, défaut 10) ; boutons "Jouer" et "Historique". +1. **Accueil / Configuration** : nombre de questions (stepper 5–50, défaut 10) ; temps par question (stepper 3–30 s, défaut 10) ; "Jusqu'à la table de…" (stepper 1–12, défaut 12) ; boutons "Jouer" et "Historique". 2. **Jeu** : question en grand (`7 × 8 = ?` ou `7 × ? = 56`), barre de temps, saisie en gros, pavé numérique 0-9 + effacement + OK. À la validation ou au timeout : flash vert ✓ / rouge ✗ avec la bonne réponse, pause 1,5 s, question suivante. Bouton quitter avec confirmation (abandon = partie non persistée ou persistée comme interrompue : non persistée, par simplicité). 3. **Résultats** : score `x/N`, % de réussite, temps moyen de réponse ; liste des réponses fausses (question, réponse donnée ou "temps écoulé", bonne réponse) ; boutons "Rejouer" (mêmes paramètres) et "Accueil". 4. **Historique** : deux onglets — "Parties" (date, config, score, trié du plus récent au plus ancien) et "Tables" (barre de taux de réussite par table 1..12, tables < 60 % en rouge ; une table sans donnée est grise). @@ -113,13 +117,13 @@ Flux : Accueil → Jeu → Résultats → (Rejouer | Accueil | Historique). Dans `commonTest` (kotlin.test + coroutines-test) : - `GameEngine` : réponse juste, réponse fausse, timeout (= fausse, `givenAnswer = null`), enchaînement feedback → question suivante, fin de partie après N questions, arrêt propre du chrono pendant le feedback. -- Générateur de questions : bornes 1..12, les deux formes produites, pas de doublon consécutif. +- Générateur de questions : bornes 1..`maxTable` (testé pour plusieurs valeurs, dont 6 et 12), les deux formes produites, pas de doublon consécutif. - Agrégation stats par table : taux corrects par table, tables sans données. - `HistoryRepository` : aller-retour sérialisation/désérialisation (FileSystem en mémoire via okio fake). ## 8. Hors périmètre (v1) -- Sélection des tables à travailler +- Sélection fine des tables (par ex. travailler uniquement 7, 8 et 9) - Modes de jeu alternatifs (contre-la-montre global, endless…) - Son, animations avancées, accessibilité fine - Synchronisation cloud, multi-joueurs