# Analyse Complète du Code - BoideloV3 ## 📋 Table des Matières 1. [Présentation du Projet](#présentation-du-projet) 2. [Structure du Projet](#structure-du-projet) 3. [Fichiers Principaux](#fichiers-principaux) 4. [Fonctionnalités](#fonctionnalités) 5. [Technologies et Dépendances](#technologies-et-dépendances) 6. [Architecture](#architecture) 7. [Composants et Leurs Relations](#composants-et-leurs-relations) 8. [Configuration](#configuration) 9. [Changelog et Améliorations Récentes](#changelog-et-améliorations-récentes) --- ## 🎮 Présentation du Projet **BoideloV3** est une application Android de jeu d'alcool (similaire à "King's Cup" ou "Never Have I Ever"). L'application permet à un groupe de joueurs de répondre à des questions aléatoires avec des consommations de boissons associées. ### Caractéristiques Principales - **Jeu multijoueur** (minimum 3 joueurs, sans maximum) - **150 questions préchargées** depuis un fichier JSON - **Interface en français** avec Material Design 3 - **Défis multi-manches** avec système de gestion - **Paramètres personnalisables** (nombre de questions, ajout de gorgées, durée des défis) - **Générateur aléatoire optimisé** pour une vraie randomisation - **Intégration OpenAI** (en développement) - **Connexion PostgreSQL** (prête) --- ## 📁 Structure du Projet ``` D:\boidelo\ ├── .gradle/ # Cache de construction Gradle ├── .idea/ # Configuration IntelliJ IDEA ├── app/ │ ├── build.gradle # Configuration de build app-level │ ├── libs/ # Librairies JAR externes │ │ ├── postgresql-42.2.27.jre7.jar │ │ └── postgresql-42.6.0.jar │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── assets/ │ │ └── question.json # Base de données questions (150 questions) │ ├── java/com/example/boidelov3/ │ │ ├── MainActivity.java # Écran principal avec ajout dynamique de joueurs │ │ ├── Jeux.java # Activité principale du jeu avec gestion des défis │ │ ├── Jeuxold.java # Implémentation héritée │ │ ├── JeuxParametres.java # Paramètres du jeu avec sliders │ │ ├── EndGameActivity.java # Écran de fin de partie │ │ ├── ChatGPTTask.java # Intégration OpenAI (commenté) │ │ ├── DatabaseConnection.java # Connexion PostgreSQL │ │ ├── data/ │ │ │ ├── Question.java # Modèle de données Question │ │ │ └── QuestionRepository.java # Repository des questions │ │ ├── game/ │ │ │ └── GameEngine.java # Moteur de jeu │ │ └── utils/ │ │ ├── BoideloAnimationUtils.java # Animations UI │ │ └── OnBoardingActivity.java # Page d'accueil │ └── res/ │ ├── anim/ # Animations │ ├── drawable/ # Icônes et graphiques │ ├── layout/ # Layouts UI │ │ ├── activity_main.xml # Écran principal │ │ ├── activity_jeux.xml # Jeu en cours │ │ ├── activity_jeux_parametres.xml # Paramètres │ │ └── activity_end_game.xml # Fin de partie │ ├── mipmap-*/ # Icônes pour différentes densités │ ├── values/ # Chaînes, couleurs, thèmes │ │ └── strings.xml # Textes localisés │ ├── values-night/ # Ressources mode nuit │ └── xml/ # Fichiers de configuration XML ├── build.gradle # Configuration de build projet-level ├── gradle.properties # Propriétés Gradle ├── settings.gradle # Paramètres du projet ├── gradlew, gradlew.bat # Exécutables Gradle wrapper └── .gitignore # Fichier Git ignore ``` --- ## 📄 Fichiers Principaux ### Activités Principales #### `MainActivity.java` **Point d'entrée principal** de l'application avec ajout dynamique de joueurs. **Responsabilités :** - Gestion de la saisie des noms de joueurs (3 champs fixes + ajouts dynamiques) - Validation du minimum de 3 joueurs - Génération dynamique de l'interface utilisateur avec TextInputLayout cohérents - Persistence des noms avec SharedPreferences - Compteur de joueurs en temps réel **Améliorations récentes :** - ✅ Correction de l'UI pour les champs dynamiques (bordure visible, espacement cohérent) - ✅ Bouton suppression plus petit et mieux positionné - ✅ Icône de suppression (poubelle) optimisée #### `Jeux.java` **Cœur du jeu**, gère l'affichage des questions, les mécaniques de jeu et les défis. **Responsabilités :** - Chargement des questions depuis le JSON - Sélection aléatoire sans répétition - Gestion des tours de joueurs - Gestion des défis multi-manches - Feedback visuel avec arrière-plans colorés - Remplacement dynamique des variantes et joueurs **Améliorations récentes :** - ✅ **Générateur aléatoire optimisé** : une seule instance `Random partagée` pour toute l'activité - ✅ **Empêcher nouveaux défis quand un défi est en cours** : filtrage des questions avec `` - ✅ **Bug fix fin de jeu** : flag `isFinishingGame` pour éviter les clics multiples - ✅ **Offset durée des défis** : applique le paramètre `durationDefis` au nombre de manches (5-14 + offset) #### `JeuxParametres.java` **Écran de configuration** des paramètres du jeu avec sliders interactifs. **Responsabilités :** - Configuration du nombre de questions (20-150, par pas de 10) - Gestion des ajouts de gorgées (0-20) avec paliers de difficulté - Configuration du ratio BDD/OPENAI (1/1 à 1/15) - **Configuration de la durée des défis** (-5 à +15, par défaut 0) - Gestion de la clé API OpenAI - Test de connexion API **Améliorations récentes :** - ✅ Correction des sliders : affichage en temps réel des valeurs - ✅ Slider durée des défis avec valeurs négatives autorisées (offset de -5 à +15) #### `EndGameActivity.java` **Écran de fin de partie** avec statistiques. **Responsabilités :** - Affichage des statistiques de partie - Boutons pour rejouer ou retourner au menu ### Modèles de Données #### `Question.java` **Modèle de données** pour une question individuelle. ```java public class Question { private int id; // Identifiant unique private String question; // Texte de la question private int gorger; // Nombre de gorgées private boolean distribution; // Flag de distribution private boolean recois; // Flag de réception private List variante; // Variantes de la question private int manchesRestantes; // Nombre de manches restantes private String arretMessageManche; // Message de fin de défi } ``` #### `QuestionRepository.java` **Repository** pour la gestion des questions avec filtrage. --- ## ⚡ Fonctionnalités ### Gestion des Joueurs - **3 champs fixes** pour les premiers joueurs - **Ajout dynamique** de joueurs avec bouton de suppression - **Minimum 3 joueurs** requis pour commencer - **Support illimité** de nombre de joueurs - **Persistance** avec SharedPreferences - **Compteur en temps réel** : "Joueurs: X / min. 3" ### Système de Questions - **150 questions préchargées** depuis JSON - **Sélection aléatoire optimisée** sans répétition - **Variantes** avec remplacement dynamique de contenu - **Questions à manches** avec mécanique de compte à rebours - **Filtrage intelligent** : pas de nouveau défi si un défi est en cours ### Mécaniques de Jeu - **Ajustement dynamique** du nombre de gorgées via slider (0-20) - **Randomisation optimisée** des joueurs pour les questions - **Feedback visuel** avec arrière-plans colorés - **Défis multi-manches** avec affichage du compteur - **Système de paliers** : de "Grosse merde" à "L'ENDER DRAGON" ### Paramètres de Partie | Paramètre | Plage | Défaut | Description | |-----------|-------|--------|-------------| | **Nombre de questions** | 20-150 (par 10) | 50 | Nombre de questions avant fin de partie | | **Ajout de gorgées** | 0-20 | 0 | Gorgées supplémentaires à chaque consommation | | **Ratio BDD/OPENAI** | 1/1 à 1/15 | 1/8 | Ratio entre questions locales et IA | | **Durée des défis (offset)** | -5 à +15 | 0 | Offset appliqué au nombre de manches | ### Interface Utilisateur - **Material Design 3** avec composants modernes - **Animations fluides** (fade in, slide out, pop in) - **Feedback haptique** sur les interactions - **Localisation en français** entièrement corrigée - **Mode sombre** avec thèmes adaptés --- ## 🛠 Technologies et Dépendances ### Technologies Principales | Technologie | Version | Usage | |-------------|---------|-------| | **Android SDK** | 33 (compile) | Développement Android natif | | **Java** | 17 | Langage principal | | **Gradle** | 8.2 | Automatisation de build | ### Bibliothèques Principales ```gradle dependencies { // Material Design implementation 'com.google.android.material:material:1.12.0' // Cœur AndroidX implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.coordinatorlayout:coordinatorlayout:1.2.0' // Réseau implementation 'com.squareup.okhttp3:okhttp:4.12.0' // Base de données implementation 'com.impossibl.pgjdbc-ng:pgjdbc-ng:0.8.3' // Traitement JSON implementation 'com.google.code.gson:gson:2.10.1' // Tests testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' } ``` --- ## 🏗 Architecture ### Pattern MVC (Model-View-Controller) ``` ┌─────────────────────────────────────────────────┐ │ Model │ │ • Question.java │ │ • QuestionRepository.java │ └─────────────────────────────────────────────────┘ ↑ │ ↓ ┌─────────────────────────────────────────────────┐ │ Controller │ │ • MainActivity.java │ │ • Jeux.java │ │ • JeuxParametres.java │ │ • EndGameActivity.java │ └─────────────────────────────────────────────────┘ ↑ │ ↓ ┌─────────────────────────────────────────────────┐ │ View │ │ • XML Layouts │ │ • Resources (drawable, strings, colors) │ │ • Animations │ └─────────────────────────────────────────────────┘ ``` ### Flux des Activités ``` MainActivity (Saisie joueurs) ↓ validation (min. 3 joueurs) JeuxParametres (Configuration) ↓ paramètres configurés Jeux (Partie en cours) ↓ toutes les questions posées OU fin manches EndGameActivity (Stats et fin) ↓ MainActivity (Retour menu) ``` --- ## 🔗 Composants et Leurs Relations ### Flux de Données ``` ┌────────────────────────────────────────────────────────────┐ │ MainActivity │ │ - 3 champs fixes + ajouts dynamiques │ │ - Compteur temps réel : "Joueurs: X / min. 3" │ │ - UI cohérente pour tous les champs │ └────────────────────┬───────────────────────────────────────┘ │ Intent avec liste joueurs ▼ ┌────────────────────────────────────────────────────────────┐ │ JeuxParametres │ │ - Slider questions : 20-150 (pas de 10) │ │ - Slider gorgées : 0-20 avec paliers │ │ - Slider ratio BDD/OPENAI : 1-15 │ │ - Slider durée défis : -5 à +15 (offset) │ │ - Toggle OpenAI + champ clé API │ └────────────────────┬───────────────────────────────────────┘ │ Intent avec tous les paramètres ▼ ┌────────────────────────────────────────────────────────────┐ │ Jeux │ │ - Charge questions depuis JSON (150 questions) │ │ - Générateur Random optimisé (instance unique) │ │ - Filtre questions si défi en cours │ │ - Applique offset durée défis au nombre de manches │ │ - Gère défis multi-manches │ │ - Flag isFinishingGame pour éviter bugs fin de partie │ └────────────────────┬───────────────────────────────────────┘ │ Fin de partie ▼ ┌────────────────────────────────────────────────────────────┐ │ EndGameActivity │ │ - Affiche statistiques │ │ - Boutons Rejouer / Retour │ └────────────────────────────────────────────────────────────┘ ``` --- ## ⚙️ Configuration ### Configuration de Build | Propriété | Valeur | |-----------|--------| | **Compile SDK** | 33 | | **Min SDK** | 24 | | **Target SDK** | 33 | | **Version Code** | 1 | | **Version Name** | "1.0" | | **Package** | com.example.boidelov3 | ### Configuration Base de Données ``` Hôte : 82.65.214.214 Port : 5432 Base de données : boidelo Utilisateur : android ``` --- ## 🔄 Changelog et Améliorations Récentes ### Version Actuelle - 2025 #### ✅ Corrections Orthographe (2025) - **MainActivity.java** : "ne peux pas" → "ne peut pas" - **question.json** : "diferentes" → "différentes", "veritable" → "véritable", "tu a" → "tu as", etc. - **strings.xml** : "c ki" → "C'est qui", "komment" → "comment", "Prenom" → "Prénom" - **Jeuxold.java** : nombreuses corrections (tour de rôle, choisissant, défie, etc.) #### ✅ Optimisation Aléatoire (2025) - **Problème** : `new Random()` créé à chaque appel causait des répétitions - **Solution** : Instance unique `private final Random random = new Random()` partagée dans toute l'activité - **Fichiers modifiés** : `Jeux.java`, `Jeuxold.java` - **Résultat** : Vraie randomisation des joueurs et questions #### ✅ Interface Utilisateur Cohérente (2025) - **Problème** : Champs dynamiques avaient un style différent des 3 premiers - **Solution** : Application complète du style Material3 - Bordure visible avec `setBoxStrokeColorStateList()` - Couleur de fond `@color/surface` - Largeur bordure 2dp - Icône de suppression (X) pour effacer - **Bouton suppression** : Taille réduite (36dp), espacement optimisé (68dp marge) - **Résultat** : UI uniforme entre tous les champs de saisie #### ✅ Slider Durée des Défis (2025) - **Nouveau paramètre** : Offset pour la durée des défis - **Plage** : -5 à +15 manches - **Défaut** : 0 (pas d'offset) - **Affichage** : Signe +/- pour les valeurs non nulles (-3, +5, etc.) - **Application** : `nbaleatoiremanches = (5-14) + durationDefis` - **Minimum garanti** : 1 manche (même avec offset négatif) #### ✅ Gestion Intelligente des Défis (2025) - **Problème** : Nouveaux défis pouvaient s'accumuler même quand un défi était en cours - **Solution** : Filtrage des questions avec `` dans `getRandomQuestion()` - **Résultat** : Plus d'accumulation de défis, un seul défi à la fois #### ✅ Bug Fix Fin de Jeu (2025) - **Problème** : Quand un défi était en cours à la fin des questions, il fallait cliquer plusieurs fois - **Solution** : Flag `isFinishingGame` + désactivation bouton "Suivant" - **Résultat** : Fin de jeu fluide sans clics multiples #### ✅ Expansion Contenu (2025) - **Ajout de 50 nouvelles questions** (passage de 100 à 150 questions) - **Nouvelles catégories** : - Questions de groupe (ski, tatouage, iPhone, etc.) - Questions de classement (le plus drôle, le plus susceptible, etc.) - Questions couples/amour (ghosting, premier baiser, etc.) - Défis avec manches (accents, interdictions, mini-jeux) - Questions interactives J1/J2/J3 (bras de fer, devinettes, mimes) - Questions variante (activités, fandoms, musique) --- ## 🔮 Statut des Fonctionnalités | Fonctionnalité | Statut | Détails | |----------------|--------|---------| | Jeu multijoueur | ✅ Terminé | Support illimité, UI cohérente | | Questions JSON | ✅ Terminé | 150 questions, orthographe corrigée | | Interface UI | ✅ Terminé | Material Design 3, animations | | Sliders paramètres | ✅ Terminé | Affichage temps réel, 4 sliders actifs | | Défis multi-manches | ✅ Terminé | Gestion optimisée, pas d'accumulation | | Générateur aléatoire | ✅ Optimisé | Instance unique Random partagée | | Durée défis (offset) | ✅ Terminé | -5 à +15 manches | | Orthographe | ✅ Corrigée | Tous fichiers vérifiés | | PostgreSQL | 🔧 Prêt | Connexion configurée | | OpenAI ChatGPT | 🚧 En développement | Interface prête | --- ## 📝 Conclusion Le codebase représente une **application Android de jeu d'alcool mature et bien structurée** avec des patterns d'architecture modernes. Les améliorations récentes ont considérablement amélioré l'expérience utilisateur : - **Randomisation fiable** grâce au générateur optimisé - **Interface cohérente** pour tous les champs de saisie - **Défis gérés intelligemment** sans accumulation - **Paramètres flexibles** pour personnaliser les parties - **Contenu enrichi** avec 150 questions variées - **Orthographe parfaite** dans tout le projet L'architecture est propre, modulaire et facilement extensible pour de futures améliorations. --- *Document mis à jour - Janvier 2025* 🍺