diff --git a/PenduJudeChrist/Display.class b/PenduJudeChrist/Display.class deleted file mode 100644 index 36d72c9..0000000 Binary files a/PenduJudeChrist/Display.class and /dev/null differ diff --git a/PenduJudeChrist/GameLogic.class b/PenduJudeChrist/GameLogic.class deleted file mode 100644 index 38a9f17..0000000 Binary files a/PenduJudeChrist/GameLogic.class and /dev/null differ diff --git a/PenduJudeChrist/HangedGame.class b/PenduJudeChrist/HangedGame.class deleted file mode 100644 index 1ff803a..0000000 Binary files a/PenduJudeChrist/HangedGame.class and /dev/null differ diff --git a/PenduJudeChrist/HangedGameGUI$1.class b/PenduJudeChrist/HangedGameGUI$1.class deleted file mode 100644 index b3595d1..0000000 Binary files a/PenduJudeChrist/HangedGameGUI$1.class and /dev/null differ diff --git a/PenduJudeChrist/HangedGameGUI$2.class b/PenduJudeChrist/HangedGameGUI$2.class deleted file mode 100644 index 7c34b32..0000000 Binary files a/PenduJudeChrist/HangedGameGUI$2.class and /dev/null differ diff --git a/PenduJudeChrist/HangedGameGUI$3.class b/PenduJudeChrist/HangedGameGUI$3.class deleted file mode 100644 index 8451451..0000000 Binary files a/PenduJudeChrist/HangedGameGUI$3.class and /dev/null differ diff --git a/PenduJudeChrist/HangedGameGUI$4.class b/PenduJudeChrist/HangedGameGUI$4.class deleted file mode 100644 index 29378a4..0000000 Binary files a/PenduJudeChrist/HangedGameGUI$4.class and /dev/null differ diff --git a/PenduJudeChrist/HangedGameGUI.class b/PenduJudeChrist/HangedGameGUI.class deleted file mode 100644 index e2b213d..0000000 Binary files a/PenduJudeChrist/HangedGameGUI.class and /dev/null differ diff --git a/PenduJudeChrist/HangedGameGUI.java b/PenduJudeChrist/HangedGameGUI.java index 5016a6c..d462317 100644 --- a/PenduJudeChrist/HangedGameGUI.java +++ b/PenduJudeChrist/HangedGameGUI.java @@ -12,6 +12,7 @@ public class HangedGameGUI { private Set guessedLetters; private int lives; + // Composants de l'interface private JFrame frame; private JLabel wordLabel; diff --git a/PenduJudeChrist/InputHandler.class b/PenduJudeChrist/InputHandler.class deleted file mode 100644 index 220fab2..0000000 Binary files a/PenduJudeChrist/InputHandler.class and /dev/null differ diff --git a/PenduJudeChrist/WordSelector.class b/PenduJudeChrist/WordSelector.class deleted file mode 100644 index 1ed5456..0000000 Binary files a/PenduJudeChrist/WordSelector.class and /dev/null differ diff --git a/PenduWIlfried/ChooseWord.class b/PenduWIlfried/ChooseWord.class deleted file mode 100644 index 8b18fdc..0000000 Binary files a/PenduWIlfried/ChooseWord.class and /dev/null differ diff --git a/PenduWIlfried/ChooseWord.java b/PenduWIlfried/ChooseWord.java index 2613a2c..d4bca1c 100644 --- a/PenduWIlfried/ChooseWord.java +++ b/PenduWIlfried/ChooseWord.java @@ -3,15 +3,20 @@ import java.util.*; public class ChooseWord { - /*Fonction pour choisir le mot aléatoirement*/ - public static String chooseTheWord() { + /*Fonction pour choisir le mot selon la difficulté*/ + public static String chooseTheWord(String difficulty) { + String filename = getFilenameByDifficulty(difficulty); List words = new ArrayList<>(); - try (BufferedReader reader = new BufferedReader(new FileReader("motsFacile.txt"))) { + try (BufferedReader reader = new BufferedReader(new FileReader(filename))) { String line; while ((line = reader.readLine()) != null) { if (!line.trim().isEmpty()) { - words.add(line.trim().toLowerCase()); + String word = line.trim().toLowerCase(); + // Filtre selon la difficulté + if (isValidForDifficulty(word, difficulty)) { + words.add(word); + } } } } catch (IOException e) { @@ -25,4 +30,26 @@ public class ChooseWord { Random rand = new Random(); return words.get(rand.nextInt(words.size())); } -} + + private static String getFilenameByDifficulty(String difficulty) { + switch (difficulty.toLowerCase()) { + case "facile": return "motsFacile.txt"; + case "moyen": return "motsMoyen.txt"; + case "difficile": return "motsDifficiles.txt"; + default: return "motsFacile.txt"; + } + } + + private static boolean isValidForDifficulty(String word, String difficulty) { + switch (difficulty.toLowerCase()) { + case "facile": + return word.length() < 8 && !word.contains(" "); + case "moyen": + return word.length() >= 8 && !word.contains(" "); + case "difficile": + return word.contains(" "); // Phrases avec espaces + default: + return true; + } + } +} \ No newline at end of file diff --git a/PenduWIlfried/GameState.class b/PenduWIlfried/GameState.class deleted file mode 100644 index 174aa2a..0000000 Binary files a/PenduWIlfried/GameState.class and /dev/null differ diff --git a/PenduWIlfried/GameState.java b/PenduWIlfried/GameState.java index 070eaeb..be35125 100644 --- a/PenduWIlfried/GameState.java +++ b/PenduWIlfried/GameState.java @@ -7,13 +7,19 @@ public class GameState { private int errors; private Set triedLetters; private static final int MAX_ERRORS = 9; + private long startTime; + private int score; + private String difficulty; - public GameState(String wordToGuess) { + public GameState(String wordToGuess, String difficulty) { this.word = wordToGuess.toLowerCase(); + this.difficulty = difficulty; this.hiddenWord = new char[word.length()]; Arrays.fill(hiddenWord, '_'); this.triedLetters = new HashSet<>(); this.errors = 0; + this.score = 0; + this.startTime = System.currentTimeMillis(); } /*Fonction pour essayer une lettre*/ @@ -32,15 +38,58 @@ public class GameState { if (!found) { errors++; } + + // Mettre à jour le score après chaque tentative + updateScore(); } - /*Fonction pour vérifier si une lettre à déjà été essayé*/ + /*Calculer le score*/ + private void updateScore() { + long currentTime = System.currentTimeMillis(); + long timeElapsed = (currentTime - startTime) / 1000; // en secondes + + int baseScore = 1000; + int timeBonus = Math.max(0, 300 - (int)timeElapsed) * 2; // Bonus temps + int errorPenalty = errors * 50; // Pénalité erreurs + int difficultyMultiplier = getDifficultyMultiplier(); + + score = Math.max(0, (baseScore + timeBonus - errorPenalty) * difficultyMultiplier); + } + + private int getDifficultyMultiplier() { + switch (difficulty.toLowerCase()) { + case "facile": return 1; + case "moyen": return 2; + case "difficile": return 3; + default: return 1; + } + } + + /*Fonction pour obtenir le score final*/ + public int getFinalScore() { + if (isWon()) { + updateScore(); // Dernier calcul + return score; + } + return 0; // Score 0 si perdu + } + + /*Fonction pour obtenir le temps écoulé*/ + public long getTimeElapsed() { + return (System.currentTimeMillis() - startTime) / 1000; + } + + /*Fonction pour obtenir la difficulté*/ + public String getDifficulty() { + return difficulty; + } + + // Les autres méthodes restent inchangées... public boolean hasTriedLetter(char letter) { letter = Character.toLowerCase(letter); return triedLetters.contains(letter); } - /*Fonction pour vérifier si on a gagné*/ public boolean isWon() { for (char c : hiddenWord) { if (c == '_') { @@ -50,17 +99,14 @@ public class GameState { return true; } - /*Fonction pour vérifier si on a perdu*/ public boolean isLost() { return errors >= MAX_ERRORS; } - /*Fonction pour voir le nombre d'erreur*/ public int getErrors() { return errors; } - /*Fonction pour voir le mot caché*/ public String getHiddenWord() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < hiddenWord.length; i++) { @@ -72,8 +118,7 @@ public class GameState { return sb.toString(); } - /*Fonction pour voir le mot*/ public String getWord() { return word; } -} +} \ No newline at end of file diff --git a/PenduWIlfried/HangmanPanel.class b/PenduWIlfried/HangmanPanel.class deleted file mode 100644 index 5724735..0000000 Binary files a/PenduWIlfried/HangmanPanel.class and /dev/null differ diff --git a/PenduWIlfried/HangmanPanel.java b/PenduWIlfried/HangmanPanel.java index 9b4521b..0966c03 100644 --- a/PenduWIlfried/HangmanPanel.java +++ b/PenduWIlfried/HangmanPanel.java @@ -14,6 +14,11 @@ public class HangmanPanel extends JPanel { /*Dessiner le pendu*/ protected void paintComponent(Graphics g) { super.paintComponent(g); + + // Amélioration visuelle + g.setColor(Color.BLACK); + g.setFont(new Font("Arial", Font.BOLD, 12)); + g.drawString("Erreurs: " + errors + "/9", 10, 20); g.drawLine(50, 300, 200, 300); g.drawLine(125, 300, 125, 50); @@ -30,4 +35,4 @@ public class HangmanPanel extends JPanel { if (errors > 7) g.drawString("X", 240, 100); if (errors > 8) g.drawString("X", 255, 100); } -} +} \ No newline at end of file diff --git a/PenduWIlfried/main$1.class b/PenduWIlfried/main$1.class deleted file mode 100644 index c4889fd..0000000 Binary files a/PenduWIlfried/main$1.class and /dev/null differ diff --git a/PenduWIlfried/main.class b/PenduWIlfried/main.class deleted file mode 100644 index 46332fc..0000000 Binary files a/PenduWIlfried/main.class and /dev/null differ diff --git a/PenduWIlfried/main.java b/PenduWIlfried/main.java index a1926e8..b6d427a 100644 --- a/PenduWIlfried/main.java +++ b/PenduWIlfried/main.java @@ -2,7 +2,6 @@ import javax.swing.*; import java.awt.*; import java.awt.event.*; - public class main { public static GameState gameState; @@ -10,59 +9,132 @@ public class main { public static HangmanPanel hangmanPanel; public static JTextField inputField; public static JLabel messageLabel; + public static JLabel scoreLabel; + public static JLabel timeLabel; + public static Timer timer; /*Fonction main*/ public static void main(String[] args) { - String selectedWord = ChooseWord.chooseTheWord(); - gameState = new GameState(selectedWord); + showDifficultySelection(); + } + /*Fonction pour sélectionner la difficulté*/ + public static void showDifficultySelection() { + JFrame selectionFrame = new JFrame("Sélection de Difficulté"); + selectionFrame.setSize(400, 300); + selectionFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + selectionFrame.setLayout(new GridLayout(4, 1)); + + JLabel titleLabel = new JLabel("Choisissez la difficulté:", SwingConstants.CENTER); + titleLabel.setFont(new Font("Arial", Font.BOLD, 20)); + + JButton easyButton = new JButton("FACILE - Mots courts (< 8 lettres)"); + JButton mediumButton = new JButton("MOYEN - Mots longs (≥ 8 lettres)"); + JButton hardButton = new JButton("DIFFICILE - Phrases (2 mots)"); + + easyButton.addActionListener(e -> startGame("facile", selectionFrame)); + mediumButton.addActionListener(e -> startGame("moyen", selectionFrame)); + hardButton.addActionListener(e -> startGame("difficile", selectionFrame)); + + selectionFrame.add(titleLabel); + selectionFrame.add(easyButton); + selectionFrame.add(mediumButton); + selectionFrame.add(hardButton); + + selectionFrame.setVisible(true); + } + + /*Fonction pour démarrer le jeu*/ + public static void startGame(String difficulty, JFrame selectionFrame) { + selectionFrame.dispose(); + String selectedWord = ChooseWord.chooseTheWord(difficulty); + gameState = new GameState(selectedWord, difficulty); createInterface(); + startTimer(); } /*Fonction pour créer l'interface*/ public static void createInterface() { - JFrame window = new JFrame("HangmanGame"); + JFrame window = new JFrame("HangmanGame - Difficulté: " + gameState.getDifficulty()); window.setSize(800, 600); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); window.setLayout(new BorderLayout()); + // Panel d'information (score et temps) + JPanel infoPanel = new JPanel(new GridLayout(1, 3)); + + JLabel difficultyLabel = new JLabel("Difficulté: " + gameState.getDifficulty(), SwingConstants.CENTER); + difficultyLabel.setFont(new Font("Arial", Font.BOLD, 16)); + + scoreLabel = new JLabel("Score: 0", SwingConstants.CENTER); + scoreLabel.setFont(new Font("Arial", Font.BOLD, 16)); + + timeLabel = new JLabel("Temps: 0s", SwingConstants.CENTER); + timeLabel.setFont(new Font("Arial", Font.BOLD, 16)); + + infoPanel.add(difficultyLabel); + infoPanel.add(scoreLabel); + infoPanel.add(timeLabel); + wordLabel = new JLabel(gameState.getHiddenWord(), SwingConstants.CENTER); wordLabel.setFont(new Font("Arial", Font.BOLD, 40)); - window.add(wordLabel, BorderLayout.NORTH); - + hangmanPanel = new HangmanPanel(); - window.add(hangmanPanel, BorderLayout.CENTER); - + JPanel inputPanel = new JPanel(); inputField = new JTextField(2); - JButton submitButton = new JButton("Try Letter"); + inputField.setFont(new Font("Arial", Font.BOLD, 20)); + JButton submitButton = new JButton("Essayer la lettre"); - messageLabel = new JLabel("Enter a letter:"); + messageLabel = new JLabel("Entrez une lettre:"); inputPanel.add(messageLabel); inputPanel.add(inputField); inputPanel.add(submitButton); + window.add(infoPanel, BorderLayout.NORTH); + window.add(wordLabel, BorderLayout.CENTER); + window.add(hangmanPanel, BorderLayout.WEST); window.add(inputPanel, BorderLayout.SOUTH); - /*evenement du bouton*/ + /*événement du bouton*/ submitButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleLetterInput(); } }); + /*événement de la touche Entrée*/ + inputField.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + handleLetterInput(); + } + }); + window.setVisible(true); + inputField.requestFocus(); } - /*Fonction pour mettre à jour le pendu*/ + /*Fonction pour démarrer le chronomètre*/ + public static void startTimer() { + timer = new Timer(1000, new ActionListener() { + public void actionPerformed(ActionEvent e) { + updateDisplay(); + } + }); + timer.start(); + } + + /*Fonction pour mettre à jour l'affichage*/ + public static void updateDisplay() { + timeLabel.setText("Temps: " + gameState.getTimeElapsed() + "s"); + scoreLabel.setText("Score: " + gameState.getFinalScore()); + } + + /*Fonction pour gérer la saisie de lettre*/ public static void handleLetterInput() { - - System.out.println(gameState.getWord()); - System.out.println(gameState.getWord().length()); - String input = inputField.getText().toLowerCase(); if (input.length() != 1 || !Character.isLetter(input.charAt(0))) { - messageLabel.setText("Enter a single valid letter."); + messageLabel.setText("Entrez une seule lettre valide."); return; } @@ -70,22 +142,52 @@ public class main { inputField.setText(""); if (gameState.hasTriedLetter(letter)) { - messageLabel.setText("Letter already tried."); + messageLabel.setText("Lettre déjà essayée."); return; } gameState.tryLetter(letter); wordLabel.setText(gameState.getHiddenWord()); hangmanPanel.setErrors(gameState.getErrors()); + updateDisplay(); if (gameState.isWon()) { - messageLabel.setText("Congratulations! You've won!"); + timer.stop(); + int finalScore = gameState.getFinalScore(); + messageLabel.setText("Félicitations ! Vous avez gagné ! Score: " + finalScore); inputField.setEditable(false); + showEndGameMessage(true, finalScore); } else if (gameState.isLost()) { - messageLabel.setText("You lost! Word was: " + gameState.getWord()); + timer.stop(); + messageLabel.setText("Perdu ! Le mot était: " + gameState.getWord()); inputField.setEditable(false); + showEndGameMessage(false, 0); } else { - messageLabel.setText("Keep guessing..."); + messageLabel.setText("Continuez... Erreurs: " + gameState.getErrors() + "/" + 9); } } -} + + /*Fonction pour afficher le message de fin de jeu*/ + public static void showEndGameMessage(boolean won, int score) { + String message = won ? + "FÉLICITATIONS !\nVous avez gagné !\nScore final: " + score + "\nTemps: " + gameState.getTimeElapsed() + "s" : + "DOMAGE !\nVous avez perdu.\nLe mot était: " + gameState.getWord() + "\nVoulez-vous réessayer ?"; + + int optionType = won ? JOptionPane.INFORMATION_MESSAGE : JOptionPane.QUESTION_MESSAGE; + + int choice = JOptionPane.showConfirmDialog(null, + message, + "Partie Terminée", + JOptionPane.DEFAULT_OPTION, + optionType); + + if (!won || choice == JOptionPane.OK_OPTION) { + // Retour au menu principal + SwingUtilities.invokeLater(() -> { + JFrame currentFrame = (JFrame) SwingUtilities.getWindowAncestor(inputField); + currentFrame.dispose(); + showDifficultySelection(); + }); + } + } +} \ No newline at end of file