- ✅ Corrections orthographe (MainActivity, question.json, strings.xml, Jeuxold.java) - ✅ Optimisation aléatoire (instance unique Random) - ✅ Interface utilisateur cohérente (champs dynamiques) - ✅ Slider durée des défis (-5 à +15 manches) - ✅ Gestion intelligente des défis (pas d'accumulation) - ✅ Bug fix fin de jeu (flag isFinishingGame) - ✅ Expansion contenu (50 nouvelles questions, passage de 100 à 150)
20 KiB
Analyse Complète du Code - BoideloV3
📋 Table des Matières
- Présentation du Projet
- Structure du Projet
- Fichiers Principaux
- Fonctionnalités
- Technologies et Dépendances
- Architecture
- Composants et Leurs Relations
- Configuration
- 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éepour toute l'activité - ✅ Empêcher nouveaux défis quand un défi est en cours : filtrage des questions avec
<manches> - ✅ Bug fix fin de jeu : flag
isFinishingGamepour éviter les clics multiples - ✅ Offset durée des défis : applique le paramètre
durationDefisau 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.
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<String> 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
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 <manches> 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
- Bordure visible avec
- 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
<manches>dansgetRandomQuestion() - 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 🍺