# 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* 🍺
