# đŸŽČ Boidelo **L'application de jeux de soirĂ©e — questions, dĂ©fis et cartes entre amis** ![Android](https://img.shields.io/badge/Android-7.0%2B-3DDC84?logo=android) ![Java](https://img.shields.io/badge/Java-8-orange?logo=java) ![Gradle](https://img.shields.io/badge/Gradle-8.12.0-02303A?logo=gradle) ![SDK](https://img.shields.io/badge/compileSdk-35-34A853?logo=android) ![License](https://img.shields.io/badge/License-Private-grey)
--- ## 📖 Description **Boidelo** est une application Android de jeux de soirĂ©e regroupant plusieurs mini-jeux autour d'un hub central. Entrez les noms des joueurs, choisissez un jeu, et laissez l'ambiance opĂ©rer ! L'application propose trois jeux distincts ainsi qu'un consulteur de rĂšgles de jeux d'ambiance populaires. --- ## 🎼 Jeux disponibles ### 1. Boidelo Classic Le jeu original de questions et dĂ©fis. InspirĂ© de jeux comme *King's Cup* ou *Never Have I Ever*. - **150+ questions** prĂ©chargĂ©es depuis un fichier JSON, avec 10 catĂ©gories distinctes - Questions dynamiques avec remplacement de variables (``, ``, ``, ``) - **DĂ©fis multi-manches** avec compte Ă  rebours et message de fin - Gestion intelligente : pas d'accumulation de dĂ©fis simultanĂ©s - SystĂšme de **gorgĂ©es** (boire / distribuer) avec accord grammatical automatique - CatĂ©gorisation automatique des questions avec couleur de fond dynamique : - Ciblage, Classement, Jugement, Duel, Interactif, DĂ©fi, Variante, Caliente, Vote, Classique - ParamĂštres personnalisables : nombre de questions, gorgĂ©es supplĂ©mentaires, durĂ©e des dĂ©fis - **IntĂ©gration OpenAI** (optionnelle) pour gĂ©nĂ©rer des questions via ChatGPT ### 2. 89++ Un jeu de cartes avec timer et dĂ©fis spĂ©ciaux. - Objectif : ne pas ĂȘtre celui qui atteint ou dĂ©passe **89** - RĂšgles spĂ©ciales : Valet (−10), Dame (changement de sens), Roi (choix de valeur) - GorgĂ©es distribuĂ©es Ă  chaque dizaine atteinte (70 = double !) - **9 types de dĂ©fis** alĂ©atoires : - Changement de sens, ImmunitĂ©, GorgĂ©e surprise, Joker (passer son tour), Échange de mains, Double prochaine valeur, Compte mystĂšre, Tour gĂ©nĂ©rale, Victime au choix - Timer configurable pour les dĂ©fis - Suivi des gorgĂ©es par joueur ### 3. Papelito (Undercover) Un jeu de dĂ©duction sociale. Trouvez l'Undercover avant qu'il ne soit trop tard ! - **20 paires de mots** prĂ©chargĂ©es (Pizza/Burger, Chat/Chien, Vin/BiĂšre, etc.) - Attribution alĂ©atoire des rĂŽles : **Civil**, **Undercover**, **Mr. White** - MĂ©canique de **discussion → vote → Ă©limination** - Conditions de victoire : - Civils gagnent si tous les Undercovers sont Ă©liminĂ©s - Undercovers gagnent s'ils sont en nombre ≄ aux Civils - Gestion des Ă©galitĂ©s de votes (personne n'est Ă©liminĂ©) - Machine Ă  Ă©tats avec validation des transitions lĂ©gales ### 4. RĂšgles de jeux Consultez les rĂšgles des jeux d'ambiance populaires directement dans l'application. --- ## 🏗 Architecture ### Vue d'ensemble Boidelo suit un pattern **Repository + SĂ©paration des responsabilitĂ©s**. Chaque jeu est isolĂ© dans son propre package avec sa propre logique mĂ©tier. ``` app/src/main/java/com/example/boidelov3/ ├── hub/ # Hub central │ ├── GameSelectionActivity.java # ActivitĂ© LAUNCHER (point d'entrĂ©e) │ ├── adapter/ │ │ └── GameAdapter.java # RecyclerView adapter │ └── model/ │ └── GameInfo.java # ModĂšle (nom, description, icĂŽne, type) │ ├── games/ # Jeux isolĂ©s par package │ ├── boideloclassic/ # Boidelo Classic │ │ ├── BoideloClassicSetupActivity.java │ │ ├── BoideloClassicParamsActivity.java │ │ ├── BoideloClassicGameActivity.java │ │ └── manager/ │ │ ├── BoideloPlayerManager.java │ │ └── BoideloPlayerRowManager.java │ ├── game89/ # 89++ │ │ ├── Game89SetupActivity.java │ │ ├── Game89GameActivity.java │ │ ├── Game89Player.java # ModĂšle joueur │ │ └── Game89ChallengeManager.java # Gestionnaire de dĂ©fis │ └── papelito/ # Papelito (Undercover) │ ├── PapelitoSetupActivity.java │ ├── PapelitoGameActivity.java │ ├── PapelitoResultActivity.java │ ├── PapelitoResultAdapter.java │ ├── PapelitoGame.java # Logique complĂšte du jeu │ └── PapelitoPlayer.java # ModĂšle joueur (Serializable) │ ├── data/ # Couche d'accĂšs aux donnĂ©es │ ├── QuestionRepository.java # Chargement JSON + SharedPreferences │ ├── Result.java # Wrapper type-safe succĂšs/erreur │ ├── PlayerStats.java # Stats joueur (Parcelable) │ └── QuestionCategory.java # CatĂ©gorisation + couleurs │ ├── game/ # Logique mĂ©tier commune │ └── GameEngine.java # Moteur de jeu (pur Java) │ ├── utils/ # Utilitaires │ ├── ErrorHandler.java │ ├── SecureConfig.java │ ├── SoundManager.java │ └── SoundGenerator.java │ ├── MainActivity.java # Legacy (Ă  supprimer) ├── Jeux.java # Legacy (Ă  supprimer) ├── JeuxParametres.java # Legacy (Ă  supprimer) ├── EndGameActivity.java # Legacy (Ă  supprimer) ├── OpenAIService.java # Service OpenAI ├── ChatGPTTask.java # Task async OpenAI ├── DatabaseConnection.java # Connexion PostgreSQL ├── Question.java # ModĂšle de question ├── Questions.java # Conteneur de questions (Gson) ├── PreferencesKeys.java # Constantes SharedPreferences └── BoideloAnimationUtils.java # Animations UI ``` ### Flux d'une partie Chaque jeu suit le mĂȘme schĂ©ma d'activitĂ© : ``` Hub (GameSelectionActivity) └─â–ș Setup (saisie des joueurs) └─â–ș Parameters (configuration, optionnel) └─â–ș Game (partie en cours) └─â–ș End Game (statistiques & rĂ©sultats) ``` ### Pattern Result Le projet utilise un wrapper type-safe pour la gestion des erreurs, Ă©vitant les exceptions non contrĂŽlĂ©es : ```java Result result = repository.loadQuestions(); if (result.isSuccess()) { Questions questions = result.getData(); } else { Exception error = result.getError(); } ``` --- ## 🛠 Stack technique | ÉlĂ©ment | Version / DĂ©tail | |---|---| | **Langage** | Java 8 | | **Min SDK** | 24 (Android 7.0) | | **Target / Compile SDK** | 35 (Android 15) | | **Build system** | Gradle 8.12.0 + AGP 8.12.0 | | **UI** | Material Design 3, AppCompat 1.7.0 | | **Layout** | ConstraintLayout 2.2.0 | | **RĂ©seau** | OkHttp 4.12.0 | | **JSON** | Gson 2.11.0 | | **Base de donnĂ©es** | pgjdbc-ng 0.8.3 (PostgreSQL, actuellement inutilisĂ©) | | **Tests unitaires** | JUnit 4.13.2, Mockito 5.7.0, Robolectric 4.11.1 | | **Tests UI** | AndroidX Test JUnit 1.2.1, Espresso 3.6.1 | --- ## đŸ§Ș Tests Le projet dispose de **11 classes de test** couvrant l'ensemble des jeux et des composants de donnĂ©es : | Classe de test | Fichier | |---|---| | `GameEngineTest` | `game/GameEngineTest.java` (15 tests) | | `ResultTest` | `data/ResultTest.java` (8 tests) | | `PlayerStatsTest` | `data/PlayerStatsTest.java` | | `QuestionCategoryTest` | `data/QuestionCategoryTest.java` | | `QuestionTest` | `QuestionTest.java` | | `QuestionsClassTest` | `QuestionsClassTest.java` | | `BoideloPlayerManagerTest` | `games/boideloclassic/manager/BoideloPlayerManagerTest.java` | | `Game89PlayerTest` | `games/game89/Game89PlayerTest.java` | | `Game89ChallengeManagerTest` | `games/game89/Game89ChallengeManagerTest.java` | | `PapelitoPlayerTest` | `games/papelito/PapelitoPlayerTest.java` | | `PapelitoGameTest` | `games/papelito/PapelitoGameTest.java` | --- ## 🔹 Compilation et installation ### PrĂ©requis - **Android Studio** (recommandĂ©) ou **JDK 17-21** + SDK Android - Android SDK avec compileSdk 35 ### Build depuis la ligne de commande ```bash # Cloner le projet git clone cd boidelo # Build ./gradlew build # APK debug ./gradlew assembleDebug # Installer sur un appareil connectĂ© adb install -r app/build/outputs/apk/debug/app-debug.apk ``` ### ExĂ©cuter les tests ```bash # Tous les tests unitaires ./gradlew test # Tests instrumentĂ©s (appareil/Ă©mulateur requis) ./gradlew connectedAndroidTest # Test spĂ©cifique ./gradlew test --tests com.example.boidelov3.game.GameEngineTest ``` > ⚠ **Note :** Un bug connu avec Gradle 8.13 peut causer l'Ă©chec des tests unitaires en CLI. Utilisez Android Studio ou un JDK 17-21 pour contourner le problĂšme. ### Clean ```bash ./gradlew clean ``` --- ## 🎹 Interface - **Material Design 3** avec composants modernes (MaterialCardView, TextInputLayout, etc.) - **Mode sombre** avec thĂšmes dĂ©diĂ©s (`values-night/`) - **Animations fluides** : fade in/out, slide, color transition, button press/release - **Feedback haptique** et effets sonores via `SoundManager` / `SoundGenerator` - **Palette principale** : Violet (`#9395D3`) / Lavande (`#B3B7EE`) sur fond blanc cassĂ© (`#FBF9FF`) - Couleurs dynamiques par catĂ©gorie de question (10 couleurs distinctes) - Toutes les activitĂ©s en mode **portrait** --- ## 📁 Structure des ressources ``` app/src/main/res/ ├── anim/ # 10 animations (slide, fade, button, color) ├── drawable/ # IcĂŽnes de jeux, boutons, fonds ├── layout/ # 19 layouts XML │ ├── activity_game_selection.xml # Hub principal │ ├── activity_boidelo_classic_setup.xml │ ├── activity_boidelo_classic_params.xml │ ├── activity_boidelo_classic_game.xml │ ├── activity_game89_setup.xml │ ├── activity_game89_game.xml │ ├── activity_papelito_setup.xml │ ├── activity_papelito_game.xml │ ├── activity_papelito_result.xml │ ├── dialog_papelito_vote.xml │ └── dialog_papelito_word_reveal.xml ├── values/ # Strings, couleurs, thĂšmes, styles ├── values-night/ # Variantes mode sombre ├── mipmap-*/ # IcĂŽnes launcher (mdpi → xxxhdpi) └── xml/ # Backup rules, data extraction rules ``` --- ## 📊 DonnĂ©es Les questions de Boidelo Classic sont stockĂ©es dans `app/src/main/assets/question.json`. Chaque question contient : - `id` — identifiant unique - `question` — texte avec placeholders (``, ``, ``) - `gorger` — nombre de gorgĂ©es - `distribution` / `recois` — flags pour boire ou distribuer - `variante` — liste de variantes alternatives - `manches` — nombre de manches pour les dĂ©fis - `arret` — message de fin de dĂ©fi --- ## 🔐 Configuration ### ClĂ© API OpenAI (optionnel) Les clĂ©s sensibles sont stockĂ©es dans `local.properties` (non versionnĂ©) : ```properties OPENAI_API_KEY=sk-votre-cle-ici ``` La classe `SecureConfig` fournit un accĂšs sĂ©curisĂ© Ă  ces valeurs. ### Base de donnĂ©es PostgreSQL La connexion PostgreSQL est prĂ©parĂ©e mais le backend n'est pas encore en production. Les identifiants BuildConfig sont intentionnellement vides — l'usage d'une API backend est recommandĂ©. --- ## 🚀 Ajouter un nouveau jeu 1. CrĂ©er un package sous `com.example.boidelov3.games.` 2. ImplĂ©menter les activitĂ©s **Setup**, **Game** et **Result** (suivre le flux standard) 3. Ajouter une valeur Ă  l'enum `GameInfo.GameType` 4. Enregistrer le jeu dans `GameSelectionActivity.setupGamesList()` 5. Ajouter le cas dans le `switch` de `GameSelectionActivity.onItemClick()` 6. DĂ©clarer les activitĂ©s dans `AndroidManifest.xml` avec `screenOrientation="portrait"` 7. Ajouter l'icĂŽne drawable `ic_.xml` 8. Écrire les tests unitaires correspondants --- ## 📝 Conventions - **Langue mĂ©tier** : français (`gorgees`, `manches`, `caliente`) - **Code technique** : anglais (`allPlayers`, `activeManches`) - **Interface utilisateur** : français - **ClĂ©s SharedPreferences** : centralisĂ©es dans `PreferencesKeys.java` - **Nommage layouts** : `activity__<Ă©cran>.xml`, `dialog__.xml` - **Nommage strings** : prĂ©fixe par jeu (`papelito_`, `boidelo_`, `game89_`) --- ## 📋 Statut des fonctionnalitĂ©s | FonctionnalitĂ© | Statut | |---|---| | Hub de sĂ©lection de jeux | ✅ OpĂ©rationnel | | Boidelo Classic (150+ questions) | ✅ OpĂ©rationnel | | 89++ (cartes + dĂ©fis) | ✅ OpĂ©rationnel | | Papelito / Undercover | ✅ OpĂ©rationnel | | RĂšgles de jeux | 🚧 En cours | | IntĂ©gration OpenAI (questions IA) | 🚧 En dĂ©veloppement | | Connexion PostgreSQL | 🔧 PrĂȘte (backend requis) | | Mode sombre | ✅ OpĂ©rationnel | | Tests unitaires (11 classes) | ✅ OpĂ©rationnel | --- ## 📚 Documentation supplĂ©mentaire - [`ANALYSE_CODE.md`](ANALYSE_CODE.md) — Analyse dĂ©taillĂ©e du code (ancienne architecture) - [`README_ARCHITECTURE.md`](README_ARCHITECTURE.md) — Documentation de l'architecture Repository - [`CLAUDE.md`](CLAUDE.md) — Guide de dĂ©veloppement pour l'IA --- ## 📄 Licence Projet privĂ© — tous droits rĂ©servĂ©s. --- *Boidelo — buvez responsable* đŸ»