forked from menault/TD3_DEV51_Qualite_Algo
		
	Compare commits
	
		
			3 Commits
		
	
	
		
			64108a95e9
			...
			4b7d0c7753
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 4b7d0c7753 | |||
| cc14043782 | |||
| d75f05bee0 | 
| @@ -17,7 +17,6 @@ import java.util.stream.Stream; | ||||
|  * - Si le fichier est introuvable ou vide, bascule sur une liste par défaut. | ||||
|  */ | ||||
| public class Words { | ||||
|  | ||||
|     /** Chemin du fichier de mots (relatif à la racine du projet). */ | ||||
|     private static final Path WORDS_PATH = Paths.get("Bibliotheque", "mots.txt"); | ||||
|  | ||||
| @@ -83,13 +82,13 @@ public class Words { | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     /* Retourne la liste complète des mots disponibles */ | ||||
|     /** Retourne la liste complète des mots disponibles */ | ||||
|     public static List<String> all() { | ||||
|         ensureLoaded(); | ||||
|         return new ArrayList<>(CACHE); | ||||
|     } | ||||
|  | ||||
|     /* Petit utilitaire pour afficher un mot masqué dans les messages */ | ||||
|     /** Petit utilitaire pour afficher un mot masqué dans les messages */ | ||||
|     public static String hiddenWord(Game g) { | ||||
|         return g.maskedWord().replace(' ', '_'); | ||||
|     } | ||||
|   | ||||
| @@ -10,16 +10,16 @@ import java.util.List; | ||||
|  | ||||
| /** | ||||
|  * Interface graphique du jeu du pendu avec gestion des difficultés. | ||||
|  * - Niveau Facile : mots de moins de 8 lettres | ||||
|  * - Niveau Moyen : mots de 8 lettres ou plus | ||||
|  * - Niveau Difficile : deux mots à deviner à la suite (un court + un long) | ||||
|  * - Niveau Facile : mots < 8 lettres | ||||
|  * - Niveau Moyen : mots ≥ 8 lettres | ||||
|  * - Niveau Difficile : deux mots à la suite (score & chrono cumulés) | ||||
|  * Toutes les méthodes ≤ 50 lignes. | ||||
|  */ | ||||
| public class GameUI { | ||||
|     private JFrame frame; | ||||
|     private JLabel imgLabel, wordLabel, triedLabel, scoreLabel, timeLabel; | ||||
|     private JTextField input; | ||||
|     private JButton tryBtn, quitBtn; | ||||
|     private JButton tryBtn, quitBtn, menuBtn, newGameBtn; | ||||
|  | ||||
|     private Game game; | ||||
|     private List<String> words; | ||||
| @@ -28,10 +28,11 @@ public class GameUI { | ||||
|     private String currentWord = ""; | ||||
|     private Timer timer; | ||||
|  | ||||
|     /** Constructeur : reçoit la difficulté (1, 2 ou 3) */ | ||||
|     public GameUI(int level) { | ||||
|         this.level = level; | ||||
|     } | ||||
|     // Cumul pour le niveau 3 | ||||
|     private long sessionStartNano = -1L; // début du niveau | ||||
|     private int sessionScore = 0; // score cumulé des mots terminés | ||||
|  | ||||
|     public GameUI(int level) { this.level = level; } | ||||
|  | ||||
|     /** Affiche la fenêtre et lance la partie (ou séquence) */ | ||||
|     public void show() { | ||||
| @@ -39,6 +40,7 @@ public class GameUI { | ||||
|         setupLayout(); | ||||
|         setupActions(); | ||||
|         prepareWords(); | ||||
|         sessionStartNano = System.nanoTime(); // CHRONO DE SESSION (lvl 3) | ||||
|         startRound(); | ||||
|         frame.setVisible(true); | ||||
|     } | ||||
| @@ -48,11 +50,11 @@ public class GameUI { | ||||
|         words = new ArrayList<String>(); | ||||
|         List<String> all = Words.all(); | ||||
|  | ||||
|         if (level == 1) { // mots courts | ||||
|         if (level == 1) { | ||||
|             for (String w : all) if (w.length() < 8) words.add(w); | ||||
|         } else if (level == 2) { // mots longs | ||||
|         } else if (level == 2) { | ||||
|             for (String w : all) if (w.length() >= 8) words.add(w); | ||||
|         } else if (level == 3) { // un court + un long | ||||
|         } else if (level == 3) { | ||||
|             String shortW = null, longW = null; | ||||
|             for (String w : all) { | ||||
|                 if (shortW == null && w.length() < 8) shortW = w; | ||||
| @@ -62,8 +64,7 @@ public class GameUI { | ||||
|             if (shortW != null) words.add(shortW); | ||||
|             if (longW != null) words.add(longW); | ||||
|         } | ||||
|  | ||||
|         if (words.isEmpty()) words.add(Words.random()); // fallback si rien | ||||
|         if (words.isEmpty()) words.add(Words.random()); | ||||
|     } | ||||
|  | ||||
|     /** Crée la fenêtre principale */ | ||||
| @@ -94,12 +95,20 @@ public class GameUI { | ||||
|         JPanel inputPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); | ||||
|         input = new JTextField(5); | ||||
|         tryBtn = new JButton("Essayer"); | ||||
|         quitBtn = new JButton("Quitter"); | ||||
|         newGameBtn = new JButton("Nouvelle partie"); | ||||
|         inputPanel.add(new JLabel("Lettre :")); | ||||
|         inputPanel.add(input); | ||||
|         inputPanel.add(tryBtn); | ||||
|  | ||||
|         JPanel actionPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); | ||||
|         menuBtn = new JButton("Menu"); | ||||
|         quitBtn = new JButton("Quitter"); | ||||
|         actionPanel.add(menuBtn); | ||||
|         actionPanel.add(quitBtn); | ||||
|  | ||||
|         bottom.add(inputPanel, BorderLayout.WEST); | ||||
|         bottom.add(quitBtn, BorderLayout.EAST); | ||||
|         bottom.add(actionPanel, BorderLayout.EAST); | ||||
|         top.add(newGameBtn, BorderLayout.EAST); | ||||
|         frame.add(bottom, BorderLayout.SOUTH); | ||||
|     } | ||||
|  | ||||
| @@ -117,13 +126,25 @@ public class GameUI { | ||||
|         tryBtn.addActionListener(this::onTry); | ||||
|         input.addActionListener(this::onTry); | ||||
|         quitBtn.addActionListener(e -> frame.dispose()); | ||||
|         menuBtn.addActionListener(e -> returnToMenu()); | ||||
|         timer = new Timer(1000, e -> refreshStatsOnly()); | ||||
|     } | ||||
|  | ||||
|     /** Démarre un nouveau mot (ou termine au niveau 3) */ | ||||
|     /** Retour au menu principal */ | ||||
|     private void returnToMenu() { | ||||
|         timer.stop(); | ||||
|         frame.dispose(); | ||||
|         MenuUI menu = new MenuUI(); | ||||
|         menu.show(); | ||||
|     } | ||||
|  | ||||
|     /** Démarre un nouveau mot (ou termine la séquence au niveau 3) */ | ||||
|     private void startRound() { | ||||
|         if (index >= words.size()) { | ||||
|             showMsg("Niveau terminé !"); | ||||
|             // Fin du niveau (affiche score cumulé si lvl 3) | ||||
|             int finalScore = (level == 3) ? sessionScore : game.getScore(); | ||||
|             long secs = (level == 3) ? getSessionSeconds() : game.getElapsedSeconds(); | ||||
|             showMsg("Niveau terminé !\nScore total : " + finalScore + "\nTemps : " + secs + "s"); | ||||
|             frame.dispose(); | ||||
|             return; | ||||
|         } | ||||
| @@ -151,20 +172,25 @@ public class GameUI { | ||||
|         checkEnd(); | ||||
|     } | ||||
|  | ||||
|     /** Vérifie la fin du mot et enchaîne si besoin (niveau 3) */ | ||||
|     /** Vérifie fin de mot et enchaîne si besoin (niveau 3 → cumule score & chrono) */ | ||||
|     private void checkEnd() { | ||||
|         if (!(game.isWin() || game.isLose())) return; | ||||
|  | ||||
|         timer.stop(); | ||||
|         game.end(game.isWin()); | ||||
|         game.end(game.isWin()); // applique bonus de fin pour ce mot | ||||
|         int displayScore = (level == 3) ? sessionScore + game.getScore() : game.getScore(); | ||||
|         long displaySecs = (level == 3) ? getSessionSeconds() : game.getElapsedSeconds(); | ||||
|  | ||||
|         String verdict = game.isWin() ? "Bravo !" : "Perdu !"; | ||||
|         String msg = verdict + " Le mot était : " + currentWord | ||||
|                 + "\nScore : " + game.getScore() | ||||
|                 + "\nTemps : " + game.getElapsedSeconds() + "s"; | ||||
|         showMsg(msg); | ||||
|         showMsg(verdict + " Le mot était : " + currentWord | ||||
|                 + "\nScore : " + displayScore | ||||
|                 + "\nTemps : " + displaySecs + "s"); | ||||
|  | ||||
|         if (level == 3 && index < words.size()) { | ||||
|             // CUMULE le score du mot terminé, poursuit SANS réinitialiser le chrono | ||||
|             sessionScore += game.getScore(); | ||||
|             startRound(); | ||||
|         } else { | ||||
|             timer.stop(); // fins niveaux 1/2, ou mot 2 du niveau 3 | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -177,14 +203,22 @@ public class GameUI { | ||||
|         frame.repaint(); | ||||
|     } | ||||
|  | ||||
|     /** Rafraîchit uniquement score + chrono */ | ||||
|     /** Rafraîchit uniquement score + chrono (cumul si niveau 3) */ | ||||
|     private void refreshStatsOnly() { | ||||
|         scoreLabel.setText("Score : " + game.getScore()); | ||||
|         timeLabel.setText("Temps : " + game.getElapsedSeconds() + "s"); | ||||
|         int s = (level == 3) ? sessionScore + game.getScore() : game.getScore(); | ||||
|         long t = (level == 3) ? getSessionSeconds() : game.getElapsedSeconds(); | ||||
|         scoreLabel.setText("Score : " + s); | ||||
|         timeLabel.setText("Temps : " + t + "s"); | ||||
|     } | ||||
|  | ||||
|     /** Durée écoulée depuis le début du niveau (niveau 3) */ | ||||
|     private long getSessionSeconds() { | ||||
|         long now = System.nanoTime(); | ||||
|         long delta = now - sessionStartNano; | ||||
|         if (delta < 0) delta = 0; | ||||
|         return delta / 1_000_000_000L; | ||||
|     } | ||||
|  | ||||
|     /** Affiche un message */ | ||||
|     private void showMsg(String msg) { | ||||
|         JOptionPane.showMessageDialog(frame, msg); | ||||
|     } | ||||
|     private void showMsg(String msg) { JOptionPane.showMessageDialog(frame, msg); } | ||||
| } | ||||
| @@ -3,7 +3,7 @@ package front; | ||||
| import javax.swing.*; | ||||
| import java.awt.*; | ||||
|  | ||||
| /* | ||||
| /** | ||||
| * Menu de démarrage du jeu du pendu. | ||||
| * Permet de choisir la difficulté (facile, moyen ou difficile). | ||||
| */ | ||||
| @@ -41,7 +41,7 @@ public class MenuUI { | ||||
|         frame.setVisible(true); | ||||
|     } | ||||
|  | ||||
|     /* Lance le jeu avec le niveau choisi */ | ||||
|     /** Lance le jeu avec le niveau choisi */ | ||||
|     private void startGame(int level) { | ||||
|         frame.dispose(); // ferme le menu | ||||
|         GameUI ui = new GameUI(level); | ||||
|   | ||||
							
								
								
									
										14
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								README.md
									
									
									
									
									
								
							| @@ -5,11 +5,15 @@ | ||||
|  | ||||
| ## Fonctionnalités | ||||
|   | ||||
| Affichage d’une **image différente du pendu** à chaque erreur   | ||||
| Lecture de mots depuis un **fichier externe** (`bibliothèque/mots.txt`)   | ||||
| Validation des entrées (une seule LETTRE à la fois)   | ||||
| Bouton **“Nouvelle partie”** pour rejouer sans relancer le programme   | ||||
| Messages de victoire / défaite | ||||
| - Affichage d’une **image différente du pendu** à chaque erreur   | ||||
| - Lecture de mots depuis un **fichier externe** (`bibliothèque/mots.txt`)   | ||||
| - Validation des entrées (une seule LETTRE à la fois)   | ||||
| - Bouton **“Nouvelle partie”** pour rejouer sans relancer le programme | ||||
| - Bouton **“Quitter”** pour quitter le programme | ||||
| - Bouton **“Menu”** pour retourner à la page menu et pouvoir rechoisir le niveau de difficulté | ||||
| - Messages de victoire / défaite | ||||
| - Score + Chronomètre en direct | ||||
| - Sélection du niveau dans le menu avant de jouer (Facile, Moyen, Difficile) | ||||
|  | ||||
| --- | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user