From d52b072c9280f8d93a46c585003f1f84490ef7ac Mon Sep 17 00:00:00 2001 From: akagunduz Date: Wed, 8 Oct 2025 14:33:48 +0200 Subject: [PATCH] chameauuuuuu --- Game.java | 172 ++++++++++++++++++++++++++++++++++++++++++++++++ HangmanGUI.java | 66 ++++++++----------- 2 files changed, 200 insertions(+), 38 deletions(-) create mode 100644 Game.java diff --git a/Game.java b/Game.java new file mode 100644 index 0000000..e9bfd29 --- /dev/null +++ b/Game.java @@ -0,0 +1,172 @@ +import java.util.Random; +import java.util.Set; +import java.util.HashSet; +import java.util.Locale; +import java.util.Scanner; + +/** + * Hangman console version. + * Code, variables and comments in English. + * Displayed text remains in French. + */ +public class Game { + + // Hangman visual stages + private static final String[] stages = new String[] { + "=========\n", + " |\n" + + " |\n" + + " |\n" + + " |\n" + + " |\n" + + "=========\n", + " +---+\n" + + " |\n" + + " |\n" + + " |\n" + + " |\n" + + " |\n" + + "=========\n", + " +---+\n" + + " | |\n" + + " |\n" + + " |\n" + + " |\n" + + " |\n" + + "=========\n", + " +---+\n" + + " | |\n" + + " O |\n" + + " |\n" + + " |\n" + + " |\n" + + "=========\n", + " +---+\n" + + " | |\n" + + " O |\n" + + " | |\n" + + " |\n" + + " |\n" + + "=========\n", + " +---+\n" + + " | |\n" + + " O |\n" + + " /|\\ |\n" + + " |\n" + + " |\n" + + "=========\n", + " +---+\n" + + " | |\n" + + " O |\n" + + " /|\\ |\n" + + " / \\ |\n" + + " |\n" + + "=========\n" + }; + + /** Build the masked word using found letters. */ + static String maskWord(String secretWord, Set foundLetters) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < secretWord.length(); i++) { + char original = secretWord.charAt(i); + char c = Character.toLowerCase(original); + + if (!Character.isLetter(c)) { + sb.append(original); + } else if (foundLetters.contains(c)) { + sb.append(original); + } else { + sb.append('_'); + } + if (i < secretWord.length() - 1) sb.append(' '); + } + return sb.toString(); + } + + /** Display the current hangman stage based on errors. */ + static void drawHangman(int errors) { + int idx = Math.min(Math.max(errors, 0), stages.length - 1); + System.out.println(stages[idx]); + } + + /** Check if all letters of the word have been found. */ + static boolean isWin(String secretWord, Set foundLetters) { + for (int i = 0; i < secretWord.length(); i++) { + char c = Character.toLowerCase(secretWord.charAt(i)); + if (Character.isLetter(c) && !foundLetters.contains(c)) return false; + } + return true; + } + + public static void main(String[] args) { + String[] words = { + "ordinateur", "voiture", "maison", "soleil", "lumiere", + "fromage", "chocolat", "montagne", "riviere", "plage", + "oiseau", "papillon", "musique", "chateau", "livre", + "telephone", "aventure", "mystere", "foret", "fleur", + "chapeau", "nuage", "horloge", "chaise", "fenetre", + "paysage", "bouteille", "parapluie", "clavier", "souris", + "brouillard", "village", "histoire", "cerise", "pomme", + "banane", "poisson", "arbre", "cascade", "cheval" + }; + + Random random = new Random(); + String secretWord = words[random.nextInt(words.length)]; + + Set foundLetters = new HashSet<>(); + Set triedLetters = new HashSet<>(); + int errors = 0; + int maxErrors = stages.length - 1; + + Scanner scanner = new Scanner(System.in); + System.out.println("=== Game du Pendu ==="); + + while (true) { + drawHangman(errors); + System.out.println("Mot: " + maskWord(secretWord, foundLetters)); + System.out.println("Lettres essayées : " + triedLetters); + System.out.println("Erreurs : " + errors + "/" + maxErrors); + System.out.print("Propose une lettre: "); + + String input = scanner.nextLine().trim().toLowerCase(Locale.ROOT); + if (input.length() != 1 || !Character.isLetter(input.charAt(0))) { + System.out.println("Entrez une seule lettre."); + continue; + } + char letter = input.charAt(0); + if (triedLetters.contains(letter)) { + System.out.println("Déjà essayé."); + continue; + } + triedLetters.add(letter); + + boolean hit = false; + for (int i = 0; i < secretWord.length(); i++) { + if (Character.toLowerCase(secretWord.charAt(i)) == letter) { + foundLetters.add(letter); + hit = true; + } + } + + if (!hit) { + errors++; + System.out.println("Mauvaise lettre."); + } else { + System.out.println("Bonne lettre !"); + } + + if (isWin(secretWord, foundLetters)) { + System.out.println("\nTu as trouvé " + secretWord); + drawHangman(errors); + break; + } + if (errors >= maxErrors) { + drawHangman(errors); + System.out.println("\nPerdu ! Le mot était " + secretWord); + break; + } + } + + scanner.close(); + } +} diff --git a/HangmanGUI.java b/HangmanGUI.java index 7199b26..0a1bc9e 100644 --- a/HangmanGUI.java +++ b/HangmanGUI.java @@ -4,12 +4,11 @@ import java.awt.event.*; import java.util.*; /** - * Interface graphique du jeu du Pendu. - * Noms de variables/fonctions en anglais (exigence), - * affichages et commentaires en français. + * Hangman game GUI. + * Variables/methods and comments in English. + * User-facing texts remain in French. */ public class HangmanGUI extends JFrame { - // --- Données du jeu --- private final String[] words = { "ordinateur","voiture","maison","soleil","lumiere", "fromage","chocolat","montagne","riviere","plage", @@ -20,14 +19,14 @@ public class HangmanGUI extends JFrame { "brouillard","village","histoire","cerise","pomme", "banane","poisson","arbre","cascade","cheval" }; + private String secretWord; private final Set found = new HashSet<>(); private final Set tried = new HashSet<>(); private int errors = 0; - private static final int MAX_ERRORS = 8; // 8 étapes : base, poteau, poutre, corde, tête, corps, bras, jambes - private boolean gameOver = false; // indique si la partie est terminée + private static final int MAX_ERRORS = 8; // 8 steps: base, post, beam, rope, head, body, arms, legs + private boolean gameOver = false; // indicates if the game is finished - // --- Éléments UI --- private final JLabel wordLbl = new JLabel("", SwingConstants.CENTER); private final JLabel triedLbl = new JLabel("", SwingConstants.CENTER); private final JLabel infoLbl = new JLabel("Entrez une lettre (a-z)", SwingConstants.CENTER); @@ -35,7 +34,7 @@ public class HangmanGUI extends JFrame { private final JButton guessBtn = new JButton("Proposer"); private final HangPanel hangPanel = new HangPanel(); - /** Panneau de dessin du pendu, progressif selon le nombre d'erreurs. */ + /** Drawing panel for the hangman, progressive according to error count. */ private static class HangPanel extends JPanel { private int errors = 0; @@ -51,41 +50,33 @@ public class HangmanGUI extends JFrame { gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); int w = getWidth(), h = getHeight(); - int baseY = h - 40; // niveau du sol + int baseY = h - 40; // ground level - // 1) base if (errors >= 1) gg.drawLine(50, baseY, w - 50, baseY); - // 2) poteau vertical if (errors >= 2) gg.drawLine(100, baseY, 100, 60); - // 3) poutre horizontale if (errors >= 3) gg.drawLine(100, 60, 220, 60); - // 4) corde if (errors >= 4) gg.drawLine(220, 60, 220, 90); - // 5) tête if (errors >= 5) gg.drawOval(200, 90, 40, 40); - // 6) corps if (errors >= 6) gg.drawLine(220, 130, 220, 200); - // 7) bras if (errors >= 7) { - gg.drawLine(220, 145, 190, 165); // bras gauche - gg.drawLine(220, 145, 250, 165); // bras droit + gg.drawLine(220, 145, 190, 165); + gg.drawLine(220, 145, 250, 165); } - // 8) jambes if (errors >= 8) { - gg.drawLine(220, 200, 200, 240); // jambe gauche - gg.drawLine(220, 200, 240, 240); // jambe droite + gg.drawLine(220, 200, 200, 240); + gg.drawLine(220, 200, 240, 240); } } } - /** Point d'entrée : crée et affiche la fenêtre du jeu. */ + /** Entry point: create and show the game window. */ public static void main(String[] args) { SwingUtilities.invokeLater(() -> { HangmanGUI app = new HangmanGUI(); @@ -93,7 +84,7 @@ public class HangmanGUI extends JFrame { }); } - /** Constructeur : configure la fenêtre, l'UI et lance la partie. */ + /** Constructor: window setup, UI setup, and start the game. */ public HangmanGUI() { super("Jeu du Pendu"); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); @@ -103,7 +94,7 @@ public class HangmanGUI extends JFrame { startGame(); } - /** Prépare la mise en page et les actions de l'interface. */ + /** Prepare the layout and interactions. */ private void setupUI() { wordLbl.setFont(new Font(Font.MONOSPACED, Font.BOLD, 28)); triedLbl.setFont(new Font("SansSerif", Font.PLAIN, 14)); @@ -130,15 +121,14 @@ public class HangmanGUI extends JFrame { setContentPane(main); - // Actions guessBtn.addActionListener(e -> onGuess()); - input.addActionListener(e -> onGuess()); // touche Entrée + input.addActionListener(e -> onGuess()); addWindowListener(new WindowAdapter() { @Override public void windowOpened(WindowEvent e) { input.requestFocusInWindow(); } }); } - /** Démarre une partie (unique). */ + /** Start a game. */ private void startGame() { secretWord = pickWord(); found.clear(); @@ -153,9 +143,9 @@ public class HangmanGUI extends JFrame { updateUIState(); } - /** Traite une proposition : valide, met à jour et vérifie fin de partie. */ + /** Handle a guess: validate input, update state, check for end of game. */ private void onGuess() { - if (gameOver) return; // bloque toute saisie après fin + if (gameOver) return; // block input after game end String s = input.getText().trim().toLowerCase(Locale.ROOT); if (s.length() != 1 || s.charAt(0) < 'a' || s.charAt(0) > 'z') { @@ -192,7 +182,7 @@ public class HangmanGUI extends JFrame { input.requestFocusInWindow(); } - /** Met à jour les libellés, le dessin, et gère la fin de partie. */ + /** Refresh labels/drawing and handle end-of-game. */ private void updateUIState() { wordLbl.setText(maskWord(secretWord, found)); triedLbl.setText("Lettres essayées : " + joinChars(tried)); @@ -200,7 +190,7 @@ public class HangmanGUI extends JFrame { if (isWin(secretWord, found)) { infoLbl.setText("Bravo ! Vous avez trouvé le mot : " + secretWord); - wordLbl.setText(spaced(secretWord)); // affichage propre du mot + wordLbl.setText(spaced(secretWord)); // pretty display of the word gameOver = true; disableInput(); } else if (errors >= MAX_ERRORS) { @@ -210,24 +200,24 @@ public class HangmanGUI extends JFrame { disableInput(); } - // force le rafraîchissement de l'interface + // force UI refresh revalidate(); repaint(); } - /** Désactive les contrôles après la fin du jeu. */ + /** Disable controls after the game ends. */ private void disableInput() { input.setEditable(false); guessBtn.setEnabled(false); } - /** Sélectionne un mot aléatoire. */ + /** Pick a random word. */ private String pickWord() { Random rnd = new Random(); return words[rnd.nextInt(words.length)].toLowerCase(Locale.ROOT); } - /** Construit le mot masqué selon les lettres trouvées. */ + /** Build the masked word based on found letters. */ private String maskWord(String secret, Set foundSet) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < secret.length(); i++) { @@ -240,7 +230,7 @@ public class HangmanGUI extends JFrame { return sb.toString(); } - /** Vrai si toutes les lettres du mot ont été trouvées. */ + /** True if all letters have been found. */ private boolean isWin(String secret, Set foundSet) { for (int i = 0; i < secret.length(); i++) { char lc = Character.toLowerCase(secret.charAt(i)); @@ -249,7 +239,7 @@ public class HangmanGUI extends JFrame { return true; } - /** Trie et joint les lettres pour affichage. */ + /** Sort and join letters for display. */ private String joinChars(Set set) { java.util.List list = new ArrayList<>(set); Collections.sort(list); @@ -261,7 +251,7 @@ public class HangmanGUI extends JFrame { return sb.toString(); } - /** Ajoute des espaces entre les lettres pour une lecture plus claire. */ + /** Add spaces between letters for nicer reading. */ private String spaced(String s) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < s.length(); i++) {