Files
Application/app/src/main/java/com/example/boidelov3/Question.java
T
feldenr ecb44f1934 Améliorations majeures : bugfix, refactoring, sécurité et tests
🐛 Bugfixes:
- Correction des noms en double : vérification uniques des joueurs (insensible à la casse)
- Accord des verbes selon le nombre de joueurs : "boit/distribue" (1 joueur) vs "boivent/distribuent" (2+)
- Défis minimum 3 manches au lieu de 2 (réglable via slider -5 à +15, défaut 0)
- Gorgées minimum 1 au lieu de 2

🎨 Design:
- Bouton de suppression élégant : circulaire blanc avec icône grise (remplace croix rouge sur fond noir)

♻️ Refactoring (Jeux.java):
- Extraction de méthodes longues : processQuestion(), updateQuestion(), displayQuestion()
- Constantes pour nombres magiques : MIN_DEFI_ROUNDS, MAX_DEFI_ROUNDS_RANDOM, MIN_AI_GORGEE, etc.
- Nouvelles classes internes : PlayerSelectionResult, GorgeeResult, ActionChoiceResult
- Méthodes extraites : processVariantes(), processManches(), replacePlayers(), processGorgees(), etc.

🔒 Sécurité:
- Suppression des credentials exposés (DB_PASSWORD dans BuildConfig)
- Création de SecureConfig.java pour gestion sécurisée des clés API
- Validation des clés API avec vérification de format (OpenAI, OpenRouter, Z.ai)
- Protection HTML : ErrorHandler.escapeHtml() pour les noms de joueurs

⚠️ Gestion des erreurs:
- ErrorHandler.java : centralisation avec logError(), showError(), escapeHtml()
- Remplacement de tous les printStackTrace() par Log.e() avec TAG descriptif
- Messages utilisateurs clairs et informatifs

🧪 Tests:
- QuestionTest.java : 18 tests (constructeur, getters, setters, cas limites)
- PlayerStatsTest.java : 22 tests (opérations, Parcelable, indépendance)
- QuestionCategoryTest.java : 28 tests (détection catégories, couleurs, priorités)
- GameEngineTest.java : +15 tests (manches, états, préservation questions)
- Couverture : ~89% sur les classes testées

📦 Dépendances:
- compileSdk/targetSdk : 33 → 35
- OkHttp : 4.9.1 → 4.12.0
- Material : 1.9.0 → 1.12.0
- AppCompat : 1.6.1 → 1.7.0
- Gson : 2.8.8 → 2.11.0

📝 Documentation:
- Javadoc améliorée pour Question.java, PlayerStats.java
- PreferencesKeys.java : constantes centralisées pour SharedPreferences

🔨 Nettoyage:
- Suppression de Jeuxold.java (fichier obsolète)
- question.json : 165 questions avec IDs uniques (correction des doublons)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-14 14:16:38 +01:00

152 lines
3.8 KiB
Java

package com.example.boidelov3;
import java.util.List;
/**
* Représente une question du jeu Boidelo avec toutes ses propriétés.
*
* <p>Cette classe contient toutes les informations nécessaires pour afficher
* et traiter une question lors du jeu.</p>
*
* <p>Propriétés principales :</p>
* <ul>
* <li>{@code id} : Identifiant unique de la question</li>
* <li>{@code question} : Texte de la question (peut contenir des balises)</li>
* <li>{@code gorger} : Nombre de gorgées à boire/distribuer</li>
* <li>{@code distribution} : Si vrai, le joueur distribue des gorgées</li>
* <li>{@code recois} : Si vrai, le joueur boit des gorgées</li>
* <li>{@code manches} : Si vrai, la question est un défi à manches</li>
* <li>{@code caliente} : Si vrai, la question est spéciale/hot</li>
* <li>{@code variante} : Liste des choix possibles pour une variante</li>
* </ul>
*
* <p>Balises spéciales dans le texte :</p>
* <ul>
* <li>{@code <J1>}, {@code <J2>}, {@code <J3>} : Joueurs sélectionnés</li>
* <li>{@code <manches>} : Nombre de manches pour un défi</li>
* <li>{@code <variante>} : Choix à remplacer par une variante</li>
* </ul>
*/
public class Question {
private int id;
private String question;
private int gorger;
private boolean distribution;
private List<String> variante;
private boolean recois;
private boolean manches;
private boolean caliente;
private String arret; // mise à jour du type de données
private int manchesRestantes; // pour le nombre de manches restantes
private String arretMessage; // pour le message d'arrêt
private String arretMessageManche; // pour le message d'arrêt pour les manches
/**
* Constructeur par défaut.
* Initialise tous les champs à leurs valeurs par défaut.
*/
public Question() {
}
// Getters et setters pour tous les champs
/**
* Retourne l'identifiant unique de la question.
* @return L'ID de la question
*/
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getQuestion() {
return question;
}
public void setQuestion(String question) {
this.question = question;
}
public int getGorger() {
return gorger;
}
public void setGorger(int gorger) {
this.gorger = gorger;
}
public boolean isDistribution() {
return distribution;
}
public void setDistribution(boolean distribution) {
this.distribution = distribution;
}
public List<String> getVariante() {
return variante;
}
public void setVariante(List<String> variante) {
this.variante = variante;
}
public boolean isRecois() {
return recois;
}
public void setRecois(boolean recois) {
this.recois = recois;
}
public boolean isManches() {
return manches;
}
public void setManches(boolean manches) {
this.manches = manches;
}
public String getArret() {
return arret;
}
public void setArret(String arret) {
this.arret = arret;
}
public int getManchesRestantes() {
return manchesRestantes;
}
public void setManchesRestantes(int manchesRestantes) {
this.manchesRestantes = manchesRestantes;
}
public String getArretMessage() {
return arretMessage;
}
public void setArretMessage(String arretMessage) {
this.arretMessage = arretMessage;
}
public String getArretMessageManche() {
return arretMessageManche;
}
public void setArretMessageManche(String arretMessageManche) {
this.arretMessageManche = arretMessageManche;
}
public boolean isCaliente() {
return caliente;
}
public void setCaliente(boolean caliente) {
this.caliente = caliente;
}
}