458 lines
20 KiB
Markdown
458 lines
20 KiB
Markdown
# 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 `<manches>`
|
|
- ✅ **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<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
|
|
|
|
```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 <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
|
|
- **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>` 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* 🍺
|