From 94da5d2099fe2ae94212f8224e3efeae56936f6e Mon Sep 17 00:00:00 2001 From: Felix-Vimalaratnam Date: Wed, 8 Oct 2025 17:06:58 +0200 Subject: [PATCH] ajout timer --- out/fr/iut/Projet/Action.class | Bin 5912 -> 6330 bytes out/fr/iut/Projet/GameTimer$1.class | Bin 0 -> 1139 bytes out/fr/iut/Projet/GameTimer.class | Bin 0 -> 1148 bytes out/fr/iut/Projet/Random_word.class | Bin 4732 -> 4753 bytes src/fr/iut/Projet/Action.java | 151 +++++++++++++++------------- src/fr/iut/Projet/GameTimer.java | 68 +++++++++++++ 6 files changed, 150 insertions(+), 69 deletions(-) create mode 100644 out/fr/iut/Projet/GameTimer$1.class create mode 100644 out/fr/iut/Projet/GameTimer.class create mode 100644 src/fr/iut/Projet/GameTimer.java diff --git a/out/fr/iut/Projet/Action.class b/out/fr/iut/Projet/Action.class index 2f0fd2881f30f6852cd2a836fa963915aaf38fc3..2aee0676d9c38d403f2efe3c1fe79be8b549715a 100644 GIT binary patch delta 3596 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 B0=EDF delta 3077 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 literal 0 HcmV?d00001 diff --git a/out/fr/iut/Projet/GameTimer.class b/out/fr/iut/Projet/GameTimer.class new file mode 100644 index 0000000000000000000000000000000000000000..6f35b7dc5cea00c45bfb605fef24d96433914cbe GIT binary patch literal 1148 zcmX^0Z`VEs1_pBm2QCI71`SRIK?Y5B1}zQ-Z7v381|1Mzmz_Zm#L;JGFkoje$cfpY-eEI%D|?zg@KKI8v}>dZU)XsLFN~`8Mq>~wli>VXW-e&z`K!wfq{`h zmVtpmih+%RfkB#qg+YdalR=h2j6se;jzN*Zgh7LW5frRY>vS2Iz}E3XtlGlByN!Vl zVGJJwGXn#I4g)KLE&~sP9s?tTJcBe;s|o`nSSyDXSQkG+7Z(E)0|SE*13QB;10#b1 zT!%i?GJcq4Y(gyC7z7X+A=a5QurgRM@G)32Ffu4IC_$~0g<8i73W5!AkAgyvfx(u6 wkwKXOI@7FEDVecTnxet3=CXg76S+X0C|7kJpcdz literal 0 HcmV?d00001 diff --git a/out/fr/iut/Projet/Random_word.class b/out/fr/iut/Projet/Random_word.class index 5996aa7d06c0393a9fd316359bfa66fec5dbf41d..4c8f64cea36c1e1b5ac3c6e42b84b211fd4a48da 100644 GIT binary patch delta 667 zcmeyPGEsGd0uwVkgWF^Urq0Q0nEIGQ8Nw#pGT&p2-Yml+&&U`y*@iWYEt-en6hrjn z8LXEXqc`WUIk9p^GO#ePFfcHznY^95q+VHT3j?2w))odXnQaXG0tyQlI0O`yGq4K8 zhqf>=F8_Z+Yd3>HaaT?PXN3kE|5YX)Nm7X~v1Zw7OQPzEc8Xa;MB3(VIxC2!!CwQhSLn$4Cfef7;ZA;GCW|&V|c-k&+wX|kl`ys5yKyb zGDa4LOhze&3PxFmGDdlZaz+(~DzJNN7)1Ut7%;FiOn$^CClvmlL7ssV;&66`V0MP^ z$wK@pjNy~b`IVR>7$PUf@SlxoWng9KU{Gb~WYA#fWiV#wV{l}c$l%8?i6M$%GD9N6 zM22*R=?r-cGZ-ouW-(MV%wy zgMpDDiXnP(t3ZU#Y6cF5H4KIfYrzV|8JPYv2s5yPU1bXnIR=Iw46+Q23^5GRlQ{*| z88=Nf6x3qeJ~>9vl5x-EX@X(e2N^^d4lzhG9A=PZILM&Pa13k|9|QA01}?A>LO&Q- V85kLo7@{YO3#l-ko@^uJ004}ij0^w( delta 599 zcmbQJ`bTAh0@Gw=rcP#d2Diy;nEIGQ7(yr8GT&p2+APB&&&U`$*@iWYEsBTX6hqYH z8LXEXqc-QTIk9rOFfcQ)FfcG|n!KI6L|s#B3j>$THU@qHg#`?JT3ZW7x%z!El-(i{TtYHp5MZ9EJxB zxePBD@)%w-6fk^cC}jAB)MPn9 zb;ga8-2}B5w@oe-v}D{pd9`4e_5lVFhJy^!42KwG84fTgGaLmQ#mB(>kAVwpgwPKL WRt83fB!;NTIzlRprzQsqIRF5c;DY@C diff --git a/src/fr/iut/Projet/Action.java b/src/fr/iut/Projet/Action.java index bdcfb91..b0e79ba 100644 --- a/src/fr/iut/Projet/Action.java +++ b/src/fr/iut/Projet/Action.java @@ -6,42 +6,49 @@ import java.awt.*; /** * Classe principale qui gère l'interface graphique du jeu du pendu. * - * Cette classe crée la fenêtre du jeu, affiche : + * Cette classe crée la fenêtre du jeu et affiche : * - le mot caché avec les lettres devinées, * - les lettres incorrectes, * - le dessin du pendu (via {@link Affiche}), + * - le timer affiché en haut à droite (via {@link GameTimer}), * et permet à l'utilisateur de saisir des lettres. - * Elle gère également la logique de mise à jour, la fin de partie, - * le redémarrage et le changement de difficulté en utilisant {@link PlayButtonListener}. + * Elle gère également : + * - la logique de mise à jour de l'interface, + * - la fin de partie, + * - le redémarrage, + * - et le changement de difficulté en utilisant {@link PlayButtonListener}. */ public class Action { /** Fenêtre principale du jeu */ private JFrame gameFrame; - /** Label affichant le mot caché */ + /** Label affichant le mot caché avec les lettres découvertes */ private JLabel wordLabel; - /** Label affichant les lettres incorrectes */ + /** Label affichant les lettres incorrectes devinées par le joueur */ private JLabel incorrectLettersLabel; /** Champ de texte pour saisir une lettre */ private JTextField letterInputField; - /** Instance du jeu avec la logique (mot secret, lettres, vies, etc.) */ + /** Instance de la logique du jeu (mot secret, lettres, vies, etc.) */ private Random_word game; - /** Composant graphique qui dessine le pendu */ + /** Composant graphique représentant le pendu */ private Affiche affiche; - /** Niveau de difficulté courant ("facile", "moyen", "difficile") */ + /** Timer qui compte le temps écoulé depuis le début du mot */ + private GameTimer gameTimer; + + /** Niveau de difficulté courant ("facile", "moyen", "difficile", "hell") */ private String difficulty; /** - * Constructeur de la classe Action. - * Initialise le jeu avec la difficulté choisie, crée et dispose les composants. - * - * @param difficulty Niveau de difficulté pour le mot à deviner. + * Constructeur : initialise le jeu avec la difficulté choisie, + * crée les composants graphiques et démarre le timer. + * + * @param difficulty Niveau de difficulté pour le mot à deviner */ public Action(String difficulty) { this.difficulty = difficulty; @@ -56,7 +63,10 @@ public class Action { // Gestion de la saisie utilisateur letterInputField.addActionListener(e -> handleGuess()); - // Affiche la fenêtre + // Démarre le timer dès l'ouverture de la partie + gameTimer.start(); + + // Affiche la fenêtre du jeu gameFrame.setVisible(true); } @@ -64,17 +74,18 @@ public class Action { /** * Initialise tous les composants graphiques du jeu : - * - fenêtre principale - * - dessin du pendu - * - labels pour le mot et les lettres incorrectes - * - champ de saisie + * - fenêtre principale + * - dessin du pendu + * - labels pour le mot et les lettres incorrectes + * - champ de saisie + * - timer */ private void initializeComponents() { gameFrame = new JFrame("Hanging Man - " + difficulty); gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); gameFrame.setSize(700, 500); - // Composant graphique pour le pendu + // Composant graphique pour dessiner le pendu affiche = new Affiche(); affiche.setPreferredSize(new Dimension(350, 400)); affiche.setBackground(Color.WHITE); @@ -93,37 +104,54 @@ public class Action { // Champ pour saisir une lettre letterInputField = new JTextField(3); letterInputField.setFont(new Font("Arial", Font.PLAIN, 24)); + + // Création du timer + gameTimer = new GameTimer(); } // ==================== Mise en page ==================== /** - * Dispose tous les composants graphiques dans la fenêtre. - * Utilise un BorderLayout principal avec : - * - panneau gauche pour le dessin du pendu - * - panneau droit pour les interactions utilisateur + * Crée la mise en page principale avec un BorderLayout : + * - panneau gauche : dessin du pendu + * - panneau droit : mot, lettres incorrectes, champ de saisie, boutons et timer */ private void layoutComponents() { JPanel mainPanel = new JPanel(new BorderLayout()); + mainPanel.add(createLeftPanel(), BorderLayout.WEST); + mainPanel.add(createRightPanel(), BorderLayout.CENTER); + gameFrame.add(mainPanel); + } - // Panneau gauche : dessin du pendu + /** Crée le panneau gauche avec le dessin du pendu */ + private JPanel createLeftPanel() { JPanel leftPanel = new JPanel(new BorderLayout()); leftPanel.add(affiche, BorderLayout.CENTER); - mainPanel.add(leftPanel, BorderLayout.WEST); + return leftPanel; + } - // Panneau droit : interface du jeu (mot, lettres, saisie, boutons) + /** + * Crée le panneau droit avec tous les éléments : + * - mot caché + * - lettres incorrectes + * - champ de saisie + * - bouton restart + * - bouton changement de difficulté + * - timer en haut à droite + */ + private JPanel createRightPanel() { JPanel rightPanel = new JPanel(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.fill = GridBagConstraints.BOTH; gbc.insets = new Insets(5, 5, 5, 5); - // Label du mot caché + // Mot caché gbc.gridy = 0; gbc.weighty = 1.0; rightPanel.add(wordLabel, gbc); - // Label des lettres incorrectes + // Lettres incorrectes gbc.gridy = 1; rightPanel.add(incorrectLettersLabel, gbc); @@ -134,52 +162,50 @@ public class Action { inputRow.add(letterInputField); rightPanel.add(inputRow, gbc); - // Bouton de redémarrage + // Bouton restart gbc.gridy = 3; JButton restartButton = new JButton("Restart"); restartButton.addActionListener(e -> restartGame()); rightPanel.add(restartButton, gbc); - // Bouton pour changer la difficulté + // Bouton changement de difficulté gbc.gridy = 4; JButton changeDifficultyButton = new JButton("Changer la difficulté"); changeDifficultyButton.addActionListener(e -> showDifficultyDialog()); rightPanel.add(changeDifficultyButton, gbc); - mainPanel.add(rightPanel, BorderLayout.CENTER); + // Timer en haut à droite + gbc.gridy = 5; + gbc.anchor = GridBagConstraints.NORTHEAST; + rightPanel.add(gameTimer.getTimerLabel(), gbc); - // Ajout du panneau principal à la fenêtre - gameFrame.add(mainPanel); + return rightPanel; } - // ==================== Gestion du jeu ==================== + // ==================== Gestion des actions ==================== /** - * Traite la saisie d'une lettre par l'utilisateur. - * Met à jour l'état du jeu et l'affichage. + * Traite la saisie d'une lettre par le joueur : + * - vérifie la validité + * - met à jour le mot caché et lettres incorrectes + * - met à jour le pendu + * - termine la partie si nécessaire */ private void handleGuess() { String inputText = letterInputField.getText(); - letterInputField.setText(""); // efface le champ après saisie + letterInputField.setText(""); if (!isValidInput(inputText)) return; char guessedLetter = inputText.charAt(0); String message = game.guessLetter(guessedLetter); - // Mise à jour de l'interface updateUI(); - // Si la partie est terminée, affiche le résultat if (game.isGameOver()) endGame(message); } - /** - * Vérifie que l'utilisateur a saisi une seule lettre valide. - * - * @param inputText texte saisi - * @return true si la saisie est valide - */ + /** Vérifie que le texte saisi est une seule lettre */ private boolean isValidInput(String inputText) { if (inputText.length() != 1 || !Character.isLetter(inputText.charAt(0))) { JOptionPane.showMessageDialog(gameFrame, "Please enter a single letter!"); @@ -188,9 +214,7 @@ public class Action { return true; } - /** - * Met à jour l'affichage du mot caché, des lettres incorrectes et du dessin du pendu. - */ + /** Met à jour les labels et le dessin du pendu */ private void updateUI() { wordLabel.setText(game.getHiddenWord()); incorrectLettersLabel.setText("Incorrect letters: " + game.getIncorrectLetters()); @@ -198,12 +222,15 @@ public class Action { } /** - * Termine la partie et affiche le message de résultat. - * Désactive le champ de saisie. - * - * @param message message à afficher (victoire/défaite) + * Termine la partie : + * - arrête le timer + * - met à jour le dessin du pendu en cas de victoire/défaite + * - affiche le message de fin + * - désactive le champ de saisie */ private void endGame(String message) { + gameTimer.stop(); + if (game.isWon()) { affiche.setYouWin(true); } else { @@ -214,30 +241,20 @@ public class Action { letterInputField.setEditable(false); } - // ==================== Redémarrage ==================== - - /** - * Redémarre le jeu avec la même difficulté en utilisant PlayButtonListener. - */ + /** Redémarre le jeu avec la même difficulté en utilisant PlayButtonListener */ private void restartGame() { - gameFrame.dispose(); // ferme la fenêtre actuelle - - // Crée un JFrame temporaire pour utiliser PlayButtonListener + gameFrame.dispose(); JFrame tempFrame = new JFrame(); new PlayButtonListener(tempFrame, difficulty).actionPerformed(null); - // tempFrame ne sera jamais affiché, il sert juste à passer la référence } - // ==================== Changement de difficulté ==================== - /** - * Affiche une boîte de dialogue pour choisir une nouvelle difficulté - * et relance une partie avec cette difficulté en utilisant PlayButtonListener. + * Affiche une boîte de dialogue pour changer la difficulté, + * puis relance le jeu avec la nouvelle difficulté. */ private void showDifficultyDialog() { String[] options = {"Facile", "Moyen", "Difficile", "Hell"}; - // Boîte de dialogue avec trois options int choice = JOptionPane.showOptionDialog( gameFrame, "Choisissez la difficulté :", @@ -249,7 +266,6 @@ public class Action { options[0] ); - // Si l'utilisateur a choisi une option if (choice >= 0) { String newDifficulty; switch (choice) { @@ -270,10 +286,7 @@ public class Action { break; } - // Ferme la fenêtre actuelle gameFrame.dispose(); - - // Crée un JFrame temporaire pour utiliser PlayButtonListener JFrame tempFrame = new JFrame(); new PlayButtonListener(tempFrame, newDifficulty).actionPerformed(null); } diff --git a/src/fr/iut/Projet/GameTimer.java b/src/fr/iut/Projet/GameTimer.java new file mode 100644 index 0000000..d412290 --- /dev/null +++ b/src/fr/iut/Projet/GameTimer.java @@ -0,0 +1,68 @@ +package fr.iut.Projet; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +/** + * Classe GameTimer qui gère le temps écoulé sur un mot. + * + * Affiche le temps en secondes dans un JLabel et peut être intégré + * à la fenêtre du jeu. + */ +public class GameTimer { + + /** Label affichant le temps écoulé */ + private JLabel timerLabel; + + /** Timer Swing qui incrémente le temps chaque seconde */ + private Timer timer; + + /** Compteur de secondes écoulées */ + private int secondsElapsed; + + /** + * Constructeur : crée le label et initialise le timer. + */ + public GameTimer() { + this.secondsElapsed = 0; + this.timerLabel = new JLabel("Temps : 0 s"); + timerLabel.setHorizontalAlignment(SwingConstants.RIGHT); + + // Timer qui déclenche l'action toutes les 1000ms (1 seconde) + this.timer = new Timer(1000, new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + secondsElapsed++; + timerLabel.setText("Temps : " + secondsElapsed + " s"); + } + }); + } + + /** Démarre le timer */ + public void start() { + secondsElapsed = 0; + timer.start(); + } + + /** Arrête le timer */ + public void stop() { + timer.stop(); + } + + /** Remet le compteur à zéro */ + public void reset() { + secondsElapsed = 0; + timerLabel.setText("Temps : 0 s"); + } + + /** @return le JLabel contenant le temps écoulé */ + public JLabel getTimerLabel() { + return timerLabel; + } + + /** @return le temps écoulé en secondes */ + public int getSecondsElapsed() { + return secondsElapsed; + } +} \ No newline at end of file