From d8647f43ac27db971c57cb28d5b5962fc894d4bc Mon Sep 17 00:00:00 2001 From: Jannaire Date: Wed, 8 Oct 2025 17:02:53 +0200 Subject: [PATCH] reparation peut etre --- Jeu_pendu/Back/Words.java | 182 +++++++++++------- Jeu_pendu/Front/GameUI.java | 130 +++++++------ Jeu_pendu/out/back/Check.class | Bin 0 -> 494 bytes Jeu_pendu/out/back/Game.class | Bin 0 -> 3744 bytes Jeu_pendu/out/back/Result.class | Bin 0 -> 827 bytes Jeu_pendu/out/back/Words.class | Bin 0 -> 3931 bytes .../out/front/Gallows$BufferedImage.class | Bin 0 -> 315 bytes Jeu_pendu/out/front/Gallows.class | Bin 0 -> 2197 bytes Jeu_pendu/out/front/GameUI$1.class | Bin 0 -> 625 bytes Jeu_pendu/out/front/GameUI.class | Bin 0 -> 6288 bytes Jeu_pendu/out/front/MenuUI.class | Bin 0 -> 2494 bytes Jeu_pendu/out/main/Main.class | Bin 0 -> 956 bytes 12 files changed, 183 insertions(+), 129 deletions(-) create mode 100644 Jeu_pendu/out/back/Check.class create mode 100644 Jeu_pendu/out/back/Game.class create mode 100644 Jeu_pendu/out/back/Result.class create mode 100644 Jeu_pendu/out/back/Words.class create mode 100644 Jeu_pendu/out/front/Gallows$BufferedImage.class create mode 100644 Jeu_pendu/out/front/Gallows.class create mode 100644 Jeu_pendu/out/front/GameUI$1.class create mode 100644 Jeu_pendu/out/front/GameUI.class create mode 100644 Jeu_pendu/out/front/MenuUI.class create mode 100644 Jeu_pendu/out/main/Main.class diff --git a/Jeu_pendu/Back/Words.java b/Jeu_pendu/Back/Words.java index 7632427..8ae5e15 100644 --- a/Jeu_pendu/Back/Words.java +++ b/Jeu_pendu/Back/Words.java @@ -2,95 +2,129 @@ package back; import java.io.IOException; import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; +import java.nio.file.*; import java.security.SecureRandom; import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import java.util.stream.Stream; /** - * Fournit les mots pour le jeu. - * - Lit d'abord "bibliothèque/mots.txt" (UTF-8), 1 mot par ligne. - * - Ignore les lignes vides et celles qui commencent par '#'. - * - Si le fichier est introuvable ou vide, bascule sur une liste par défaut. + * Gère la bibliothèque de mots (chargement + sélection aléatoire). + * - Lit "bibliothèque/mots.txt" OU "Bibliotheque/mots.txt" (UTF-8), 1 mot par ligne. + * - Ignore lignes vides et commentaires (#...). + * - Fournit des helpers pour tirer des mots selon la difficulté. */ public class Words { - /** Chemin du fichier de mots (relatif à la racine du projet). */ - private static final Path WORDS_PATH = Paths.get("Bibliotheque", "mots.txt"); + /** Chemins possibles (accents/casse) pour maximiser la compatibilité. */ + private static final Path[] CANDIDATES = new Path[] { + Paths.get("bibliothèque", "mots.txt"), + Paths.get("Bibliotheque", "mots.txt") + }; - /** Liste de secours si le fichier n'est pas disponible. */ - private static final List DEFAULT = List.of( - "algorithm", "variable", "function", "interface", "inheritance", - "exception", "compiler", "database", "network", "architecture", - "iteration", "recursion", "encryption", "framework", "protocol" - ); + /** Liste de secours si aucun fichier trouvé/valide. */ + private static final List DEFAULT = new ArrayList<>(); + static { + Collections.addAll(DEFAULT, + "algorithm","variable","function","interface","inheritance", + "exception","compiler","database","network","architecture", + "iteration","recursion","encryption","framework","protocol", + "java","pendu","ordinateur","developpement","interface" + ); + } - /** RNG partagé et cache des mots chargés. */ - private static final SecureRandom RNG = new SecureRandom(); + /** Cache mémoire + RNG. */ private static volatile List CACHE = null; + private static final SecureRandom RNG = new SecureRandom(); - /** - * Retourne un mot choisi au hasard depuis le fichier ou la liste par défaut. - * Déclenche un chargement paresseux (lazy-load) si nécessaire. - */ - public static String random() { - ensureLoaded(); - return CACHE.get(RNG.nextInt(CACHE.size())); - } - - /** - * Recharge les mots depuis le fichier. Utile si modification de mots.txt à chaud. - */ - public static synchronized void reload() { - CACHE = loadFromFileOrDefault(); - } - - /** Garantit que le cache est initialisé. */ - private static void ensureLoaded() { - if (CACHE == null) { - synchronized (Words.class) { - if (CACHE == null) { - CACHE = loadFromFileOrDefault(); - } - } - } - } - - /** Tente de charger depuis le fichier, sinon renvoie la liste par défaut. */ - private static List loadFromFileOrDefault() { - List fromFile = readUtf8Lines(WORDS_PATH); - if (fromFile.isEmpty()) return DEFAULT; - return fromFile; - } - - /** - * Lit toutes les lignes UTF-8 depuis le chemin fourni, - * en filtrant vides et commentaires (# ...). - */ - private static List readUtf8Lines(Path path) { - List result = new ArrayList<>(); - try (Stream lines = Files.lines(path, StandardCharsets.UTF_8)) { - lines.map(String::trim) - .filter(s -> !s.isEmpty()) - .filter(s -> !s.startsWith("#")) - .forEach(result::add); - } catch (IOException e) { - // Silencieux : on basculera sur DEFAULT - } - return result; - } - - /* Retourne la liste complète des mots disponibles */ + /** Renvoie la liste complète (copie) — charge une seule fois si nécessaire. */ public static List all() { ensureLoaded(); return new ArrayList<>(CACHE); } - /* Petit utilitaire pour afficher un mot masqué dans les messages */ - public static String hiddenWord(Game g) { - return g.maskedWord().replace(' ', '_'); + /** Renvoie un mot aléatoire dans tout le dictionnaire. */ + public static String random() { + ensureLoaded(); + return CACHE.get(RNG.nextInt(CACHE.size())); } -} \ No newline at end of file + + /** Renvoie un mot aléatoire de moins de 8 lettres (sinon bascule sur random()). */ + public static String randomShortWord() { + ensureLoaded(); + List list = new ArrayList<>(); + for (String w : CACHE) if (w.length() < 8) list.add(w); + if (list.isEmpty()) return random(); + return list.get(RNG.nextInt(list.size())); + } + + /** Renvoie un mot aléatoire de 8 lettres ou plus (sinon bascule sur random()). */ + public static String randomLongWord() { + ensureLoaded(); + List list = new ArrayList<>(); + for (String w : CACHE) if (w.length() >= 8) list.add(w); + if (list.isEmpty()) return random(); + return list.get(RNG.nextInt(list.size())); + } + + /** Renvoie une paire [court, long] pour le niveau difficile. */ + public static List randomPair() { + List pair = new ArrayList<>(2); + pair.add(randomShortWord()); + pair.add(randomLongWord()); + return pair; + } + + /** Force le rechargement du fichier (au cas où le contenu change en cours d’exécution). */ + public static synchronized void reload() { + CACHE = loadFromFileOrDefault(); + } + + // -------------------- internes -------------------- + + /** Charge le cache si nécessaire (thread-safe). */ + private static void ensureLoaded() { + if (CACHE == null) { + synchronized (Words.class) { + if (CACHE == null) CACHE = loadFromFileOrDefault(); + } + } + } + + /** Tente chaque chemin candidat, sinon retourne DEFAULT mélangé. */ + private static List loadFromFileOrDefault() { + List data = readFirstExistingCandidate(); + if (data.isEmpty()) { + data = new ArrayList<>(DEFAULT); + } + Collections.shuffle(data, RNG); // casse tout déterminisme initial + return data; + } + + /** Lit le premier fichier existant parmi les candidats. */ + private static List readFirstExistingCandidate() { + for (Path p : CANDIDATES) { + List list = readUtf8Trimmed(p); + if (!list.isEmpty()) return list; + } + return new ArrayList<>(); + } + + /** Lit un fichier UTF-8, filtre vides/commentaires, force lowercase. */ + private static List readUtf8Trimmed(Path path) { + List out = new ArrayList<>(); + try { + List lines = Files.readAllLines(path, StandardCharsets.UTF_8); + for (String raw : lines) { + if (raw == null) continue; + String s = raw.trim().toLowerCase(); + if (s.isEmpty() || s.startsWith("#")) continue; + // On accepte lettres/accentuées + tiret (simple et robuste) + if (s.matches("[a-zàâçéèêëîïôûùüÿñæœ-]+")) out.add(s); + } + } catch (IOException ignored) { + // on tombera sur DEFAULT + } + return out; + } +} diff --git a/Jeu_pendu/Front/GameUI.java b/Jeu_pendu/Front/GameUI.java index 211598f..5337347 100644 --- a/Jeu_pendu/Front/GameUI.java +++ b/Jeu_pendu/Front/GameUI.java @@ -9,64 +9,67 @@ import java.util.ArrayList; import java.util.List; /** - * Interface graphique du jeu du pendu avec gestion des difficultés. - * - Niveau 1 : mots de moins de 8 lettres - * - Niveau 2 : mots de 8 lettres ou plus - * - Niveau 3 : deux mots à deviner à la suite (un court + un long) - * Toutes les méthodes ≤ 50 lignes. + * Interface graphique du pendu avec niveaux : + * - 1 : mots < 8 lettres + * - 2 : mots ≥ 8 lettres + * - 3 : deux mots (score + chrono cumulés) + * Boutons : Essayer / Nouvelle partie / Menu / Quitter. + * (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, menuBtn; + private JButton tryBtn, newBtn, menuBtn, quitBtn; private Game game; private List words; private int index = 0; - private int level; + private final int level; private String currentWord = ""; private Timer timer; - /** Constructeur : reçoit la difficulté (1, 2 ou 3) */ + // Cumul de session (niveau 3) + private long sessionStartNano = -1L; + private int sessionScore = 0; + + /** Reçoit la difficulté (1, 2, 3). */ public GameUI(int level) { this.level = level; } - /** Affiche la fenêtre et lance la partie (ou séquence) */ + /** Affiche la fenêtre et lance la session. */ public void show() { setupWindow(); setupLayout(); setupActions(); - prepareWords(); - startRound(); + startNewSession(); frame.setVisible(true); } - /** Prépare la liste des mots selon la difficulté choisie */ - private void prepareWords() { - words = new ArrayList(); - List all = Words.all(); - - if (level == 1) { // mots courts - for (String w : all) if (w.length() < 8) words.add(w); - } else if (level == 2) { // mots longs - for (String w : all) if (w.length() >= 8) words.add(w); - } else if (level == 3) { // un court + un long - String shortW = null, longW = null; - for (String w : all) { - if (shortW == null && w.length() < 8) shortW = w; - if (longW == null && w.length() >= 8) longW = w; - if (shortW != null && longW != null) break; - } - if (shortW != null) words.add(shortW); - if (longW != null) words.add(longW); - } - - if (words.isEmpty()) words.add(Words.random()); + /** Démarre une nouvelle session (nouveaux mots, reset chrono/score session). */ + private void startNewSession() { + sessionStartNano = System.nanoTime(); + sessionScore = 0; + index = 0; + prepareWords(); + startRound(); } - /** Crée la fenêtre principale */ + /** Prépare la liste des mots selon le niveau (aléatoire géré dans Words). */ + private void prepareWords() { + words = new ArrayList<>(); + if (level == 1) { + words.add(Words.randomShortWord()); + } else if (level == 2) { + words.add(Words.randomLongWord()); + } else if (level == 3) { + words = Words.randomPair(); // [court, long] aléatoires + } + if (words.isEmpty()) words.add(Words.random()); // filet de sécurité + } + + /** Fenêtre principale. */ private void setupWindow() { frame = new JFrame("Jeu du Pendu"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); @@ -75,7 +78,7 @@ public class GameUI { frame.setLayout(new BorderLayout(12, 12)); } - /** Construit la mise en page et les composants */ + /** Layout + composants. */ private void setupLayout() { imgLabel = new JLabel("", SwingConstants.CENTER); frame.add(imgLabel, BorderLayout.CENTER); @@ -90,14 +93,15 @@ public class GameUI { top.add(buildTopLine(triedLabel, timeLabel)); frame.add(top, BorderLayout.NORTH); - // --- Bas : boutons + saisie JPanel bottom = new JPanel(new BorderLayout(8, 8)); JPanel inputPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); input = new JTextField(5); tryBtn = new JButton("Essayer"); + newBtn = new JButton("Nouvelle partie"); inputPanel.add(new JLabel("Lettre :")); inputPanel.add(input); inputPanel.add(tryBtn); + inputPanel.add(newBtn); JPanel actionPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); menuBtn = new JButton("Menu"); @@ -110,7 +114,7 @@ public class GameUI { frame.add(bottom, BorderLayout.SOUTH); } - /** Construit une ligne (label gauche + espace + label droit) */ + /** Ligne d’infos (gauche/droite). */ private JPanel buildTopLine(JLabel left, JLabel right) { JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT)); p.add(left); @@ -119,16 +123,17 @@ public class GameUI { return p; } - /** Branche les actions + timer */ + /** Actions + timer. */ private void setupActions() { tryBtn.addActionListener(this::onTry); input.addActionListener(this::onTry); - quitBtn.addActionListener(e -> frame.dispose()); + newBtn.addActionListener(e -> startNewSession()); menuBtn.addActionListener(e -> returnToMenu()); + quitBtn.addActionListener(e -> frame.dispose()); timer = new Timer(1000, e -> refreshStatsOnly()); } - /** Retour au menu principal */ + /** Retour vers le menu de sélection. */ private void returnToMenu() { timer.stop(); frame.dispose(); @@ -136,11 +141,12 @@ public class GameUI { menu.show(); } - /** Démarre un nouveau mot (ou termine au niveau 3) */ + /** Démarre un nouveau mot (ou termine la session si plus de mots). */ private void startRound() { if (index >= words.size()) { - showMsg("🎉 Niveau terminé !"); - frame.dispose(); + int total = (level == 3) ? sessionScore : game.getScore(); + long secs = (level == 3) ? getSessionSeconds() : game.getElapsedSeconds(); + showMsg("Niveau terminé !\nScore total : " + total + "\nTemps : " + secs + "s"); return; } currentWord = words.get(index++); @@ -151,7 +157,7 @@ public class GameUI { refreshUI(); } - /** Tente une lettre (clic bouton ou Entrée) */ + /** Tente une lettre (bouton/Entrée). */ private void onTry(ActionEvent e) { String text = input.getText(); if (!Check.isLetter(text)) { @@ -167,24 +173,28 @@ public class GameUI { checkEnd(); } - /** Vérifie la fin du mot et enchaîne si besoin (niveau 3) */ + /** Fin du mot → affiche popup et enchaîne (lvl 3 cumule score/chrono). */ private void checkEnd() { if (!(game.isWin() || game.isLose())) return; - timer.stop(); game.end(game.isWin()); - String verdict = game.isWin() ? "Bravo !" : "Perdu !"; - String msg = verdict + " Le mot était : " + currentWord - + "\nScore : " + game.getScore() - + "\nTemps : " + game.getElapsedSeconds() + "s"; - showMsg(msg); + int displayScore = (level == 3) ? sessionScore + game.getScore() : game.getScore(); + long displaySecs = (level == 3) ? getSessionSeconds() : game.getElapsedSeconds(); + + showMsg((game.isWin() ? "Bravo !" : "Perdu !") + + " Le mot était : " + currentWord + + "\nScore : " + displayScore + + "\nTemps : " + displaySecs + "s"); if (level == 3 && index < words.size()) { + sessionScore += game.getScore(); startRound(); + } else { + timer.stop(); } } - /** Rafraîchit image + textes + stats */ + /** Refresh complet. */ private void refreshUI() { imgLabel.setIcon(Gallows.icon(game.getErrors())); wordLabel.setText("Mot : " + game.maskedWord()); @@ -193,13 +203,23 @@ public class GameUI { frame.repaint(); } - /** Rafraîchit uniquement score + chrono */ + /** Refresh stats (score/chrono). */ 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"); } - /** Affiche un message */ + /** Secondes écoulées depuis le début de la session (niveau 3). */ + private long getSessionSeconds() { + long now = System.nanoTime(); + long delta = now - sessionStartNano; + if (delta < 0) delta = 0; + return delta / 1_000_000_000L; + } + + /** Popup info. */ private void showMsg(String msg) { JOptionPane.showMessageDialog(frame, msg); } diff --git a/Jeu_pendu/out/back/Check.class b/Jeu_pendu/out/back/Check.class new file mode 100644 index 0000000000000000000000000000000000000000..95b07da470d7a2b29d8b4bde724c666a1f25b9d1 GIT binary patch literal 494 zcmX^0Z`VEs1_pBmWiAGG1|cp6egAp#;qxfsM4#Mv1n*cl`l8Q5$x^D;~97#Wx~ zG{YDfSe)}yQW+WeeKPY>{YrC_Qj0?D9{_N=+_75rSCH z$iPxkl$p!OAflm(={80Nww%--4P{_rU}9ikP|-Thz{Y&Q()EK&iZb)ktr;2Elkv$N}Gi=~t*vPPnhha0wEe;I!j10nHeP9nb78NB{f&v=k zw=Ike0#5n)CB-F0i3Pr?B^miC#r$jxTLl=l@v|~)7hu@I!?2TK7Z1a3hCMtCdl~le zFzg38<^aP%n4w_Dz>_t|e}~u^4)ZV^VK~ae5DD`85r$)o44mLJ1`1e41_7{Zz#9FN zvcMUN4=eBLjCyzE6I6YLRmyDAggEA6!{n zlA6oNz>$}jmmiXu3rhGJ&YI4Q4D4lzIi;!oX^adKpez8k4(uejU#uA!c)`M8X9cI0 zFfwo?=jW9qX66+$GKeDQIEXi_L1~{G>`_Q&Vq{=<^a*lxbctkS;6=-2%!w%}j126V zc`2zCAXk7Aq9-E*vxjF0BLj=CXK*kh16xjNUV2FeBLiDhtugX$Yd2tkvHH6sH@Nj^k~kwFsb1F-j;^K)`ilS?x5^Q<+)xEPKz zoM2>7hbjOE3)G89nI9^m=?N;MPcky-A}dFPB9ab-AgCx{PtMORNCXvd5-3^S87vHn zacf2fmg4-P5)8M3^nn$Cb8{vX9?!hI)FS7c z#Ny)AVn&8D$iWRY50ZsF67y1WQj1j}8m*Ch1c`cN5fqIfl?AEfNkXi|uNOHSq1HMl z=HvutmZX9zP-toh$p_^~BsU``8g_;&j0~z6!HCV{!yp7I;8FN?4EA6-2Po|brJWd@!Qw7pnwx=mpFxU2ib0-1o?gCG;bOa}H%3_=?aV!})e z;aXc5xMj96h|FeC*V@9s0#OW>5a8OzAgZ;EL2M=ihZf5=2JuY{5*xGxenUhhL88oH zQK=2!-~hQ;kAa(kfkB&rl|hF=l0lC_ok5?$h{1rtfx(c$jlq~9h{1#*jKPc{hQXX6 zgTaEqn}LCWlY!+AgCwH`vmgT_gAao*)FTHNm>F0Y7#MPQGe}2nXOQt>wv_=nb{m82 zB8D&!OJ*B`oSp0r2KiYGJle9`7!<;nGbn>RA&c-aT!KqmAReRyW(G^jA_gvP0R@m) z3lrn=|4X&EF(@K@0ttIN1`Y;$22lnF1~~>t20aER26qN$20sQDh9m}ih71Nbun$BT z*#0tbu`@_B{$WsNlwkYCApDDgm4Ojdw?loC4~-UcW*cdc+rhrj2C<~KG054<>|l_e z$sh`HJR}ALnHXjCxawcLb(iGh)Ufk9Af3xkr@76zV$4D2k+8CaMR#946?dA8MGJ~4lrn2vFJ#$>|oH@ z$)L-`5Wf8X106)HKztv=0BSplGsH2-GsH7^G9-YVEy%$1k3o%{Ary?lelaLP^L97` zBSQpMudtzeC5?d*)Q*ArI+lS2>=jL|EexETQ|2*nff&mf*mf}RI>>8nVc<)3QskU6 zhk=#TNl}DBFLy0GnuNe#K6T+%pk~6!XU~}%Am|p#$e1)&S1+>33dw$0~41K0~4qj z3Ux&|12Y2?0|SGq^c)6Wt;j75N-POm8I(XQHt7UVv9*PPZ4LtmxCld728oqg1{Q{T z20n&H1__2H1{H>8m?eCo49pDi;GjuhILE-iz{SAGaE9R$!&wGNhE@g!1|9}RhBgLf KhIWPyhE4z-L}-Zs literal 0 HcmV?d00001 diff --git a/Jeu_pendu/out/back/Result.class b/Jeu_pendu/out/back/Result.class new file mode 100644 index 0000000000000000000000000000000000000000..33ddf159df608a9aabbe4ed419868ae765334c73 GIT binary patch literal 827 zcmX^0Z`VEs1_pBm15O4O24yY=6$Vvy1`&1!H7*7|26Ygj!NI`K#lXU#0aBsK!5|2t zwKy1rK(sbHgAOADvxjF0BLlBbQetwpeo$(0X-WhsB17I179?nTDG#poYK@{Mg{>5O>{XH=lqmZMh1SL%)C^;(%hufqL9R-oK!{z zcCaS@G)4wR4WF#UvPAuy#JqI<;F6-uymV_#bSrE!^D;~97#YN{DE8D0V`ShA&P>ls zEGaEYWn^I10EuweB_N47v<@j11gJ!NkKL$)L}}Ak84d!@$oVz{4O2B7_(O7#a9LS|L6H*~iGhnw*oL zm&(W>qM?c87XPHI)MQX_n<9J5IVZ8W*cwS0JWxAIPPX(i4$u@V4ls+_I> literal 0 HcmV?d00001 diff --git a/Jeu_pendu/out/back/Words.class b/Jeu_pendu/out/back/Words.class new file mode 100644 index 0000000000000000000000000000000000000000..cf6b8bbf8ceb86bf14135674138037d8f1ea984c GIT binary patch literal 3931 zcmX^0Z`VEs1_pD6dt40W43S(6Tntg13|tJ+AR>mF!G|H1i@}s34#bLQXGj1kNMvV7 z0!b%>I4K~RR1i0fogtlzfuA9glOcm4lZzpXAzO%nfuWF_A&{X+h=Gxz48$rIVqjt@ z<6@{}s1jmeW~c*+)q{uzc7{eS1{sDXc7|pSh88Xc4u)0`k;=i)#=+3e#n8df$-&UY z!O+dY(8Iyd%fZmc!O+jaFoA<%A_v1H4u;7b3{yB5rgAV$<6xN1!7u~lu$k-(vq0{T zWM`Po$iNluALJ4oAK)0`!N?%ula*MOsGpaaub-Bgld2z(SdwAQ$iVL6>gE{g6T-+K z08vm{l9{9LlUZD1&B(wRoSB}NSW;S)%E+LCCT#=Z=OpH(>j#$gN`<>$I(=A`-;xum8gmgbZ&G6=zpMR=Z_VGbjM z8iqIyU-K5FCZ>dzq*;KRUJTL*aVBbLL*0&S$y|1Zd5jEJ8pJ5aVYgULVs27Oq6&%= zR16szM4_f4hm~d&BLj8~28;|GHpw~A2;mCOFD*(=1%(qR9px9L6zhS~4-bPQgA)&f z2Z(TBu;yW~W3cC8n9s0)hhZVZA|8gt3`-ap1VAeFk*wum@M7?0WZ+6lOwQI12N}l0 zV8LL?!{Eo@&%>~kVHppD6@xV+gD_YlID8z7iV`b9$&j64IS<1MhL!9Lt9TezGpu1` z5OB)RFDWi5N-XeAEy>7FDduNmSS!G=j-Qoby#T`o9)^t!n|K&DGi(uH*vikwuuXs= zgoj}}!ww#XoeaD9*%)@SGwk7E*vqg^fMFj$C&PXLh66kd2N@3WFdSw$!ozTs!3pLP zuopryit@`r>5zxv7{hUxRA#=ur@w1Oa%w?IW_}(c1EVqz!wH5EMg|_I%%q&m{F02+ z!qQYm29DhPl48A*iV}8)lc3-^#mK;!n3JAglv$FI%gDe{mROVtGMtftBds(q8Dbb` zW?o5ZQCebhDkB4TW?n{WQD#YE9*D=8im;L+IX|}`Gbgo(k%1#6u_Q4mu{f2Hfjuv^ zq&&YUn~{Mhu_!qsvm`Ycl7TrhOHzvxp%xT@GGsB>emvQm>v7#aA$>cO!IibzHVA+P{So?v7U2MdB# z6_*sHCgy@llhnjqMh2GR%&Jsy+29HGRz-Myp$WKem)$e@qxMo`+fMs^iE{G9Xiic51-i$Li$Ex*V$F*ySi7Lf1)I}lST$R5_@ zoP1DL=S@sW2`()tC`v6Z232h^@%JQ>Q^?ktgn{R4KVp?KyNq$i!BLjCXg2&EqhmnEJCqF;C zw1AO;$1^W4wa7UqvA7tNAKoOUX$sR)J`=#`GwX2#Us#%7Rp6<-|)u zti-Pu8obE7f51T{t(Y%~J{`wj-q%?!*4 zJ0Thj7}yvL8Mr_V7N~||1}3mkN}Cv%k2A;#aYcF`0y8-wCTJaA&cNZLby$1?$36ayOr1A{388-p1GH-kBYAcF;iID-{~B7+TsCj$cmKLhh0 z261)*PdPcurv5TnSqsofgx)*1ApXp1_2+f zO$>rN7=(Ovb}=ZnLdwBA7*sYha0~E5_^QE?EJA9* zk*q@M!I5l28o`n5LYl#m970;bkpgT&+QE?m>_R%hkpdh-y1|hGoI-lRkpf&o`oWO` z+(HJykpetIhQW~nyh297kpg@|#=$!nOg1y{?Pf5I+|FROnSq57B~J)3urM$%h%pE< zNHP>KC@@qpC^9fJgo8sPg5f#?0|OTWBg0jO+YHwjBpGrT7#Oq|SQv5{m>KdI@)-)i UtYU@|hEgc20?Mjps9~rD0D|P{QUCw| literal 0 HcmV?d00001 diff --git a/Jeu_pendu/out/front/Gallows$BufferedImage.class b/Jeu_pendu/out/front/Gallows$BufferedImage.class new file mode 100644 index 0000000000000000000000000000000000000000..523522f5cdc1ad6e98ccd52b8c04b712830ef0c6 GIT binary patch literal 315 zcmX^0Z`VEs1_pBmAua}H1|D_>UUminMg}&U%)HDJJ4OaJ4Np%`%`ip=7U%qwR7M7V zpUk{eztY^K)S{5Yq?}Yn2Cm@z(xT*4w@eU+$2~D8C%?Q{FDtPuk&%JJFSWSDBfq$W zok5U?frWvUkwH4GC_k@6AF58psWdGuwJ0^kGdD3km63rLjnCtmmzP@PoRe5woLbDt zAOkX1Ke4<-KNF;0A5AqcirEYb3``8n3?RVBzzDLPfsuiYfq_AVfrWvEfq{WTOIk*D zI|JiJ1_lO326hGp1}+9B1_lOe26hG;24)5h1_lNu22KVpFwM=t4_3j*z{J4Kz{kJ^ E037K;rvLx| literal 0 HcmV?d00001 diff --git a/Jeu_pendu/out/front/Gallows.class b/Jeu_pendu/out/front/Gallows.class new file mode 100644 index 0000000000000000000000000000000000000000..a93d73deefd8f8dafaabc7ccd98a10d63f231ca1 GIT binary patch literal 2197 zcmX^0Z`VEs1_pD6RxSov1~YaBb1nu821^iO#mT_LV9m~8!^ObHV9Ui|$6(LS;K0e? z$l%1qz{%hYB3wXRR}jk$M7Vgw0%By~L#XmiEXiPGV9w3VV`N~}@buL5 z1o09p7#Y|!JUu-@$pWGp6b9h5!^ps$o>~G64n_u14M@bIgpxJP5|B3M{G9wEMg}e) zPj`=yc=sU3NJa($NcwW?1g#-{V^7H}F32xVWn@6M66{ZFkd>UpsRfBei6!|( zTnse~wTukBpiEj)%$Nzvy2XqP;<<_0sm}R%$%!T5nI##pj9ARbpoYa#Xh5NRbduPi@16GGHi*k1>D?MRh@nO}C+6e?XO^T| zvoo|XGN@vB2%Fm&8RYP*V^CyZVvuEEU|?pD0_9W&1_mhxB?e^%Mg|oI1_mYuRR$>r zH3oGC1_l-eMo`hjz{sG*z`!8Oz{tSJz`($&wVi=+BLf2iBZD@m#0Cp;GjKBKFz7;+ z>M}4hFflMN2r^3vum)cU{GP;W>96|0+j(!tT(GTRtFM|m~5Q8ZL2ZI5FCe)Ez7+4uVwN>mU2H{-{A`A?h z8AJux_c91>W?*HumJ(oF%;2(#L39&?u+%OFF$M;o-3;Q9+S?fi1A`=k4+8^(2m>>NF9RckAD9dTlVJdS C%nRQD literal 0 HcmV?d00001 diff --git a/Jeu_pendu/out/front/GameUI$1.class b/Jeu_pendu/out/front/GameUI$1.class new file mode 100644 index 0000000000000000000000000000000000000000..9d394d7cb012a729bbc496cbbd2f5009b0ab1b90 GIT binary patch literal 625 zcmX^0Z`VEs1_pBmZ7v2e260XX4h9KM1~CRn5Lb$wK^nx70THt7407xY3XBY5D#7KM zCCM4Si3KW2iOJb2L8-;1IVFq?Owpc<3>-GeIhlExC3cJq%o>_uj0`N!`6;Q44E#Qs zd8vM-xk;%-A&E&jsf-M~!6k{w*}jPdP(D|1erZv1s#_*VlG{BoH#O8#FDtPuk&%Jl zH7_|Qzc@25-8Z!)BR_?mL6MPx!!NbC#3R4Bgq=Z&he4S^g@=KQft!axl|hY%L7hQ^ zkwFTiTR$f;FJ0d+Ke#kG!!0v4C&jg>D8Gn@K@+4*i$RT%fiJBnKd(d|Vxx*7BLk0T zUS4XEb53G$acVImg8;%9|D>$czHfI)zPfkBXg zEu5W!mBANIFt9KPGB7YOF$ggTGcYi)Fo-ZPFo=RhL>S~57#O%17#TPi7#J7?H~^sL Bd;b6c literal 0 HcmV?d00001 diff --git a/Jeu_pendu/out/front/GameUI.class b/Jeu_pendu/out/front/GameUI.class new file mode 100644 index 0000000000000000000000000000000000000000..457966a2b284d81d97dbc63ab3514e802a5caedb GIT binary patch literal 6288 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 literal 0 HcmV?d00001 diff --git a/Jeu_pendu/out/main/Main.class b/Jeu_pendu/out/main/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..e1df1b8570771ac824ba7999914662316780a46e GIT binary patch literal 956 zcmX^0Z`VEs1_pBmBQ6FG1|cB^1_p611_=g9b_OXf1{MY(5FyRZAj8fe%gDfHlbM%U zV#mn9tf3jk$iU*9pOVVR!0(fpm+DuVo0M7?UR*QmZ+bT zn3t{}TvC*omu?Nx$eWXxo0O8M0#c@8z{tQAoL^d$oa&Yd(#+|bn3<;s(#ONV$-u?P zAmEgrUs7CBlvv=KT9T2UQq0fBASb}U#m~kd&%>a=pvcak#KWM>pu)(&lU9_USEBEp zn422v$-|%u(#{F8MIU4+BZC0QScr4{ld@8iOSl-+7}U8K*cmh!8JLSo!H(8Ma&%B> zULMF#){G2NAiWj(#pRhG&w$9#lFXdUlFZa%Mh5Q8yt4f4RG-9>)FMU(aSd!nfPBtU zoRMG7&Y;P|pv9oa!@v)6pc2Snh@&8;==*?!$2YYkF)cB3}l9O7j0?}xV%845=(g zMOIF{B*aSmdXa-0YO-@;PEK%UNvbtFgCQe>Dn|HV^A96~9Da2SiVW-w91I}9%)kgr zS`3T~+zbp1vJ8w2j0_A6tXkU{7&kI7FfcOkFfcH%fdx4kI2m{u_@GKvp-MS-F)%SO z>|kIFMVEmIY!L5m2A0U}46NQ-+Zfmo+V~il85kIN88{gD z7(nTPnL&Vofq{uZkU^J$fq{#GkwKe5pFxK~l0le(fq{pCkwJuknL(66j6oCt2tMf@ literal 0 HcmV?d00001