From 87909bbe35b4b3b54986b194afb2d4ddd10e6f46 Mon Sep 17 00:00:00 2001 From: dick Date: Wed, 8 Oct 2025 17:07:29 +0200 Subject: [PATCH 1/3] Logique de base + chrono + score --- src/Chronometre.java | 83 +++++++++++++++++++++++++++ src/Dessin.java | 122 ++++++++++++++++++++++------------------ src/Fenetre.java | 28 +++++---- src/MenuDifficulte.java | 75 ++++++++++++++++++++++++ src/Partie.java | 81 ++++++++------------------ src/Pendu.java | 121 ++++++++++++++++++++++++++++++++++++--- src/Score.java | 36 ++++++++++++ 7 files changed, 415 insertions(+), 131 deletions(-) create mode 100644 src/Chronometre.java create mode 100644 src/MenuDifficulte.java create mode 100644 src/Score.java diff --git a/src/Chronometre.java b/src/Chronometre.java new file mode 100644 index 0000000..609f020 --- /dev/null +++ b/src/Chronometre.java @@ -0,0 +1,83 @@ +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +/** + * Composant chronomètre (mm:ss) pour le jeu du pendu. + * - Démarre/stoppe/réinitialise le temps + * - S'affiche comme une barre en haut de la fenêtre + * + * @version 1.0 + * @author Adrien + * Date : 08-10-2025 + * Licence : + */ +public class Chronometre extends JPanel implements ActionListener { + + private final JLabel timeLabel = new JLabel("00:00", SwingConstants.CENTER); + private final Timer timer; // tick chaque seconde + private boolean running = false; + private long startMillis = 0L; + private long accumulatedMillis = 0L; + + public Chronometre() { + setLayout(new BorderLayout()); + setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8)); + timeLabel.setFont(new Font("Segoe UI", Font.BOLD, 20)); + add(timeLabel, BorderLayout.CENTER); + + // Timer Swing (1s) + timer = new Timer(1000, this); + } + + /** Démarre le chronomètre (ou reprend si en pause). */ + public void start() { + if (!running) { + running = true; + startMillis = System.currentTimeMillis(); + timer.start(); + repaint(); + } + } + + /** Met en pause le chronomètre. */ + public void stop() { + if (running) { + running = false; + accumulatedMillis += System.currentTimeMillis() - startMillis; + timer.stop(); + repaint(); + } + } + + /** Remet le chronomètre à 00:00 (sans le relancer). */ + public void reset() { + running = false; + startMillis = 0L; + accumulatedMillis = 0L; + timer.stop(); + updateLabel(0L); + } + + /** Temps écoulé total (en millisecondes). */ + public long getElapsedMillis() { + long now = System.currentTimeMillis(); + long runningMillis = running ? (now - startMillis) : 0L; + return accumulatedMillis + runningMillis; + } + + /** Tick du timer : met à jour l'affichage. */ + @Override + public void actionPerformed(ActionEvent actionEvent) { + updateLabel(getElapsedMillis()); + } + + // --- interne --- + private void updateLabel(long elapsedMillis) { + long totalSeconds = elapsedMillis / 1000; + long minutes = totalSeconds / 60; + long seconds = totalSeconds % 60; + timeLabel.setText(String.format("%02d:%02d", minutes, seconds)); + } +} diff --git a/src/Dessin.java b/src/Dessin.java index c90cfaf..27a8f12 100644 --- a/src/Dessin.java +++ b/src/Dessin.java @@ -2,87 +2,101 @@ import javax.swing.*; import java.awt.*; /** -* La classe Dessin gère uniquement le dessin du pendu +* La classe Dessin gère uniquement le dessin du pendu, +* avec révélation progressive en fonction du nombre d'erreurs (stage). * -* @version 1.0 -* @author Adrien +* @version 1.1 +* author Adrien * Date : 08-10-2025 -* Licence : */ public class Dessin extends JPanel { + /** Nombre d'étapes max pour le personnage (hors potence). */ + public static final int MAX_STAGE = 6; + + /** Étape actuelle (erreurs) : 0..6 */ + private int stage = 0; + // --- Constructeur --- public Dessin() { - // Taille préférée pour s'intégrer dans Fenetre setPreferredSize(new Dimension(600, 350)); setBackground(new Color(245, 245, 245)); } + /** Définit l'étape (nb d'erreurs) et redessine. */ + public void setStage(int newStage) { + int clamped = Math.max(0, Math.min(newStage, MAX_STAGE)); + if (clamped != this.stage) { + this.stage = clamped; + repaint(); + } + } + + public int getStage() { return stage; } + // --- Dessin principal --- @Override protected void paintComponent(Graphics graphics) { super.paintComponent(graphics); - // Anti-aliasing pour des traits plus doux - Graphics2D graphics2D = (Graphics2D) graphics.create(); - graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - graphics2D.setStroke(new BasicStroke(3f)); - graphics2D.setColor(Color.DARK_GRAY); + Graphics2D g2 = (Graphics2D) graphics.create(); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setStroke(new BasicStroke(3f)); + g2.setColor(Color.DARK_GRAY); // Repères et proportions int width = getWidth(); int height = getHeight(); - int marginPixels = Math.min(width, height) / 12; // marge proportionnelle + int margin = Math.min(width, height) / 12; - // Potence : socle - int baseYCoordinate = height - marginPixels; - graphics2D.drawLine(marginPixels, baseYCoordinate, width / 2, baseYCoordinate); - - // Montant vertical - int postXCoordinate = marginPixels + (width / 12); - graphics2D.drawLine(postXCoordinate, baseYCoordinate, postXCoordinate, marginPixels); - - // Traverse horizontale + // Potence (toujours affichée) + int baseY = height - margin; + g2.drawLine(margin, baseY, width / 2, baseY); // socle + int postX = margin + (width / 12); + g2.drawLine(postX, baseY, postX, margin); // montant int beamLength = width / 3; - graphics2D.drawLine(postXCoordinate, marginPixels, postXCoordinate + beamLength, marginPixels); + g2.drawLine(postX, margin, postX + beamLength, margin); // traverse + g2.drawLine(postX, margin + height / 10, postX + width / 12, margin); // renfort - // Renfort diagonal - graphics2D.drawLine(postXCoordinate, marginPixels + height / 10, postXCoordinate + width / 12, marginPixels); + // Corde (toujours) + int ropeX = postX + beamLength; + int ropeTopY = margin; + int ropeBottomY = margin + height / 12; + g2.drawLine(ropeX, ropeTopY, ropeX, ropeBottomY); - // Corde - int ropeXCoordinate = postXCoordinate + beamLength; - int ropeTopYCoordinate = marginPixels; - int ropeBottomYCoordinate = marginPixels + height / 12; - graphics2D.drawLine(ropeXCoordinate, ropeTopYCoordinate, ropeXCoordinate, ropeBottomYCoordinate); + // Géométrie du personnage + int headR = Math.min(width, height) / 16; + int headCX = ropeX; + int headCY = ropeBottomY + headR; + int bodyTopY = headCY + headR; + int bodyBottomY = bodyTopY + height / 6; + int armSpan = width / 10; + int shouldersY = bodyTopY + height / 24; + int legSpan = width / 12; - // Personnage : tête - int headRadiusPixels = Math.min(width, height) / 16; - int headCenterX = ropeXCoordinate; - int headCenterY = ropeBottomYCoordinate + headRadiusPixels; - graphics2D.drawOval(headCenterX - headRadiusPixels, headCenterY - headRadiusPixels, headRadiusPixels * 2, headRadiusPixels * 2); + // Étapes du personnage + if (stage >= 1) { // tête + g2.drawOval(headCX - headR, headCY - headR, headR * 2, headR * 2); + } + if (stage >= 2) { // corps + g2.drawLine(headCX, bodyTopY, headCX, bodyBottomY); + } + if (stage >= 3) { // bras gauche + g2.drawLine(headCX, shouldersY, headCX - armSpan, shouldersY + height / 20); + } + if (stage >= 4) { // bras droit + g2.drawLine(headCX, shouldersY, headCX + armSpan, shouldersY + height / 20); + } + if (stage >= 5) { // jambe gauche + g2.drawLine(headCX, bodyBottomY, headCX - legSpan, bodyBottomY + height / 8); + } + if (stage >= 6) { // jambe droite + g2.drawLine(headCX, bodyBottomY, headCX + legSpan, bodyBottomY + height / 8); + } - // Corps - int bodyTopYCoordinate = headCenterY + headRadiusPixels; - int bodyBottomYCoordinate = bodyTopYCoordinate + height / 6; - graphics2D.drawLine(headCenterX, bodyTopYCoordinate, headCenterX, bodyBottomYCoordinate); - - // Bras - int armSpanPixels = width / 10; - int shouldersYCoordinate = bodyTopYCoordinate + height / 24; - graphics2D.drawLine(headCenterX, shouldersYCoordinate, headCenterX - armSpanPixels, shouldersYCoordinate + height / 20); - graphics2D.drawLine(headCenterX, shouldersYCoordinate, headCenterX + armSpanPixels, shouldersYCoordinate + height / 20); - - // Jambes - int legSpanPixels = width / 12; - graphics2D.drawLine(headCenterX, bodyBottomYCoordinate, headCenterX - legSpanPixels, bodyBottomYCoordinate + height / 8); - graphics2D.drawLine(headCenterX, bodyBottomYCoordinate, headCenterX + legSpanPixels, bodyBottomYCoordinate + height / 8); - - graphics2D.dispose(); + g2.dispose(); } - // Affichage @Override - public String toString() { - return ""; - } + public String toString() { return ""; } } diff --git a/src/Fenetre.java b/src/Fenetre.java index a62c14e..dac077f 100644 --- a/src/Fenetre.java +++ b/src/Fenetre.java @@ -22,7 +22,9 @@ public class Fenetre { private JLabel wordLabel; private JTextField letterInput; private JButton sendButton; - private JPanel drawZone; // instance de Dessin + private JPanel drawZone; + private Chronometre chronometre; + private JLabel scoreLabel; // --- Constructeur --- public Fenetre() { @@ -32,6 +34,17 @@ public class Fenetre { root.setLayout(new BoxLayout(root, BoxLayout.Y_AXIS)); window.setContentPane(root); + // Barre supérieure : chrono + score + JPanel topBar = new JPanel(new BorderLayout()); + chronometre = new Chronometre(); + topBar.add(chronometre, BorderLayout.CENTER); + scoreLabel = new JLabel("Score : " + Score.BASE, SwingConstants.RIGHT); + scoreLabel.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 12)); + scoreLabel.setFont(new Font("Segoe UI", Font.BOLD, 16)); + topBar.add(scoreLabel, BorderLayout.EAST); + root.add(topBar); + chronometre.start(); // démarrage automatique + drawZone = new Dessin(); root.add(drawZone); @@ -84,15 +97,6 @@ public class Fenetre { public JButton getSendButton() { return sendButton; } public JLabel getWordLabel() { return wordLabel; } public JPanel getDrawZone() { return drawZone; } - - // --- Méthode principale de test --- - public static void main(String[] args) { - SwingUtilities.invokeLater(() -> { - Fenetre f = new Fenetre(); - // On passe le handler directement ici (pas de setOnLetterSubmitted) - new Event(f, ch -> - JOptionPane.showMessageDialog(f.getWindow(), "Lettre reçue : " + ch + " (sans logique de jeu)") - ); - }); - } + public Chronometre getChronometre() { return chronometre; } + public JLabel getScoreLabel() { return scoreLabel; } } \ No newline at end of file diff --git a/src/MenuDifficulte.java b/src/MenuDifficulte.java new file mode 100644 index 0000000..81af18c --- /dev/null +++ b/src/MenuDifficulte.java @@ -0,0 +1,75 @@ +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.function.Consumer; + +/** + * Fenêtre de sélection de la difficulté (Facile / Moyen / Difficile). + * Notifie le choix via un Consumer fourni au constructeur. + * + * @version 1.0 + * @author Adrien + * Date : 08-10-2025 + * Licence : + */ +public class MenuDifficulte implements ActionListener { + + private final JFrame frame; + private final Consumer onDifficultyChosen; + + /** Construit la fenêtre et prépare les boutons. */ + public MenuDifficulte(Consumer onDifficultyChosen) { + this.onDifficultyChosen = onDifficultyChosen; + + frame = new JFrame("Jeu du Pendu — Choix de difficulté"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(400, 250); + frame.setLocationRelativeTo(null); + frame.setLayout(new BorderLayout(0, 10)); + + JLabel title = new JLabel("Choisissez une difficulté", SwingConstants.CENTER); + title.setFont(new Font("Segoe UI", Font.BOLD, 18)); + title.setBorder(BorderFactory.createEmptyBorder(20, 10, 0, 10)); + frame.add(title, BorderLayout.NORTH); + + JPanel buttonsPanel = new JPanel(new GridLayout(1, 3, 10, 10)); + buttonsPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); + + JButton easyBtn = new JButton("Facile"); + JButton mediumBtn = new JButton("Moyen"); + JButton hardBtn = new JButton("Difficile"); + + easyBtn.setActionCommand("Facile"); + mediumBtn.setActionCommand("Moyen"); + hardBtn.setActionCommand("Difficile"); + + easyBtn.addActionListener(this); + mediumBtn.addActionListener(this); + hardBtn.addActionListener(this); + + buttonsPanel.add(easyBtn); + buttonsPanel.add(mediumBtn); + buttonsPanel.add(hardBtn); + frame.add(buttonsPanel, BorderLayout.CENTER); + } + + /** Affiche la fenêtre. */ + public void show() { frame.setVisible(true); } + + /** Ferme la fenêtre. */ + public void close() { frame.dispose(); } + + /** Accès optionnel au JFrame. */ + public JFrame getFrame() { return frame; } + + /** Réception des clics sur les boutons. */ + @Override + public void actionPerformed(ActionEvent actionEvent) { + String difficulty = actionEvent.getActionCommand(); // "Facile" | "Moyen" | "Difficile" + frame.dispose(); + if (onDifficultyChosen != null) { + onDifficultyChosen.accept(difficulty); + } + } +} diff --git a/src/Partie.java b/src/Partie.java index c96cdf5..05dbde9 100644 --- a/src/Partie.java +++ b/src/Partie.java @@ -1,15 +1,14 @@ - /** * La classe Partie * -* @version 0.1 +* @version 0.2 * @author Aurélien * Date : 08-10-25 * Licence : */ public class Partie { //Contantes - private static final byte REMAININGTRY = 11 ; + private static final byte REMAININGTRY = 6 ; private static final byte CARACTERCODESHIFT = 65 ; //Décalage ASCI > 'A' //Attributs @@ -25,25 +24,23 @@ public class Partie { this.wordsize = (byte) secretword.length ; this.foundletters = new boolean[wordsize] ; } - //Méthodes - public char[] getSecretWord() { - return this.secretword ; + + // Getters + public char[] getSecretWord() { return this.secretword ; } + public boolean[] getFoundLetters() { return this.foundletters ; } + public byte getRemainingTry() { return this.remainingtry ; } + + /** Représentation masquée du mot, ex: "_ _ A _ _" */ + public String getMaskedWord() { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < secretword.length; i++) { + sb.append(foundletters[i] ? secretword[i] : '_'); + if (i < secretword.length - 1) sb.append(' '); + } + return sb.toString(); } - public boolean[] getFoundLetters() { - return this.foundletters ; - } - - public byte getRemainingTry() { - return this.remainingtry ; - } - - - /** - * Vérifie l'état de la partie en cours. - * - * @return true si le jeu est fini. - */ + /** Vérifie l'état de la partie en cours. */ public boolean gameIsEnding() { if(this.remainingtry <= 0){ return true ; @@ -55,10 +52,9 @@ public class Partie { } /** - * Vérifie si la lettre reçu n'a pas déjà été joué puis, met à jour le tableau "entriesletters" et - * "foundletters" le cas échéant. - * - * @return true si la lettre était déjà présente. + * Vérifie si la lettre reçue a déjà été jouée puis met à jour + * entriesletters / foundletters / remainingtry. + * @return true si la lettre était déjà présente (doublon). */ public boolean isAlreadyEntries(char letter) { short caractercode = (short) letter ; //Récupération du code du caractère @@ -81,48 +77,21 @@ public class Partie { } } - private char[] generateSecretWord() { - char[] word = {'D','A','M','I','E','N'}; + char[] word = {'P','I','Z','Z','A'}; //À implémenter plus tard return word ; } private boolean wordIsFound() { - for(byte i = 0 ; i < this.wordsize ; i++){ //Parcours du "secretword" - if(!this.foundletters[i]){ //Si une lettre n'est pas trouvé + for(byte i = 0 ; i < this.wordsize ; i++){ + if(!this.foundletters[i]){ //Si une lettre n'est pas trouvée return false ; } } return true ; } - - //Affichage - public String toString() { - return "" ; - } - - //Tests - public static void main(String[] args){ - char[] test = {'E','O','M','I','E','D','A','Z','N'}; - byte size = (byte) test.length ; - boolean status ; - - Partie game = new Partie(); - System.out.println("Trick > " + String.valueOf(game.secretword) + "\n"); - for(byte i = 0 ; i < size && !game.gameIsEnding() ; i++){ - System.out.println("Essais restants : " + game.getRemainingTry()); - status = game.isAlreadyEntries(test[i]); - for(byte l = 0 ; l < game.wordsize ; l++){ //Parcours du "secretword" - if(game.foundletters[l] == true){ - System.out.print(game.getSecretWord()[l] + " "); - }else{ - System.out.print("_ "); - } - } - System.out.println(""); //Lisibilité - //System.out.println("Lettres : " + game.entriesletters); - } - } + @Override + public String toString() { return "" ; } } diff --git a/src/Pendu.java b/src/Pendu.java index e478d9c..dcdcddc 100644 --- a/src/Pendu.java +++ b/src/Pendu.java @@ -1,14 +1,117 @@ +import javax.swing.*; +import java.util.function.Consumer; /** -* La classe Pendu -* -* @version -* @author -* Date : -* Licence : -*/ + * Point d'entrée : affiche le menu de difficulté puis lance la fenêtre du jeu. + * Lie Fenetre (vue) et Partie (logique) via un handler. + * Met à jour le dessin du pendu à chaque erreur. + * + * @version 1.3 + * author Adrien + * Date : 08-10-2025 + * Licence : + */ public class Pendu { - public static void main(String[] args){ - } + public static void main(String[] args) { + SwingUtilities.invokeLater(() -> { + MenuDifficulte menu = new MenuDifficulte(difficulty -> openGameWindow(difficulty)); + menu.show(); + }); + } + + /** Ouvre la fenêtre du jeu, crée la Partie et branche les événements. */ + private static void openGameWindow(String difficulty) { + Fenetre fenetre = new Fenetre(); + fenetre.getWindow().setTitle("Jeu du Pendu — " + difficulty); + + Partie partie = new Partie(); + + // Affichage initial du mot masqué (via Partie) + fenetre.getWordLabel().setText(partie.getMaskedWord()); + + // Stage initial (0 erreur) + if (fenetre.getDrawZone() instanceof Dessin) { + ((Dessin) fenetre.getDrawZone()).setStage(0); + } + + // Handler : applique Partie puis met à jour l'UI (mot + dessin) + Consumer handler = new GameLetterHandler(fenetre, partie); + + // Branchement des événements clavier/bouton + new Event(fenetre, handler); + } + + /** + * Handler de lettres : + * - applique Partie.isAlreadyEntries + * - met à jour le mot affiché (Partie#getMaskedWord) + * - calcule le stage = MAX_STAGE - remainingTry et met à jour le Dessin + * - gère la fin de partie + */ + private static class GameLetterHandler implements Consumer { + private final Fenetre fenetre; + private final Partie partie; + private final Dessin dessinPanel; + + GameLetterHandler(Fenetre fenetre, Partie partie) { + this.fenetre = fenetre; + this.partie = partie; + this.dessinPanel = (fenetre.getDrawZone() instanceof Dessin) + ? (Dessin) fenetre.getDrawZone() : null; + } + + @Override + public void accept(Character ch) { + boolean alreadyPlayed = partie.isAlreadyEntries(ch); + + // Mise à jour du mot + fenetre.getWordLabel().setText(partie.getMaskedWord()); + + // Erreurs -> stage pour le dessin + if (dessinPanel != null) { + int stage = Dessin.MAX_STAGE - partie.getRemainingTry(); + dessinPanel.setStage(stage); + } + + // Mise à jour du score courant (erreurs + temps actuel) + long elapsed = (fenetre.getChronometre() != null) + ? fenetre.getChronometre().getElapsedMillis() : 0L; + int errors = Dessin.MAX_STAGE - partie.getRemainingTry(); + int score = Score.compute(errors, elapsed); + if (fenetre.getScoreLabel() != null) { + fenetre.getScoreLabel().setText("Score : " + score); + } + + if (alreadyPlayed) { + JOptionPane.showMessageDialog(fenetre.getWindow(), + "Lettre déjà jouée : " + ch + "\nEssais restants : " + partie.getRemainingTry()); + } + + // Fin de partie + if (partie.gameIsEnding()) { + // Stoppe le chronomètre pour figer le temps + if (fenetre.getChronometre() != null) { + fenetre.getChronometre().stop(); + } + // Score final recalculé (au cas où une seconde vient de passer) + long finalElapsed = (fenetre.getChronometre() != null) + ? fenetre.getChronometre().getElapsedMillis() : elapsed; + int finalErrors = Dessin.MAX_STAGE - partie.getRemainingTry(); + int finalScore = Score.compute(finalErrors, finalElapsed); + + boolean win = !fenetre.getWordLabel().getText().contains("_"); + String msg = (win + ? "Bravo ! Mot trouvé : " + : "Perdu ! Le mot était : ") + + String.valueOf(partie.getSecretWord()) + + "\nScore : " + finalScore; + + JOptionPane.showMessageDialog(fenetre.getWindow(), msg); + + fenetre.getLetterInput().setEnabled(false); + fenetre.getSendButton().setEnabled(false); + } + } + } } diff --git a/src/Score.java b/src/Score.java new file mode 100644 index 0000000..2bed1b3 --- /dev/null +++ b/src/Score.java @@ -0,0 +1,36 @@ +/** + * Calcule le score du pendu à partir du nombre d'erreurs et du temps écoulé. + * + * Formule (simple et configurable) : + * score = max(0, BASE - erreurs * ERROR_PENALTY - secondes * TIME_PENALTY_PER_SEC) + * + * @version 1.0 + * @author Adrien + * Date : 08-10-2025 + * Licence : + */ +public final class Score { + + /** Score de départ. */ + public static final int BASE = 1000; + + /** Malus par erreur. (6 erreurs max par défaut) */ + public static final int ERROR_PENALTY = 120; + + /** Malus par seconde écoulée. */ + public static final double TIME_PENALTY_PER_SEC = 1.0; + + private Score() {} + + /** + * - nombre d'erreurs (>=0) + * - temps écoulé en millisecondes + * - score >= 0 + */ + public static int compute(int errors, long elapsedMillis) { + if (errors < 0) errors = 0; + double timePenalty = (elapsedMillis / 1000.0) * TIME_PENALTY_PER_SEC; + int value = (int)Math.round(BASE - errors * ERROR_PENALTY - timePenalty); + return Math.max(0, value); + } +} From 584e8dc3c6ec57ce79290d01a01816779182f3d0 Mon Sep 17 00:00:00 2001 From: dick Date: Wed, 8 Oct 2025 17:55:54 +0200 Subject: [PATCH 2/3] Final --- Makefile | 27 ++++++++++++++-- bin/Chronometre.class | Bin 0 -> 2222 bytes bin/Dessin.class | Bin 0 -> 2225 bytes bin/Event.class | Bin 0 -> 2388 bytes bin/Fenetre.class | Bin 0 -> 3216 bytes bin/LetterInputFilter.class | Bin 0 -> 951 bytes bin/MenuDifficulte.class | Bin 0 -> 2565 bytes bin/Mots.class | Bin 0 -> 1225 bytes bin/Partie.class | Bin 0 -> 2868 bytes bin/Pendu$GameLetterHandler.class | Bin 0 -> 3418 bytes bin/Pendu.class | Bin 0 -> 2729 bytes bin/Score.class | Bin 0 -> 531 bytes src/Partie.java | 2 +- src/Pendu.java | 52 ++++++++++++++++++++---------- 14 files changed, 60 insertions(+), 21 deletions(-) create mode 100644 bin/Chronometre.class create mode 100644 bin/Dessin.class create mode 100644 bin/Event.class create mode 100644 bin/Fenetre.class create mode 100644 bin/LetterInputFilter.class create mode 100644 bin/MenuDifficulte.class create mode 100644 bin/Mots.class create mode 100644 bin/Partie.class create mode 100644 bin/Pendu$GameLetterHandler.class create mode 100644 bin/Pendu.class create mode 100644 bin/Score.class diff --git a/Makefile b/Makefile index 8833e5c..f6b0108 100644 --- a/Makefile +++ b/Makefile @@ -15,16 +15,22 @@ JCFLAGS = -encoding UTF-8 -implicit:none -cp $(OUT) -d $(OUT) CLASSFILES = Pendu.class \ Partie.class \ Fenetre.class \ - Dessin.class + Dessin.class \ + Mots.class \ + Event.class \ + LetterInputFilter.class \ + MenuDifficulte.class \ + Chronometre.class \ + Score.class # Dépendances -$(OUT)Pendu.class : $(IN)Pendu.java $(OUT)Partie.class $(OUT)Fenetre.class +$(OUT)Pendu.class : $(IN)Pendu.java $(OUT)Partie.class $(OUT)Fenetre.class $(OUT)Event.class $(OUT)MenuDifficulte.class $(OUT)Score.class $(JC) $(JCFLAGS) $< $(OUT)Partie.class : $(IN)Partie.java $(OUT)Mots.class $(JC) $(JCFLAGS) $< -$(OUT)Fenetre.class : $(IN)Fenetre.java $(OUT)Partie.class $(OUT)Dessin.class +$(OUT)Fenetre.class : $(IN)Fenetre.java $(OUT)Partie.class $(OUT)Dessin.class $(OUT)Chronometre.class $(OUT)Score.class $(JC) $(JCFLAGS) $< $(OUT)Dessin.class : $(IN)Dessin.java @@ -33,6 +39,21 @@ $(OUT)Dessin.class : $(IN)Dessin.java $(OUT)Mots.class : $(IN)Mots.java $(JC) $(JCFLAGS) $< +$(OUT)Event.class : $(IN)Event.java $(OUT)Fenetre.class $(OUT)LetterInputFilter.class + $(JC) $(JCFLAGS) $< + +$(OUT)LetterInputFilter.class : $(IN)LetterInputFilter.java $(OUT)Fenetre.class + $(JC) $(JCFLAGS) $< + +$(OUT)MenuDifficulte.class : $(IN)MenuDifficulte.java + $(JC) $(JCFLAGS) $< + +$(OUT)Chronometre.class : $(IN)Chronometre.java + $(JC) $(JCFLAGS) $< + +$(OUT)Score.class : $(IN)Score.java + $(JC) $(JCFLAGS) $< + # Commandes Pendu : $(OUT)Pendu.class diff --git a/bin/Chronometre.class b/bin/Chronometre.class new file mode 100644 index 0000000000000000000000000000000000000000..4871647ba82c6ef12c1245550db05ccf5a866fa4 GIT binary patch literal 2222 zcmX^0Z`VEs1_pD67A^)224{8#7Y+tjb_O>t1||k~P6l-b4-nxABD_F^H#>t57XufA zGZ%w8gD)3@AA>)L6~N9A$iWcA#lX)H4AL6H!4L`(4`XKt=VB0Lhydx0KaSdy9o6KAu@%*!mXV`N~~ z&l`MT#}fa?VDHt6=x|f$uD4J zU@b~5PAy?%5J*ogam`6AC`Q=8tfA?}$iSbNT#}ie7m!+%mS2>cn!?B+uL1Uieqwov zerj22UWvXVScxl$Z4Gh^cWFUNVhJorSTwvqf?UD*rA5i9ZkZrg2{>mI<>%$+rj`_? z>VZOxhryV^gpolA#6}H0Mg~>`11kdqMg}Ql$zV_bJLl&Wmn7zu6oa&9^Dt;JX!9`W zG3fI!7%&*}Fc>iyGBSvQbb%e~lwXvRTI7>hnO|DM!;r&}%g&I;!;sHVz{60;P{hc< z3s>oupI5@jz!999o}a1^>IpKvn1`W+p_Gw<%{eu%B(;c#p^TxNkwFlo1?FCGbb{1Y z@G$5w=(00Z@-S2}*zhozGnnu&RD%dh5Mj^Yz{6n8V8h73scK-9Vg(`?83aH^>E|To zrR)1AWu+#Uurt)~Fw`>Cu`|^3Ff=eU@-Q?pG&3@ABLy9LfCVJxffAuC*eLY)@yRSM zNzF?wVq_45#vs_T;F6-uymV_%P#kdI(^C_ia$wq$!119EQDV)=0J0sz zVPuel*p6K($f@EG1&{!P`2p++_TtnMNCXN&)quPJ5&^rMIWZ-LkwFtl$~ix`AU`iP zuf!VcJcyByH~{NV*6@T#fXqQo@vsmDt3ryu;L75X)Lc+Nlol1G=9PdF1}xvQ7o`>? zW`dFzA1DYRmigp^GCzA+VoqtQe;Ol$u!a{Ts1VZDC@BQuVMYcvP^L^QVPvp``Ug2m zqam&a3&FgDBm^-7RQwdDmV~5MlrS=gVlhQCj6sn>ok4?vkwKGzl|cxU$ruo_5Fi0@4FbFXS zF^DjTGl(+CFo-cIGDtG$Fi0_2Ge|S|F~~4PFvv5cGbk`Hf^sX=)gcVbU{}j)ZDC-a z#UQ1{0&?mO1__X3w=jrrW02I^#vlcVtl)NefUIX=V32`Wf(UV_>73gbWI$el zgd4;w77VNmmJD1BRt)?M)(m0{HVo1XwhWA*(hKSXZw3|yP)#YjgF(Up;tL*7cyXjI zXJFxU(%QnnshGGHoG?Jq!N=_)OT4EX488{gj7)<3w802!D6h#;m za?M#mRG~RLIH@SH?qyJpWENxH!JrZx$s)!MqIWQ;ZevhGcwG$aAwLE-27d-#h5!Z; RhCl`rh9Cw;21l?zoB)r!=SKhl literal 0 HcmV?d00001 diff --git a/bin/Dessin.class b/bin/Dessin.class new file mode 100644 index 0000000000000000000000000000000000000000..60bf7458d809182acca9c9d62d7cd1ebe553460a GIT binary patch literal 2225 zcmX^0Z`VEs1_pD6DlP_j22)N3P6jh}26HY3W(Er`22KV`b_Odh1~vw35XXj{!Iq1` zj=>&8IDkYPLAso{7z`Mk*%@3o8C)6MK!iIN13!ZYJA)^Sg98Ht7lSZ^7f8gLlYx!F z2gLFPY4!sV{vd7uhzJA`K^zRh>5%Iwxj_$6E42+(P47|?ydBr7(c_m?q zIi;!03=9lxj0~*BC5h>&j0|ixnR%Hdc8mEi4+IAf>#)C5g$|zKI1e73pvl%o>`Wj0}7QiJ5sN&iT0o`FW{% zC5#MW8a`QxWr_NU zfuzHD7{VDM7#aBB($4ug`9&b9NFIhLhG<3xHi(Jr3^670#>XF8c^HZrba@y`Ktw4+84p7_h^SytV`N}}`ldp^xI8m2UEeDpF)uZT zkwFk{Hp~r-46GWS;5ZQ|PAv&2N=-{GDoRZW&a6shWDrLRbaY)L zDKR-ay(qslFNKjo7)c8_oWRN9;@%@OucVlfLBQKJGTzZI#M9Bo(=pi7&z+s2 zl97SgJGGLLfyXm1FSW=yC$YFVwV07X7LrmxMx&ad;+75}8H)Z`LtMg~yOp%}r)V1yJ7C{o2>(=kl}g({1N8;Ifr=NC}4gAz1EDae(O zqyP?3P8Y`@?|Anh$4Ev70fY)jh(mH5n9az*k)B!-o|ys)bk6kD5|7l(^o$Zl29A`X z#BxwhWn^Fn#U(fifCc@_5_1?C*i$l#3-XIo85yK;gf++?42le#4Dt*N3``7?3EDtl`ONg0NV}*t{n{AwlZ2<7?|cW@My_^?A*q{12U3{ z0b!&J12=;#gD`^}g9L*-gA9WrgEpwNV_^KlAj8PO$e_cZ3pHMr0mNruUqSPxhj ztiX&@l+}z&lvR`kY!>j6suufkA_Tl|hSvmqD9BoI!^{g+Z4=o56s=fWeT# zjKPS(k-?O~gTag;l);=Kj=_QSY#^+klpKQyG{TjKSI0gdv>))Pi7SNM&$kNMqpy E07wYG^Z)<= literal 0 HcmV?d00001 diff --git a/bin/Event.class b/bin/Event.class new file mode 100644 index 0000000000000000000000000000000000000000..d5dec5b46fe00994bdd1c4a7533353a8726dedce GIT binary patch literal 2388 zcmX^0Z`VEs1_pD64lV{61|v=eX$E5uVZy~A&0xyKV8&n$A}qKVEE%l081xvd*cq(3 z7&sYhKpa~TVaLUw&tMNC95@&pK_X5djxz^?3y5|F>38E`aOYz1VDJQqcyTd!Gx%^b z_%iqjF)%O$u`>j-GlZ}+gfcR)m1pLqBKzVT=qc&iN^+ zj12rfnR%&xrMXF|MInhvIjM{c4#XLP%Q+ykxymz(QeDeZ^Gb>t8JIOdLi~wfp9iEC zrR5jpf&xZf1LDTS@)G@2kXn65uoAF7Ymgq^;F84TY~REJu*=vP!q^$Y85y{O^Gl18 zQ{6H_j^zTY)&m7G4}%JW77v3QgFFv|0)rwCgC>I(J3|ByLnK2K4?{FV3_C+C4?`S7 zJR^f3B$hn$3Q9}dGIL5&i$Izaco-5Hl6V-B8B%x{Qb9x-Lkc4U0}n$wLk15+CPNk@ z18cOSZd5D}LpDPW4?`|P9wUQ#SZZlzPEKl-LTX+~QEHJwX11s2{j0^%GpX!6tfPYd}YH|r9gDhAGJrsR1i%U}TQi~WF z#6a>D`o-m$dFlFIA*mH5Zkee$DJW(ImlS2@r86?HL(?)N17CV-2~sFAGDvA?g5wL* zBx^%^9gGZ^X%0ymY#@7jY6&Qe7#T#Met?8FB!sLP8CXh+GIJRj zxJ&Xw3kp(;oD+*v85!7%VY);i4nolcatd2cYF>It1~@x-GBU8|CYB^;q!u$WVAT-C z$iSJNS`rQ|W5l3NfqT=fC@~jQ;E1Dyrhfsba0y7vOJ!sbEY8R;_f0J>PE1dA$xO`2 zPX`wdAocp7wBnqfTacfZnpa{Cj#Y?zAxR1x4s6L8iA9bjj0`Lqo|?|kc!Q{d7e0&( z>}82LrK$dDj0_SQ&XDwhrpB6)K^kl+_M(W9fh{pPIklh!Eg;}7;bN#`sAptQ0HwvE zRE6UF(%j7AR0WNKoW$hRjQpIG)FMp{RFcyyV1^@XV47P!U^_2rhxt zu*C_Ix1n*%&d>nLZ7qxpDqt6bb6I9yS$=k^K12z`bhpIhlKi4dc7`@a1~#Ak{Or;K zMg|_wyu8#R=bXgiVoTj1002ObkMxl9z#j zK?qd%GB7eIF)%PNF(@-IGcYo!FsL#xF{m*xFjzA%F)%YQFbHdHXJFLQ-patFrL&cR zS!){u%SHwU21W*T1_lN(237_J22lnU1~CRs25|;H1_=fs21%%q8VpRJqMd;eY+x`0 z3)nz)tt|{p+Zb4VAT*n=j@C8?c5SU~3>@0K88{=gw=-~UW8g+uBE`VQz`!8Oz`-EL zAi$u=Aj+V`AjP1{pvIuaz{sG@paZpFGXpaN3j+f~GQ?n3U!83XJlhy}w=wYf=?L*} zV-V2Y#vsVDfPqI>NN5{_@GJ%ah)NM5(H#t88@0ADFdt(O2T{7r+Ze=mFi7lVkYr+5 z&L9j`r@MCSfW*IUxGcYi4F)%VTGPE)@F-S7_ RGcYi4FfcL%FfcL%0sxBrd`JKQ literal 0 HcmV?d00001 diff --git a/bin/Fenetre.class b/bin/Fenetre.class new file mode 100644 index 0000000000000000000000000000000000000000..bc940530244fd9f23b10d564b8cf7b0725e12284 GIT binary patch literal 3216 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 I66{VX0C~^X`v3p{ literal 0 HcmV?d00001 diff --git a/bin/MenuDifficulte.class b/bin/MenuDifficulte.class new file mode 100644 index 0000000000000000000000000000000000000000..c6d76f095dfbdd124aecdff6611f05a992b955ec GIT binary patch literal 2565 zcmX^0Z`VEs1_pD6say;?3@)4u+6=Dj3~n3@?pzGa3?3l9Cy3<*BD_I_4?BY|7XufA zABf}6&Je)C5XjCD#KpkN5X{aH!od*A#URKK2I7ZvF+?y#f>==;4ACIS z3{nj7Tnv&72_PbhogtBfA&HAYj=_V2A(?|A1;k7R5osX#bPk3LkmgJfk;TQ3&5*;* zkjs$A&XCW}P{7Vm$jHE&R+N~V%E%z%la*MOSfO8Bo|%`f@8t#(wPs`x%FlDjOiRm5 zF3l;abk4{xPR(OvkOiyNFD=Q;(N8PQOD@UG&(n9#&nqs?O)au!WZ(?WOwUU!DJ@E6 zWH7|1)&?S(lbDyTA6!zDnU`*DXU)jKW|NthSz^b?pr8R!fWs!uFh&Lz=lqmZMh1SL z%)C^;(%hufqL9R-oK!{z6TEt{+6*?YI3vHDk%3tQ#9>X&$uCZ2WZ+0oEdhrJBZHWR zCfH3FA;q5v4u^o$qO|;?+|(3C26?Cp63a{UQ_E8GO7tDUN?bu~YmoW8!6k{w*}jPd zU^lZf6frVz1?QI*C8xS&g8U%to0?Y&5C2p>P!#bnm@ruJFc>fxGBOB(1W;YV$e`+# zTB?vzst}Nxmr|hDU{}+ zSjNa81u_%n(qK>;1ErUe#JrMXkij*K47?x}U|Zet^GX;QID%8t^HUW(*IU!MynUl)H(7{m5!_djl1+uoAk%7%QHLoPK zh=-wvp_hlDkHLzap`V9g0>eahhDkgOlNqKkGVq~BA|rzU*j3;}@1K;Fnq0!jAPW`( z1vzp;@yRSMNzF?wLeT=rCyWfD(9{Js2OXw*Xl3!HG$RLY7_nQVEe_WKh)b^z`&Z&9+J4l&ud@ z0xGhKQ%fKmMg}>Er7#;%m4X70IWZ-LkwFup44h;Ufdeia^ud0DL@wCL><}k}F)|1g zr=>83fWX+$;hu1|dF$CO<|7X;9SQs2CU-*bpEI6?Go2ChhE0j})~+}jvh9X7&E+LFk$$}V9M}=!HkiK!5kVj77UCGmJC)5jG%~N zP-I|YU}Ru`gfh!E26cq<*uWAXh1PK83Ji>3QE=pJW6(fXZOg#OV8Z|+%@`OMWTC2A zLB8Jr_cz2~2L?t4I|h5GJ3<(k7?>Ft8056KF=+aN)Nf-WEs2|92giFI2aiJFvzkqI5IFYIDwO+GXR63 Bh$R33 literal 0 HcmV?d00001 diff --git a/bin/Mots.class b/bin/Mots.class new file mode 100644 index 0000000000000000000000000000000000000000..90a75e026365ea6492b3e02329850706abe4ee93 GIT binary patch literal 1225 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 literal 0 HcmV?d00001 diff --git a/bin/Pendu.class b/bin/Pendu.class new file mode 100644 index 0000000000000000000000000000000000000000..4b259481131247f546af14eb5d10030ad2cf6e75 GIT binary patch literal 2729 zcmX^0Z`VEs1_pD6xm*lN4CX=%3=B4047Ln*>H4kK6cxGNo zemNt9s0Mb0yul@j$=SY%1yFodX9YWikwE}qw0}}oYH|r915>m!h=}51 z=w;{wC9{4;2IittaH2qtsG!okJW!gkW@L~8nNp!&T%HL^EFdzpBr_+oBombKxHI$0 z^0QNY5=%hIQXDzCz>NTb1?7ayy!4QwN^oX&0%t*JYPE*t zD6o1>4Ij8T$ZPtgC7C(;X{C9|C7Jno`k){x%}p%==WE{d)RN%T4S(BWcT2R8sAP>`w!w-xM3eafAp#T(sEX5i5V)NTfr$n6ZQKHA$D z*tB*rurn}hW8m1$z!|xnfy-BW8w0n_4hEiW47}Rg82An{@Xuu61F;S;@H1~?5YXAi zAZWLnK`2sNM|L}duocU029Zc@NtW#lqTwJnFoB({#lXeDz#z%M!63yT${@oa%OKC7 z!Jx!o#GuSz%b?ES#Gu9C$Dqp)$)Lxe%fP_E&A|AV!IqtYg`I(ufeTatLLI$_ff?** zAFXW+Vjx1?cQ=DXFz|LUE&LF|az!1vLAn~7p5nY@KBrE)jfmMJD zR4zb$V#L4rui6{85kIZ71{1KiOc~4=7#LU>7#V~ZRKSKYF$ggzGAJ`}F-&Ec#W0OQ klEH$3fkB3WnZc5QnZb&|n!$>}k%5uH3CxdVh+>Ea06TtB(Toz{0@Jz`(%FAj!bNz{$YKz{SA8z{J4K zAj!ak#OGy@WZ+}qhsz5vFflNJ+{M7iAi}`FAj`nWz{tSBz^b*KfpH@PC}2bx7#P^V zg5nIE3}Ou8P^BRZEDUT63=Ha0a~N2et>wE!7?|?;v%LhFUq}g5WTdofrte^2?J#3y u7G>SRz_teL9*|)|3@i)`4Dt+Y3 'A' //Attributs diff --git a/src/Pendu.java b/src/Pendu.java index dcdcddc..cfebb1d 100644 --- a/src/Pendu.java +++ b/src/Pendu.java @@ -6,7 +6,7 @@ import java.util.function.Consumer; * Lie Fenetre (vue) et Partie (logique) via un handler. * Met à jour le dessin du pendu à chaque erreur. * - * @version 1.3 + * @version 1.4 * author Adrien * Date : 08-10-2025 * Licence : @@ -27,36 +27,54 @@ public class Pendu { Partie partie = new Partie(); - // Affichage initial du mot masqué (via Partie) - fenetre.getWordLabel().setText(partie.getMaskedWord()); + // Affichage initial du mot masqué (construit ici) + fenetre.getWordLabel().setText(buildMaskedWord(partie)); // Stage initial (0 erreur) if (fenetre.getDrawZone() instanceof Dessin) { ((Dessin) fenetre.getDrawZone()).setStage(0); } - // Handler : applique Partie puis met à jour l'UI (mot + dessin) - Consumer handler = new GameLetterHandler(fenetre, partie); + // On mémorise les essais initiaux pour calculer les erreurs = initialTries - remainingTry + final int initialTries = partie.getRemainingTry(); + + // Handler : applique Partie puis met à jour l'UI (mot + dessin + score) + Consumer handler = new GameLetterHandler(fenetre, partie, initialTries); // Branchement des événements clavier/bouton new Event(fenetre, handler); } + /** Construit la chaîne "_ _ A _ _" à partir de l'état de Partie (sans modifier Partie). */ + private static String buildMaskedWord(Partie partie) { + char[] word = partie.getSecretWord(); + boolean[] found = partie.getFoundLetters(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < word.length; i++) { + sb.append(found[i] ? word[i] : '_'); + if (i < word.length - 1) sb.append(' '); + } + return sb.toString(); + } + /** * Handler de lettres : * - applique Partie.isAlreadyEntries - * - met à jour le mot affiché (Partie#getMaskedWord) - * - calcule le stage = MAX_STAGE - remainingTry et met à jour le Dessin + * - met à jour le mot affiché + * - calcule errors = initialTries - remainingTry, puis stage = min(errors, Dessin.MAX_STAGE) + * - met à jour le score * - gère la fin de partie */ private static class GameLetterHandler implements Consumer { private final Fenetre fenetre; private final Partie partie; + private final int initialTries; // essais au démarrage (peut être 11 avec ta Partie) private final Dessin dessinPanel; - GameLetterHandler(Fenetre fenetre, Partie partie) { + GameLetterHandler(Fenetre fenetre, Partie partie, int initialTries) { this.fenetre = fenetre; this.partie = partie; + this.initialTries = initialTries; this.dessinPanel = (fenetre.getDrawZone() instanceof Dessin) ? (Dessin) fenetre.getDrawZone() : null; } @@ -66,20 +84,20 @@ public class Pendu { boolean alreadyPlayed = partie.isAlreadyEntries(ch); // Mise à jour du mot - fenetre.getWordLabel().setText(partie.getMaskedWord()); + fenetre.getWordLabel().setText(buildMaskedWord(partie)); - // Erreurs -> stage pour le dessin + // Erreurs -> stage pour le dessin (borné à MAX_STAGE) + int errors = Math.max(0, initialTries - partie.getRemainingTry()); if (dessinPanel != null) { - int stage = Dessin.MAX_STAGE - partie.getRemainingTry(); + int stage = Math.min(errors, Dessin.MAX_STAGE); dessinPanel.setStage(stage); } - // Mise à jour du score courant (erreurs + temps actuel) + // Mise à jour du score courant (si tu utilises Score + Chronometre) long elapsed = (fenetre.getChronometre() != null) ? fenetre.getChronometre().getElapsedMillis() : 0L; - int errors = Dessin.MAX_STAGE - partie.getRemainingTry(); - int score = Score.compute(errors, elapsed); if (fenetre.getScoreLabel() != null) { + int score = Score.compute(errors, elapsed); fenetre.getScoreLabel().setText("Score : " + score); } @@ -94,10 +112,10 @@ public class Pendu { if (fenetre.getChronometre() != null) { fenetre.getChronometre().stop(); } - // Score final recalculé (au cas où une seconde vient de passer) + // Score final (si Score/Chronometre présents) long finalElapsed = (fenetre.getChronometre() != null) ? fenetre.getChronometre().getElapsedMillis() : elapsed; - int finalErrors = Dessin.MAX_STAGE - partie.getRemainingTry(); + int finalErrors = Math.max(0, initialTries - partie.getRemainingTry()); int finalScore = Score.compute(finalErrors, finalElapsed); boolean win = !fenetre.getWordLabel().getText().contains("_"); @@ -105,7 +123,7 @@ public class Pendu { ? "Bravo ! Mot trouvé : " : "Perdu ! Le mot était : ") + String.valueOf(partie.getSecretWord()) - + "\nScore : " + finalScore; + + (fenetre.getScoreLabel() != null ? "\nScore : " + finalScore : ""); JOptionPane.showMessageDialog(fenetre.getWindow(), msg); From e649d30b33f42148aa379a8792363816d6923d01 Mon Sep 17 00:00:00 2001 From: dick Date: Wed, 8 Oct 2025 17:56:14 +0200 Subject: [PATCH 3/3] Final --- bin/Chronometre.class | Bin 2222 -> 0 bytes bin/Dessin.class | Bin 2225 -> 0 bytes bin/Event.class | Bin 2388 -> 0 bytes bin/Fenetre.class | Bin 3216 -> 0 bytes bin/LetterInputFilter.class | Bin 951 -> 0 bytes bin/MenuDifficulte.class | Bin 2565 -> 0 bytes bin/Mots.class | Bin 1225 -> 0 bytes bin/Partie.class | Bin 2868 -> 0 bytes bin/Pendu$GameLetterHandler.class | Bin 3418 -> 0 bytes bin/Pendu.class | Bin 2729 -> 0 bytes bin/Score.class | Bin 531 -> 0 bytes 11 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 bin/Chronometre.class delete mode 100644 bin/Dessin.class delete mode 100644 bin/Event.class delete mode 100644 bin/Fenetre.class delete mode 100644 bin/LetterInputFilter.class delete mode 100644 bin/MenuDifficulte.class delete mode 100644 bin/Mots.class delete mode 100644 bin/Partie.class delete mode 100644 bin/Pendu$GameLetterHandler.class delete mode 100644 bin/Pendu.class delete mode 100644 bin/Score.class diff --git a/bin/Chronometre.class b/bin/Chronometre.class deleted file mode 100644 index 4871647ba82c6ef12c1245550db05ccf5a866fa4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2222 zcmX^0Z`VEs1_pD67A^)224{8#7Y+tjb_O>t1||k~P6l-b4-nxABD_F^H#>t57XufA zGZ%w8gD)3@AA>)L6~N9A$iWcA#lX)H4AL6H!4L`(4`XKt=VB0Lhydx0KaSdy9o6KAu@%*!mXV`N~~ z&l`MT#}fa?VDHt6=x|f$uD4J zU@b~5PAy?%5J*ogam`6AC`Q=8tfA?}$iSbNT#}ie7m!+%mS2>cn!?B+uL1Uieqwov zerj22UWvXVScxl$Z4Gh^cWFUNVhJorSTwvqf?UD*rA5i9ZkZrg2{>mI<>%$+rj`_? z>VZOxhryV^gpolA#6}H0Mg~>`11kdqMg}Ql$zV_bJLl&Wmn7zu6oa&9^Dt;JX!9`W zG3fI!7%&*}Fc>iyGBSvQbb%e~lwXvRTI7>hnO|DM!;r&}%g&I;!;sHVz{60;P{hc< z3s>oupI5@jz!999o}a1^>IpKvn1`W+p_Gw<%{eu%B(;c#p^TxNkwFlo1?FCGbb{1Y z@G$5w=(00Z@-S2}*zhozGnnu&RD%dh5Mj^Yz{6n8V8h73scK-9Vg(`?83aH^>E|To zrR)1AWu+#Uurt)~Fw`>Cu`|^3Ff=eU@-Q?pG&3@ABLy9LfCVJxffAuC*eLY)@yRSM zNzF?wVq_45#vs_T;F6-uymV_%P#kdI(^C_ia$wq$!119EQDV)=0J0sz zVPuel*p6K($f@EG1&{!P`2p++_TtnMNCXN&)quPJ5&^rMIWZ-LkwFtl$~ix`AU`iP zuf!VcJcyByH~{NV*6@T#fXqQo@vsmDt3ryu;L75X)Lc+Nlol1G=9PdF1}xvQ7o`>? zW`dFzA1DYRmigp^GCzA+VoqtQe;Ol$u!a{Ts1VZDC@BQuVMYcvP^L^QVPvp``Ug2m zqam&a3&FgDBm^-7RQwdDmV~5MlrS=gVlhQCj6sn>ok4?vkwKGzl|cxU$ruo_5Fi0@4FbFXS zF^DjTGl(+CFo-cIGDtG$Fi0_2Ge|S|F~~4PFvv5cGbk`Hf^sX=)gcVbU{}j)ZDC-a z#UQ1{0&?mO1__X3w=jrrW02I^#vlcVtl)NefUIX=V32`Wf(UV_>73gbWI$el zgd4;w77VNmmJD1BRt)?M)(m0{HVo1XwhWA*(hKSXZw3|yP)#YjgF(Up;tL*7cyXjI zXJFxU(%QnnshGGHoG?Jq!N=_)OT4EX488{gj7)<3w802!D6h#;m za?M#mRG~RLIH@SH?qyJpWENxH!JrZx$s)!MqIWQ;ZevhGcwG$aAwLE-27d-#h5!Z; RhCl`rh9Cw;21l?zoB)r!=SKhl diff --git a/bin/Dessin.class b/bin/Dessin.class deleted file mode 100644 index 60bf7458d809182acca9c9d62d7cd1ebe553460a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2225 zcmX^0Z`VEs1_pD6DlP_j22)N3P6jh}26HY3W(Er`22KV`b_Odh1~vw35XXj{!Iq1` zj=>&8IDkYPLAso{7z`Mk*%@3o8C)6MK!iIN13!ZYJA)^Sg98Ht7lSZ^7f8gLlYx!F z2gLFPY4!sV{vd7uhzJA`K^zRh>5%Iwxj_$6E42+(P47|?ydBr7(c_m?q zIi;!03=9lxj0~*BC5h>&j0|ixnR%Hdc8mEi4+IAf>#)C5g$|zKI1e73pvl%o>`Wj0}7QiJ5sN&iT0o`FW{% zC5#MW8a`QxWr_NU zfuzHD7{VDM7#aBB($4ug`9&b9NFIhLhG<3xHi(Jr3^670#>XF8c^HZrba@y`Ktw4+84p7_h^SytV`N}}`ldp^xI8m2UEeDpF)uZT zkwFk{Hp~r-46GWS;5ZQ|PAv&2N=-{GDoRZW&a6shWDrLRbaY)L zDKR-ay(qslFNKjo7)c8_oWRN9;@%@OucVlfLBQKJGTzZI#M9Bo(=pi7&z+s2 zl97SgJGGLLfyXm1FSW=yC$YFVwV07X7LrmxMx&ad;+75}8H)Z`LtMg~yOp%}r)V1yJ7C{o2>(=kl}g({1N8;Ifr=NC}4gAz1EDae(O zqyP?3P8Y`@?|Anh$4Ev70fY)jh(mH5n9az*k)B!-o|ys)bk6kD5|7l(^o$Zl29A`X z#BxwhWn^Fn#U(fifCc@_5_1?C*i$l#3-XIo85yK;gf++?42le#4Dt*N3``7?3EDtl`ONg0NV}*t{n{AwlZ2<7?|cW@My_^?A*q{12U3{ z0b!&J12=;#gD`^}g9L*-gA9WrgEpwNV_^KlAj8PO$e_cZ3pHMr0mNruUqSPxhj ztiX&@l+}z&lvR`kY!>j6suufkA_Tl|hSvmqD9BoI!^{g+Z4=o56s=fWeT# zjKPS(k-?O~gTag;l);=Kj=_QSY#^+klpKQyG{TjKSI0gdv>))Pi7SNM&$kNMqpy E07wYG^Z)<= diff --git a/bin/Event.class b/bin/Event.class deleted file mode 100644 index d5dec5b46fe00994bdd1c4a7533353a8726dedce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2388 zcmX^0Z`VEs1_pD64lV{61|v=eX$E5uVZy~A&0xyKV8&n$A}qKVEE%l081xvd*cq(3 z7&sYhKpa~TVaLUw&tMNC95@&pK_X5djxz^?3y5|F>38E`aOYz1VDJQqcyTd!Gx%^b z_%iqjF)%O$u`>j-GlZ}+gfcR)m1pLqBKzVT=qc&iN^+ zj12rfnR%&xrMXF|MInhvIjM{c4#XLP%Q+ykxymz(QeDeZ^Gb>t8JIOdLi~wfp9iEC zrR5jpf&xZf1LDTS@)G@2kXn65uoAF7Ymgq^;F84TY~REJu*=vP!q^$Y85y{O^Gl18 zQ{6H_j^zTY)&m7G4}%JW77v3QgFFv|0)rwCgC>I(J3|ByLnK2K4?{FV3_C+C4?`S7 zJR^f3B$hn$3Q9}dGIL5&i$Izaco-5Hl6V-B8B%x{Qb9x-Lkc4U0}n$wLk15+CPNk@ z18cOSZd5D}LpDPW4?`|P9wUQ#SZZlzPEKl-LTX+~QEHJwX11s2{j0^%GpX!6tfPYd}YH|r9gDhAGJrsR1i%U}TQi~WF z#6a>D`o-m$dFlFIA*mH5Zkee$DJW(ImlS2@r86?HL(?)N17CV-2~sFAGDvA?g5wL* zBx^%^9gGZ^X%0ymY#@7jY6&Qe7#T#Met?8FB!sLP8CXh+GIJRj zxJ&Xw3kp(;oD+*v85!7%VY);i4nolcatd2cYF>It1~@x-GBU8|CYB^;q!u$WVAT-C z$iSJNS`rQ|W5l3NfqT=fC@~jQ;E1Dyrhfsba0y7vOJ!sbEY8R;_f0J>PE1dA$xO`2 zPX`wdAocp7wBnqfTacfZnpa{Cj#Y?zAxR1x4s6L8iA9bjj0`Lqo|?|kc!Q{d7e0&( z>}82LrK$dDj0_SQ&XDwhrpB6)K^kl+_M(W9fh{pPIklh!Eg;}7;bN#`sAptQ0HwvE zRE6UF(%j7AR0WNKoW$hRjQpIG)FMp{RFcyyV1^@XV47P!U^_2rhxt zu*C_Ix1n*%&d>nLZ7qxpDqt6bb6I9yS$=k^K12z`bhpIhlKi4dc7`@a1~#Ak{Or;K zMg|_wyu8#R=bXgiVoTj1002ObkMxl9z#j zK?qd%GB7eIF)%PNF(@-IGcYo!FsL#xF{m*xFjzA%F)%YQFbHdHXJFLQ-patFrL&cR zS!){u%SHwU21W*T1_lN(237_J22lnU1~CRs25|;H1_=fs21%%q8VpRJqMd;eY+x`0 z3)nz)tt|{p+Zb4VAT*n=j@C8?c5SU~3>@0K88{=gw=-~UW8g+uBE`VQz`!8Oz`-EL zAi$u=Aj+V`AjP1{pvIuaz{sG@paZpFGXpaN3j+f~GQ?n3U!83XJlhy}w=wYf=?L*} zV-V2Y#vsVDfPqI>NN5{_@GJ%ah)NM5(H#t88@0ADFdt(O2T{7r+Ze=mFi7lVkYr+5 z&L9j`r@MCSfW*IUxGcYi4F)%VTGPE)@F-S7_ RGcYi4FfcL%FfcL%0sxBrd`JKQ diff --git a/bin/Fenetre.class b/bin/Fenetre.class deleted file mode 100644 index bc940530244fd9f23b10d564b8cf7b0725e12284..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3216 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 I66{VX0C~^X`v3p{ diff --git a/bin/MenuDifficulte.class b/bin/MenuDifficulte.class deleted file mode 100644 index c6d76f095dfbdd124aecdff6611f05a992b955ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2565 zcmX^0Z`VEs1_pD6say;?3@)4u+6=Dj3~n3@?pzGa3?3l9Cy3<*BD_I_4?BY|7XufA zABf}6&Je)C5XjCD#KpkN5X{aH!od*A#URKK2I7ZvF+?y#f>==;4ACIS z3{nj7Tnv&72_PbhogtBfA&HAYj=_V2A(?|A1;k7R5osX#bPk3LkmgJfk;TQ3&5*;* zkjs$A&XCW}P{7Vm$jHE&R+N~V%E%z%la*MOSfO8Bo|%`f@8t#(wPs`x%FlDjOiRm5 zF3l;abk4{xPR(OvkOiyNFD=Q;(N8PQOD@UG&(n9#&nqs?O)au!WZ(?WOwUU!DJ@E6 zWH7|1)&?S(lbDyTA6!zDnU`*DXU)jKW|NthSz^b?pr8R!fWs!uFh&Lz=lqmZMh1SL z%)C^;(%hufqL9R-oK!{z6TEt{+6*?YI3vHDk%3tQ#9>X&$uCZ2WZ+0oEdhrJBZHWR zCfH3FA;q5v4u^o$qO|;?+|(3C26?Cp63a{UQ_E8GO7tDUN?bu~YmoW8!6k{w*}jPd zU^lZf6frVz1?QI*C8xS&g8U%to0?Y&5C2p>P!#bnm@ruJFc>fxGBOB(1W;YV$e`+# zTB?vzst}Nxmr|hDU{}+ zSjNa81u_%n(qK>;1ErUe#JrMXkij*K47?x}U|Zet^GX;QID%8t^HUW(*IU!MynUl)H(7{m5!_djl1+uoAk%7%QHLoPK zh=-wvp_hlDkHLzap`V9g0>eahhDkgOlNqKkGVq~BA|rzU*j3;}@1K;Fnq0!jAPW`( z1vzp;@yRSMNzF?wLeT=rCyWfD(9{Js2OXw*Xl3!HG$RLY7_nQVEe_WKh)b^z`&Z&9+J4l&ud@ z0xGhKQ%fKmMg}>Er7#;%m4X70IWZ-LkwFup44h;Ufdeia^ud0DL@wCL><}k}F)|1g zr=>83fWX+$;hu1|dF$CO<|7X;9SQs2CU-*bpEI6?Go2ChhE0j})~+}jvh9X7&E+LFk$$}V9M}=!HkiK!5kVj77UCGmJC)5jG%~N zP-I|YU}Ru`gfh!E26cq<*uWAXh1PK83Ji>3QE=pJW6(fXZOg#OV8Z|+%@`OMWTC2A zLB8Jr_cz2~2L?t4I|h5GJ3<(k7?>Ft8056KF=+aN)Nf-WEs2|92giFI2aiJFvzkqI5IFYIDwO+GXR63 Bh$R33 diff --git a/bin/Mots.class b/bin/Mots.class deleted file mode 100644 index 90a75e026365ea6492b3e02329850706abe4ee93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1225 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 diff --git a/bin/Pendu.class b/bin/Pendu.class deleted file mode 100644 index 4b259481131247f546af14eb5d10030ad2cf6e75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2729 zcmX^0Z`VEs1_pD6xm*lN4CX=%3=B4047Ln*>H4kK6cxGNo zemNt9s0Mb0yul@j$=SY%1yFodX9YWikwE}qw0}}oYH|r915>m!h=}51 z=w;{wC9{4;2IittaH2qtsG!okJW!gkW@L~8nNp!&T%HL^EFdzpBr_+oBombKxHI$0 z^0QNY5=%hIQXDzCz>NTb1?7ayy!4QwN^oX&0%t*JYPE*t zD6o1>4Ij8T$ZPtgC7C(;X{C9|C7Jno`k){x%}p%==WE{d)RN%T4S(BWcT2R8sAP>`w!w-xM3eafAp#T(sEX5i5V)NTfr$n6ZQKHA$D z*tB*rurn}hW8m1$z!|xnfy-BW8w0n_4hEiW47}Rg82An{@Xuu61F;S;@H1~?5YXAi zAZWLnK`2sNM|L}duocU029Zc@NtW#lqTwJnFoB({#lXeDz#z%M!63yT${@oa%OKC7 z!Jx!o#GuSz%b?ES#Gu9C$Dqp)$)Lxe%fP_E&A|AV!IqtYg`I(ufeTatLLI$_ff?** zAFXW+Vjx1?cQ=DXFz|LUE&LF|az!1vLAn~7p5nY@KBrE)jfmMJD zR4zb$V#L4rui6{85kIZ71{1KiOc~4=7#LU>7#V~ZRKSKYF$ggzGAJ`}F-&Ec#W0OQ klEH$3fkB3WnZc5QnZb&|n!$>}k%5uH3CxdVh+>Ea06TtB(Toz{0@Jz`(%FAj!bNz{$YKz{SA8z{J4K zAj!ak#OGy@WZ+}qhsz5vFflNJ+{M7iAi}`FAj`nWz{tSBz^b*KfpH@PC}2bx7#P^V zg5nIE3}Ou8P^BRZEDUT63=Ha0a~N2et>wE!7?|?;v%LhFUq}g5WTdofrte^2?J#3y u7G>SRz_teL9*|)|3@i)`4Dt+Y3