# Exercice 5 – Mesure de métriques et profiling du programme Hangman # PenduWilfried ## 1. Calcul de la complexité cyclomatique | Classe / Méthode | Description | Complexité cyclomatique | |------------------|------------|------------------------| | `ChooseWord.chooseTheWord(String)` | Choisit un mot selon la difficulté | 4 | | `ChooseWord.getFilenameByDifficulty(String)` | Retourne le fichier selon difficulté | 4 | | `ChooseWord.isValidForDifficulty(String, String)` | Vérifie si le mot est valide pour la difficulté | 4 | | `GameState.tryLetter(char)` | Essaie une lettre et met à jour le score | 3 | | `GameState.updateScore()` | Calcule le score en fonction du temps et des erreurs | 3 | | `GameState.getDifficultyMultiplier()` | Retourne multiplicateur selon difficulté | 4 | | `GameState.isWon()` | Vérifie si le joueur a gagné | 2 | | `HangmanPanel.paintComponent(Graphics)` | Dessine le pendu selon erreurs | 9 | | `main.handleLetterInput()` | Gestion saisie utilisateur et mise à jour UI | 9 | | `main.showEndGameMessage(boolean, int)` | Affiche message de fin de jeu | 3 | | `main.main(String[])` | Point d’entrée du programme | 1 | **Conclusion :** La majorité des fonctions ont une complexité modérée (<10). Les fonctions `paintComponent` et `handleLetterInput` sont plus complexes, ce qui pourrait justifier une refactorisation pour améliorer la lisibilité. # PenduJude ## 1. Calcul de la complexité cyclomatique | Classe / Méthode | Description | Complexité cyclomatique | |------------------|------------|------------------------| | `Display.showWord(String, Set)` | Affiche le mot avec lettres devinées | 3 (for + if/else) | | `Display.showLives(int, int)` | Affiche le nombre de vies | 1 | | `GameLogic.isWordGuessed(String, Set)` | Vérifie si le mot est deviné | 3 (for + if + continue) | | `InputHandler.getLetter(Scanner, Set)` | Gestion de la saisie utilisateur | 5 (while + if multiples + continue) | | `ScoreManager.calculateScore(int, long, String)` | Calcule le score final | 5 (switch + if) | | `TimerManager.start()` | Démarre le chronomètre | 1 | | `TimerManager.getElapsedTimeMillis()` | Retourne le temps écoulé | 1 | | `WordSelector.loadWordsForDifficulty(String, String)` | Charge les mots depuis un fichier | 3 (try/catch + while) | | `WordSelector.pickWord(String)` | Retourne un mot aléatoire selon difficulté | 2 (if) | | `HangedGameGUI.processGuess()` | Traitement d’une lettre saisie | 9 (if/else multiples + for) | | `HangedGameGUI.updateWordDisplay()` | Met à jour l’affichage du mot | 3 (for + if/else) | | `HangedGameGUI.drawHangman(Graphics)` | Dessine le pendu selon erreurs | 11 (chaîne de if) | | `HangedGameGUI.checkGameEnd()` | Vérifie la fin du jeu | 2 (if) | | `HangedGameGUI.endGame(boolean)` | Affiche le message de fin et score | 5 (if/else + JOptionPane) | | `HangedGameGUI.main(String[])` | Point d’entrée | 1 | **Conclusion :** Certaines méthodes GUI (`drawHangman`, `processGuess`) ont une complexité élevée (>9). Les autres fonctions sont simples et bien encapsulées. Une refactorisation pourrait améliorer la lisibilité et la maintenabilité. Le code est **fonctionnel et structuré**, avec quelques méthodes complexes qui pourraient bénéficier d’une simplification. La séparation logique (game logic, affichage, gestion du timer) est bien faite, ce qui facilite la maintenance et l’évolution.