From ba7e16dc646dd69f26b938e47b5b0159cbb03395 Mon Sep 17 00:00:00 2001 From: dick Date: Wed, 8 Oct 2025 12:13:42 +0200 Subject: [PATCH 1/7] Fenetre et Dessin v1 --- src/Dessin.java | 99 +++++++++++++++++++++---- src/Fenetre.java | 187 +++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 259 insertions(+), 27 deletions(-) diff --git a/src/Dessin.java b/src/Dessin.java index a189d2c..92435cc 100644 --- a/src/Dessin.java +++ b/src/Dessin.java @@ -1,23 +1,94 @@ +import javax.swing.*; +import java.awt.*; /** -* La classe Dessin +* La classe Dessin gère uniquement le dessin du pendu * -* @version -* @author -* Date : +* @version 0.1 +* @author Adrien +* Date : 08-10-2025 * Licence : */ -public class Dessin { - //Attributs +public class Dessin extends JPanel { - //Constructeur - public Dessin() { + // --- 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)); + } - } - //Méthodes + // --- Dessin principal --- + @Override + protected void paintComponent(Graphics graphics) { + super.paintComponent(graphics); - //Affichage - public String toString() { - return "" ; - } + // 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); + + // Repères et proportions + int width = getWidth(); + int height = getHeight(); + int marginPixels = Math.min(width, height) / 12; // marge proportionnelle + + // 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 + int beamLength = width / 3; + graphics2D.drawLine(postXCoordinate, marginPixels, postXCoordinate + beamLength, marginPixels); + + // Renfort diagonal + graphics2D.drawLine(postXCoordinate, marginPixels + height / 10, + postXCoordinate + width / 12, marginPixels); + + // Corde + int ropeXCoordinate = postXCoordinate + beamLength; + int ropeTopYCoordinate = marginPixels; + int ropeBottomYCoordinate = marginPixels + height / 12; + graphics2D.drawLine(ropeXCoordinate, ropeTopYCoordinate, ropeXCoordinate, ropeBottomYCoordinate); + + // 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); + + // 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(); + } + + // Affichage + @Override + public String toString() { + return ""; + } } diff --git a/src/Fenetre.java b/src/Fenetre.java index bec8a54..830c436 100644 --- a/src/Fenetre.java +++ b/src/Fenetre.java @@ -1,23 +1,184 @@ +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.util.function.Consumer; /** -* La classe Fenetre +* La classe Fenetre gère uniquement l'interface graphique : +* - zone de dessin (remplaçable par la classe Dessin) +* - affichage du mot masqué +* - saisie d'une lettre (événement remonté via un handler) * -* @version -* @author -* Date : -* Licence : +* Aucune logique de jeu (choix/vérification du mot) n'est ici. +* +* * @version 0.3 +* @author Adrien +* Date : 08-10-25 +* Licence : */ + public class Fenetre { - //Attributs - //Constructeur - public Fenetre() { + // --- Composants de l'interface (UI only) --- + private JFrame window; + private JLabel wordLabel; + private JTextField letterInput; + private JButton sendButton; + private JPanel drawZone; // remplaçable par la classe Dessin + // Handler externe pour la lettre soumise (fourni par la classe Partie / contrôleur) + private Consumer onLetterSubmitted; + + // --- Constructeur (courte orchestration uniquement) --- + public Fenetre() { + setupWindow(); + JPanel root = createRoot(); + window.setContentPane(root); + + drawZone = createDrawZone(); + root.add(drawZone); + + wordLabel = createWordLabel(); + root.add(wordLabel); + + JPanel inputPanel = createInputPanel(); + root.add(inputPanel); + + window.setVisible(true); + letterInput.requestFocusInWindow(); + } + + // --- Initialisation fenêtre --- + /** Configure la fenêtre principale (titre, taille, fermeture). */ + private void setupWindow() { + window = new JFrame("Jeu du Pendu"); + window.setSize(600, 600); + window.setLocationRelativeTo(null); + window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + } + + /** Crée le conteneur principal vertical. */ + private JPanel createRoot() { + JPanel root = new JPanel(); + root.setLayout(new BoxLayout(root, BoxLayout.Y_AXIS)); + return root; + } + + // --- Sous-composants UI --- + /** Crée la zone de dessin placeholder (à remplacer par Dessin). */ + private JPanel createDrawZone() { + JPanel panel = new PlaceholderDrawPanel(); + panel.setPreferredSize(new Dimension(600, 350)); + panel.setBackground(new Color(245, 245, 245)); + return panel; + } + + /** Crée le label d'affichage du mot (placeholder jusqu'à injection par Partie). */ + private JLabel createWordLabel() { + JLabel label = new JLabel("_ _ _ _ _", SwingConstants.CENTER); + label.setFont(new Font("Segoe UI", Font.BOLD, 32)); + label.setBorder(BorderFactory.createEmptyBorder(20, 10, 20, 10)); + label.setAlignmentX(Component.CENTER_ALIGNMENT); + return label; + } + + /** Crée la zone de saisie (champ + bouton) et branche l'action. */ + private JPanel createInputPanel() { + JPanel inputPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10)); + JLabel prompt = new JLabel("Entrez une lettre :"); + + letterInput = new JTextField(2); + letterInput.setHorizontalAlignment(JTextField.CENTER); + letterInput.setFont(new Font("Segoe UI", Font.BOLD, 24)); + + sendButton = new JButton("Envoyer"); + + Action sendAction = new AbstractAction() { + @Override public void actionPerformed(ActionEvent e) { submitLetter(); } + }; + sendButton.addActionListener(sendAction); + letterInput.addActionListener(sendAction); + + letterInput.addKeyListener(new KeyAdapter() { + @Override public void keyTyped(KeyEvent e) { + char c = e.getKeyChar(); + if (!Character.isLetter(c) || letterInput.getText().length() >= 1) e.consume(); + else e.setKeyChar(Character.toUpperCase(c)); + } + }); + + inputPanel.add(prompt); + inputPanel.add(letterInput); + inputPanel.add(sendButton); + return inputPanel; + } + + // --- Partie et Dessin --- + + /** Définit le texte du mot affiché (ex: "_ _ A _ _") fourni par la classe Partie. */ + public void setWordDisplay(String maskedWord) { + wordLabel.setText(maskedWord != null ? maskedWord : ""); + } + + /** Définit le panneau de dessin (remplace le placeholder par la classe Dessin). */ + public void setDrawPanel(JPanel dessinPanel) { + if (dessinPanel == null) return; + Container parent = drawZone.getParent(); + int index = -1; + for (int i = 0; i < parent.getComponentCount(); i++) { + if (parent.getComponent(i) == drawZone) { index = i; break; } + } + if (index != -1) { + parent.remove(index); + drawZone = dessinPanel; + drawZone.setPreferredSize(new Dimension(600, 350)); + parent.add(drawZone, index); + parent.revalidate(); + parent.repaint(); + } + } + + /** Définit le handler appelé quand l'utilisateur soumet une lettre. */ + public void setOnLetterSubmitted(Consumer handler) { + this.onLetterSubmitted = handler; + } + + // --- Méthodes privées UI --- + + /** Récupère la lettre et notifie le handler externe (aucune logique de jeu ici). */ + private void submitLetter() { + String text = letterInput.getText().trim().toUpperCase(); + letterInput.setText(""); + if (text.length() != 1 || !text.matches("[A-Z]")) { + JOptionPane.showMessageDialog(window, "Veuillez entrer une seule lettre (A-Z)."); + return; + } + if (onLetterSubmitted != null) onLetterSubmitted.accept(text.charAt(0)); + else JOptionPane.showMessageDialog(window, "Lettre soumise (placeholder) : " + text); + } + + // --- Placeholder de dessin (pour tester la fenêtre seule) --- + private static class PlaceholderDrawPanel extends JPanel { + @Override protected void paintComponent(Graphics g) { + super.paintComponent(g); + Graphics2D g2 = (Graphics2D) g; + g2.setStroke(new BasicStroke(2f)); + g2.drawRect(10, 10, getWidth() - 20, getHeight() - 20); + g2.setFont(getFont().deriveFont(Font.BOLD, 16f)); + String txt = "Zone de dessin (remplacer par Dessin)"; + FontMetrics fm = g2.getFontMetrics(); + int x = (getWidth() - fm.stringWidth(txt)) / 2; + int y = (getHeight() + fm.getAscent()) / 2; + g2.drawString(txt, x, y); + } + } + + // --- Méthode principale de test : exécuter Fenetre seule (sans Partie/Dessin) --- + public static void main(String[] args) { + Fenetre f = new Fenetre(); + f.setWordDisplay("_ _ _ _ _"); // placeholder + f.setDrawPanel(new Dessin()); // dessin + f.setOnLetterSubmitted(ch -> JOptionPane.showMessageDialog(null,"Lettre reçue : " + ch + " (sans logique de jeu)")); } - //Méthodes - //Affichage - public String toString() { - return "" ; - } } From 35c9fcd873ec43ea5af2d54422f01d9907d2064c Mon Sep 17 00:00:00 2001 From: dick Date: Wed, 8 Oct 2025 14:08:10 +0200 Subject: [PATCH 2/7] Fenetre fix dessin temp --- src/Dessin.class | Bin 0 -> 1799 bytes src/Fenetre$1.class | Bin 0 -> 522 bytes src/Fenetre$2.class | Bin 0 -> 926 bytes src/Fenetre$PlaceholderDrawPanel.class | Bin 0 -> 1118 bytes src/Fenetre.class | Bin 0 -> 5065 bytes src/Fenetre.java | 89 +++++++------------------ src/Partie.class | Bin 0 -> 271 bytes src/Pendu.class | Bin 0 -> 255 bytes 8 files changed, 25 insertions(+), 64 deletions(-) create mode 100644 src/Dessin.class create mode 100644 src/Fenetre$1.class create mode 100644 src/Fenetre$2.class create mode 100644 src/Fenetre$PlaceholderDrawPanel.class create mode 100644 src/Fenetre.class create mode 100644 src/Partie.class create mode 100644 src/Pendu.class diff --git a/src/Dessin.class b/src/Dessin.class new file mode 100644 index 0000000000000000000000000000000000000000..7e611f9a5043f09ff31883d55adc7d869c246a99 GIT binary patch literal 1799 zcmX^0Z`VEs1_pD6OfCi)26c7@4K4;I22CyoX$CEJ25l||Rt6mqM;9cm$Hkz}V8G5` z$jM;DU<@KmxEQz?OxYRCSR5P}7`Pbt7|cN;7Mu*M43;346-cu+h_K;euw}3ViP?h) z2N2=N!QjNs;LOh8!pOj8lbM%UV#mn9tf3jk$iU*9pOVVR!0(fpm+DuVo0M7DSHj33rs0#7SeB@tSYD#d0z*7ILn04D5<@Z%LkdGG4?`M=NC!Ecfsug?;vuLvD)fuXGxO5*y#f;R zQgav?ST#I7L7^m2oLUl4l$w@WRFs+$oLQC1$RLgsqHvFcgOp9f6QYZ^IJLwnF*!TE zD8Do>g^@uRNeehIz{&;T9)fwCk%29_C^fMpm61Ud7AGhX$H*WK*A$eRmy!yKK#$D4 zl43>%0dLpHct^hwPe&h5$6!xCcXoyhMh0f@)JjGM9?!hI)FS7c#Ny)AVnzm8NOXgY zMm0snJGIi9kwGZT(I?auVOYGsA0vYhL=!lT_$OthCYM+kAd0g%wFDBepi~J_3UVbx3><2lE{;Lo@$Ny6k&Fxi2o;cEWn|zePAvhm z85uazQ%k}#Q%XRgprPr>$iSJNTH=wKnVwMsOPyfP_$Gptu?kKMU_t+~#2iKj_LR)xg8brCMh0md5d!iogCc`8gA4-*Ff%YR$TG+=Ffzz9 zFfjNrurV+)FfeFoZD(NA+ReZeDaaHd$QZYsfq5GPi`H%i)<{8yuMo7Ifo&TD`$h%^ z21W)21_lNp1{MYe27U$>20;c<1|bGb24MykP?mz2&BVvR&LG0Tz?i3{y`6zWdm97i z0R}E#olOkfn;3YuG4Sf_X5fny;@{37u#G`bXA^_aHU?p>Z44rITH6>z%~)hbS#~gp z3Gn2Yv5K;YvZk1^>4>t5vdOaMh_Y>C5Eo^Y72wH9Fk{ydWfx@=Wfx`L#vm@smSe^N z5?~c&7v)F*i$S<70$e!>qU>NjU}3NVGfq)fGcHk9Q5LXS+&ZG1qFkb!qTC>}AodI7 znDK~mn(>Nqi}ECx@#%>2it?n0@_`5*)(lY|){Jco5+Htp8NVpMD2o7FPJ)>LNEyE< zuc!dXAOWr%GeNMNL{5U45J*l)lvh+RMN~+XML;AcVH<-uTrdGi5ae1jVUU!7D6gn+ zil~4nivR~)Jyy z7?c?t8Ppg&7}Oa;8MGMU7_=F(81xwO8T1+I7>pREGMF*UVK8S{z+l0!ioud$8-oqQ zK?YlfqYQQoXBg}m9x*sGyku};_{`wS@Snkhk(I%dk)OefQH8;W(UKv6(ViiYF@zzQ zF_R&TF_$5nfssL(K?RaF7^E2(!Rd}!NNNK-K|zvY3XVq^$l KFk%Q~;RFDvrFsRt8Zn20;cfb_Q{F21!N+wvvp@Vif~M22LNh)V$P^ zqEu@}1~!|_yv!0iMg|@YxTt0rBLjEH$r0-w~|D6~wj%8O9ZyUs{x$>Xr#IfCp;1 z9!L`-1HWrta!!76W?s5)YDq?Z3Oj=o4}&y=3?l=FUutoQM}Bb$4+9$mI}ZZ~gDek& z9D^()11Ho76+=b_9?!hI)FS7c#Ny)AVnzljkf{~=#pRiK>H3aI#U(|F$t4i?Ffy=1 z^)WICBp0P7mZW;-6_l0)B<7{&Ffxc~XoCF#)9eKnw`OEu)&Ti|r?@mJH?zbiwWK7q zh(UpYg@KiUfq_v#0OU9Z1_mYu1_llWP6kE>E(Qh$B?cz22$z=jRt83`?F>vCL8=+J z85kJY7#JBC7-AS08F(0Yq3RVF7{Tf}w6-uXZew6ZR~^g1!oUZ%g`Yuyfq{XAL6AX+ VK^QC|$RNSMz`(`8$iTt?1^|=IY)k+E literal 0 HcmV?d00001 diff --git a/src/Fenetre$2.class b/src/Fenetre$2.class new file mode 100644 index 0000000000000000000000000000000000000000..67ef0ce018f8747852cd2e5652677c370517500b GIT binary patch literal 926 zcmX^0Z`VEs1_pBm7fuFl1{p2}9tK%11~~?KE(Qe#MNS4u1|=>AWd;>422}<%kc2u& zLIcFoWM|M~XV76}U@OVUELJgKWZ?91OU+9yDN40wWMH$&%*!mXV`SjbfQxE|F*2|? z=clAHGVuFk=B4_T<|d^Ug(N2Bq%tyaWT#e!R2HPBFfzz!_+%xPCF&=Zm*}UKrRJ6B zd#6^qf*95yBY1;L5|gui6APd^xq|aci;`2_GC{`hK%JlmGJ%nS-!(5eC%-r|FWon_ zBqKkCok5p}L61S7k%7Z6wYbD1zqo{lftP`ghk>8LfStjRhrx)!n4Q6dhryJ=jEBLT z!GfK^l83>H!J3`HhKIqH!H$Q)p22{J!GXb%hrx-#nUR4LYNLt~BLk0TUS4XEb53G$ zacVImgCxiisNQf)Nh~NyEn;L~hiYSF5J)acO)N?E%qu7@2}sOK&0%B^)6fJ5L4|&C zd1hX^z86^BnvsE70~7+{nC60mhmnCRJ+;I;wbD5wu?Vc#nUO<T-nzFI^uboR|!@ zo+Go^C$$93WYKWejACTq&H?km&R}GaK(#+4wW7o=Gc_m0nvp>aWFXvSa2ZAh_Vm;e z5SNib1nPc$u(iP@MVWc&){G1SAf3o!j0|i!sd?!o8DPhHGBU6y=jRod=B6?-aF^tV z78IlwIVTpUGBSYN=*-B#RgC04kXRUl0s}V#4+8@OqksS?A{iJMm>3us_!$Hk7#Rc^ z7#Nfon7|@jTH0F~7`3)DFl_{>W)NavU|?flWME)OVqjztW)Oj@k7rU+uI2f4!Fvv2pu`{qRh=Cm`&LF|Sz`(*F$solb4Hl7P Q&}Lv@;9_88;AQ{=03K`0E&u=k literal 0 HcmV?d00001 diff --git a/src/Fenetre$PlaceholderDrawPanel.class b/src/Fenetre$PlaceholderDrawPanel.class new file mode 100644 index 0000000000000000000000000000000000000000..5876f880ef7d8b0503a33083739720e89f099f38 GIT binary patch literal 1118 zcmX^0Z`VEs1_pBmKQ0DQ1_cnI$j+d|&Y;Z2z`~%y#lXy<%EchUpavq;L0ke3!?S781xwoK!hQPYsAiA%+6rO$iQZknU`5&$H>5}p&7== zz~Y>rlFG=y?~|FA>Q|bZlv)&$n3R*s$iP>Sn3-4NoS$2epO>0f!pI<|;ggkEmZ+at zUZU?_lvt3FnOtlQGJ-2OzqBYh)h!dGjmIrDFSVp7RS%?=k%7Z6wYbD1zqo{*!JLOd zj6s}-L5e||kwF+FjbfCM3nPOFT+}JCI5Ro8q$oc-6{O9AhryD;iig3P!G?#y7DU)F z*z+(rFgP+Y@WM5@<>!^~FgP(d^DwwDxH2-RM&;+FDx`o=adBpzf<{qlZb43Ba%z!6 zL1K}DODafIlZU~L!JVDKgNMPB!Hb8%8)Ui85x8?uB*^5F3-$M*Y|>IWrv!~$iSlE1`0yX;?xp| zZy6axkir=v1`cJ8^wg5@%#@N0aLjo!GH|A+mUyIQre~BeGH|36C6))JCYLZWuxogF zdU}EkWlv8n0R;&ogP?{cBJMy!){G2XDXB%7WvL(@BZIJpryHgc_F|X;LP%}`=>WTk z4{E+|YDrOMaxo)=1iCd)8EfR21!;$hGcs@&mlS2@r9=HC3biFCF)v*|7%XG03H7OC zaWXg+a)Epbkz-^K$D#q`cLoIp5e88P5MW|p0wp^JMg|E61_oIMMg~R(1_oBG?F@_? z85kHC86+7P7}&sq3mI5Ii4&@H6$2XsI|BnlmX`K*1}5zT49vbdyBSy_dABpLZew86 z5#SQw(%QzrE+CSkwT*#8KqO@w1E-GGHU=&hA)ajvyxSP~g!uh*wlN4;v4GS`vgmGO z5KLjsF=GX(mt@(-Ae6wGW5%YVE6OU$wv9m;;T}B(ZUzR1#SE+rOBlEqmNJMjEMw4N zSk7R@u!6ysVI_kz!zzX#hSdxS3~LxN8P+l|GsrM7FfcL5GRT2xc?MGkP?5mMAi^Ne IV8Xx!0EXuRvj6}9 literal 0 HcmV?d00001 diff --git a/src/Fenetre.class b/src/Fenetre.class new file mode 100644 index 0000000000000000000000000000000000000000..a58014962a64853bd37d77b51a38e00ad5ef719e GIT binary patch literal 5065 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 literal 0 HcmV?d00001 diff --git a/src/Fenetre.java b/src/Fenetre.java index 830c436..44a7586 100644 --- a/src/Fenetre.java +++ b/src/Fenetre.java @@ -4,19 +4,18 @@ import java.awt.event.*; import java.util.function.Consumer; /** -* La classe Fenetre gère uniquement l'interface graphique : -* - zone de dessin (remplaçable par la classe Dessin) -* - affichage du mot masqué -* - saisie d'une lettre (événement remonté via un handler) -* -* Aucune logique de jeu (choix/vérification du mot) n'est ici. -* -* * @version 0.3 -* @author Adrien -* Date : 08-10-25 -* Licence : -*/ - + * La classe Fenetre gère uniquement l'interface graphique : + * - zone de dessin (assurée par la classe Dessin) + * - affichage du mot masqué + * - saisie d'une lettre (événement remonté via un handler) + * + * Aucune logique de jeu (choix/vérification du mot) n'est ici. + * + * @version 1.0 + * @author Adrien + * Date : 08-10-25 + * Licence : + */ public class Fenetre { // --- Composants de l'interface (UI only) --- @@ -24,18 +23,18 @@ public class Fenetre { private JLabel wordLabel; private JTextField letterInput; private JButton sendButton; - private JPanel drawZone; // remplaçable par la classe Dessin + private JPanel drawZone; // instance de Dessin // Handler externe pour la lettre soumise (fourni par la classe Partie / contrôleur) private Consumer onLetterSubmitted; - // --- Constructeur (courte orchestration uniquement) --- + // --- Constructeur (orchestration courte) --- public Fenetre() { setupWindow(); JPanel root = createRoot(); window.setContentPane(root); - drawZone = createDrawZone(); + drawZone = createDrawZone(); // -> new Dessin() root.add(drawZone); wordLabel = createWordLabel(); @@ -65,12 +64,9 @@ public class Fenetre { } // --- Sous-composants UI --- - /** Crée la zone de dessin placeholder (à remplacer par Dessin). */ + /** Crée la zone de dessin via la classe Dessin. */ private JPanel createDrawZone() { - JPanel panel = new PlaceholderDrawPanel(); - panel.setPreferredSize(new Dimension(600, 350)); - panel.setBackground(new Color(245, 245, 245)); - return panel; + return new Dessin(); } /** Crée le label d'affichage du mot (placeholder jusqu'à injection par Partie). */ @@ -113,38 +109,19 @@ public class Fenetre { return inputPanel; } - // --- Partie et Dessin --- + // --- Partie <-> UI --- /** Définit le texte du mot affiché (ex: "_ _ A _ _") fourni par la classe Partie. */ public void setWordDisplay(String maskedWord) { wordLabel.setText(maskedWord != null ? maskedWord : ""); } - /** Définit le panneau de dessin (remplace le placeholder par la classe Dessin). */ - public void setDrawPanel(JPanel dessinPanel) { - if (dessinPanel == null) return; - Container parent = drawZone.getParent(); - int index = -1; - for (int i = 0; i < parent.getComponentCount(); i++) { - if (parent.getComponent(i) == drawZone) { index = i; break; } - } - if (index != -1) { - parent.remove(index); - drawZone = dessinPanel; - drawZone.setPreferredSize(new Dimension(600, 350)); - parent.add(drawZone, index); - parent.revalidate(); - parent.repaint(); - } - } - /** Définit le handler appelé quand l'utilisateur soumet une lettre. */ public void setOnLetterSubmitted(Consumer handler) { this.onLetterSubmitted = handler; } // --- Méthodes privées UI --- - /** Récupère la lettre et notifie le handler externe (aucune logique de jeu ici). */ private void submitLetter() { String text = letterInput.getText().trim().toUpperCase(); @@ -157,28 +134,12 @@ public class Fenetre { else JOptionPane.showMessageDialog(window, "Lettre soumise (placeholder) : " + text); } - // --- Placeholder de dessin (pour tester la fenêtre seule) --- - private static class PlaceholderDrawPanel extends JPanel { - @Override protected void paintComponent(Graphics g) { - super.paintComponent(g); - Graphics2D g2 = (Graphics2D) g; - g2.setStroke(new BasicStroke(2f)); - g2.drawRect(10, 10, getWidth() - 20, getHeight() - 20); - g2.setFont(getFont().deriveFont(Font.BOLD, 16f)); - String txt = "Zone de dessin (remplacer par Dessin)"; - FontMetrics fm = g2.getFontMetrics(); - int x = (getWidth() - fm.stringWidth(txt)) / 2; - int y = (getHeight() + fm.getAscent()) / 2; - g2.drawString(txt, x, y); - } + // --- Méthode principale de test --- + public static void main(String[] args) { + Fenetre f = new Fenetre(); + f.setWordDisplay("_ _ _ _ _"); // placeholder + f.setOnLetterSubmitted(ch -> + JOptionPane.showMessageDialog(null, "Lettre reçue : " + ch + " (sans logique de jeu)") + ); } - - // --- Méthode principale de test : exécuter Fenetre seule (sans Partie/Dessin) --- - public static void main(String[] args) { - Fenetre f = new Fenetre(); - f.setWordDisplay("_ _ _ _ _"); // placeholder - f.setDrawPanel(new Dessin()); // dessin - f.setOnLetterSubmitted(ch -> JOptionPane.showMessageDialog(null,"Lettre reçue : " + ch + " (sans logique de jeu)")); - } - } diff --git a/src/Partie.class b/src/Partie.class new file mode 100644 index 0000000000000000000000000000000000000000..85cd51fcbd3a82959e9ab4396dbd59e9fb42f688 GIT binary patch literal 271 zcmX^0Z`VEs1_pBmK`sUs23`&ZK6VCvb_M}P1~!|_yv!0iMh0dL%`ip=7U%qwR7M7V zpUk{eztY^K)S{5Yq?}Yn29A>a;F6-uymUqe5e-eBti-ZJ{hY+SbbW}ZH6sI8aDHh~ za;jSvVo^zEsvbxk4+AR$8zTb)BLf>ml#xLIBo5KG*e=O4g literal 0 HcmV?d00001 diff --git a/src/Pendu.class b/src/Pendu.class new file mode 100644 index 0000000000000000000000000000000000000000..3fd926e95f461b7b4fe4cb40edf5abe45b33463e GIT binary patch literal 255 zcmX^0Z`VEs1_pBmel7-P1|D_>UUmjPMg}&U%)HDJJ4Oa(4b3n{1{UZ1lvG9rexJ;| zRKL>Pq|~C2#H5^5Mh2GL#LPTK1~H9jpRB~PME#t^ymbBGlA_GKbZd}CuHgLAqU2P! zOps!(fYiK{QazAD9tIW$Rz?O^um~fA07wj?**_^OHMxXAk%5VUnE?ct7#Kl{85kMZ z7#J9285kKD85kH?wYD=bZe(C!U}RutU|?Va3vw}VGH@_(LX}E_Wf?G)@iH(na4|42 IFfnig0FgN=lK=n! literal 0 HcmV?d00001 From 06daa4e47834030d22a4d5aa77a8080dad54beda Mon Sep 17 00:00:00 2001 From: dick Date: Wed, 8 Oct 2025 14:08:31 +0200 Subject: [PATCH 3/7] Fenetre fix dessin temp --- src/Dessin.class | Bin 1799 -> 0 bytes src/Fenetre$1.class | Bin 522 -> 0 bytes src/Fenetre$2.class | Bin 926 -> 0 bytes src/Fenetre$PlaceholderDrawPanel.class | Bin 1118 -> 0 bytes src/Fenetre.class | Bin 5065 -> 0 bytes src/Partie.class | Bin 271 -> 0 bytes src/Pendu.class | Bin 255 -> 0 bytes 7 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/Dessin.class delete mode 100644 src/Fenetre$1.class delete mode 100644 src/Fenetre$2.class delete mode 100644 src/Fenetre$PlaceholderDrawPanel.class delete mode 100644 src/Fenetre.class delete mode 100644 src/Partie.class delete mode 100644 src/Pendu.class diff --git a/src/Dessin.class b/src/Dessin.class deleted file mode 100644 index 7e611f9a5043f09ff31883d55adc7d869c246a99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1799 zcmX^0Z`VEs1_pD6OfCi)26c7@4K4;I22CyoX$CEJ25l||Rt6mqM;9cm$Hkz}V8G5` z$jM;DU<@KmxEQz?OxYRCSR5P}7`Pbt7|cN;7Mu*M43;346-cu+h_K;euw}3ViP?h) z2N2=N!QjNs;LOh8!pOj8lbM%UV#mn9tf3jk$iU*9pOVVR!0(fpm+DuVo0M7DSHj33rs0#7SeB@tSYD#d0z*7ILn04D5<@Z%LkdGG4?`M=NC!Ecfsug?;vuLvD)fuXGxO5*y#f;R zQgav?ST#I7L7^m2oLUl4l$w@WRFs+$oLQC1$RLgsqHvFcgOp9f6QYZ^IJLwnF*!TE zD8Do>g^@uRNeehIz{&;T9)fwCk%29_C^fMpm61Ud7AGhX$H*WK*A$eRmy!yKK#$D4 zl43>%0dLpHct^hwPe&h5$6!xCcXoyhMh0f@)JjGM9?!hI)FS7c#Ny)AVnzm8NOXgY zMm0snJGIi9kwGZT(I?auVOYGsA0vYhL=!lT_$OthCYM+kAd0g%wFDBepi~J_3UVbx3><2lE{;Lo@$Ny6k&Fxi2o;cEWn|zePAvhm z85uazQ%k}#Q%XRgprPr>$iSJNTH=wKnVwMsOPyfP_$Gptu?kKMU_t+~#2iKj_LR)xg8brCMh0md5d!iogCc`8gA4-*Ff%YR$TG+=Ffzz9 zFfjNrurV+)FfeFoZD(NA+ReZeDaaHd$QZYsfq5GPi`H%i)<{8yuMo7Ifo&TD`$h%^ z21W)21_lNp1{MYe27U$>20;c<1|bGb24MykP?mz2&BVvR&LG0Tz?i3{y`6zWdm97i z0R}E#olOkfn;3YuG4Sf_X5fny;@{37u#G`bXA^_aHU?p>Z44rITH6>z%~)hbS#~gp z3Gn2Yv5K;YvZk1^>4>t5vdOaMh_Y>C5Eo^Y72wH9Fk{ydWfx@=Wfx`L#vm@smSe^N z5?~c&7v)F*i$S<70$e!>qU>NjU}3NVGfq)fGcHk9Q5LXS+&ZG1qFkb!qTC>}AodI7 znDK~mn(>Nqi}ECx@#%>2it?n0@_`5*)(lY|){Jco5+Htp8NVpMD2o7FPJ)>LNEyE< zuc!dXAOWr%GeNMNL{5U45J*l)lvh+RMN~+XML;AcVH<-uTrdGi5ae1jVUU!7D6gn+ zil~4nivR~)Jyy z7?c?t8Ppg&7}Oa;8MGMU7_=F(81xwO8T1+I7>pREGMF*UVK8S{z+l0!ioud$8-oqQ zK?YlfqYQQoXBg}m9x*sGyku};_{`wS@Snkhk(I%dk)OefQH8;W(UKv6(ViiYF@zzQ zF_R&TF_$5nfssL(K?RaF7^E2(!Rd}!NNNK-K|zvY3XVq^$l KFk%Q~;RFDvrFsRt8Zn20;cfb_Q{F21!N+wvvp@Vif~M22LNh)V$P^ zqEu@}1~!|_yv!0iMg|@YxTt0rBLjEH$r0-w~|D6~wj%8O9ZyUs{x$>Xr#IfCp;1 z9!L`-1HWrta!!76W?s5)YDq?Z3Oj=o4}&y=3?l=FUutoQM}Bb$4+9$mI}ZZ~gDek& z9D^()11Ho76+=b_9?!hI)FS7c#Ny)AVnzljkf{~=#pRiK>H3aI#U(|F$t4i?Ffy=1 z^)WICBp0P7mZW;-6_l0)B<7{&Ffxc~XoCF#)9eKnw`OEu)&Ti|r?@mJH?zbiwWK7q zh(UpYg@KiUfq_v#0OU9Z1_mYu1_llWP6kE>E(Qh$B?cz22$z=jRt83`?F>vCL8=+J z85kJY7#JBC7-AS08F(0Yq3RVF7{Tf}w6-uXZew6ZR~^g1!oUZ%g`Yuyfq{XAL6AX+ VK^QC|$RNSMz`(`8$iTt?1^|=IY)k+E diff --git a/src/Fenetre$2.class b/src/Fenetre$2.class deleted file mode 100644 index 67ef0ce018f8747852cd2e5652677c370517500b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 926 zcmX^0Z`VEs1_pBm7fuFl1{p2}9tK%11~~?KE(Qe#MNS4u1|=>AWd;>422}<%kc2u& zLIcFoWM|M~XV76}U@OVUELJgKWZ?91OU+9yDN40wWMH$&%*!mXV`SjbfQxE|F*2|? z=clAHGVuFk=B4_T<|d^Ug(N2Bq%tyaWT#e!R2HPBFfzz!_+%xPCF&=Zm*}UKrRJ6B zd#6^qf*95yBY1;L5|gui6APd^xq|aci;`2_GC{`hK%JlmGJ%nS-!(5eC%-r|FWon_ zBqKkCok5p}L61S7k%7Z6wYbD1zqo{lftP`ghk>8LfStjRhrx)!n4Q6dhryJ=jEBLT z!GfK^l83>H!J3`HhKIqH!H$Q)p22{J!GXb%hrx-#nUR4LYNLt~BLk0TUS4XEb53G$ zacVImgCxiisNQf)Nh~NyEn;L~hiYSF5J)acO)N?E%qu7@2}sOK&0%B^)6fJ5L4|&C zd1hX^z86^BnvsE70~7+{nC60mhmnCRJ+;I;wbD5wu?Vc#nUO<T-nzFI^uboR|!@ zo+Go^C$$93WYKWejACTq&H?km&R}GaK(#+4wW7o=Gc_m0nvp>aWFXvSa2ZAh_Vm;e z5SNib1nPc$u(iP@MVWc&){G1SAf3o!j0|i!sd?!o8DPhHGBU6y=jRod=B6?-aF^tV z78IlwIVTpUGBSYN=*-B#RgC04kXRUl0s}V#4+8@OqksS?A{iJMm>3us_!$Hk7#Rc^ z7#Nfon7|@jTH0F~7`3)DFl_{>W)NavU|?flWME)OVqjztW)Oj@k7rU+uI2f4!Fvv2pu`{qRh=Cm`&LF|Sz`(*F$solb4Hl7P Q&}Lv@;9_88;AQ{=03K`0E&u=k diff --git a/src/Fenetre$PlaceholderDrawPanel.class b/src/Fenetre$PlaceholderDrawPanel.class deleted file mode 100644 index 5876f880ef7d8b0503a33083739720e89f099f38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1118 zcmX^0Z`VEs1_pBmKQ0DQ1_cnI$j+d|&Y;Z2z`~%y#lXy<%EchUpavq;L0ke3!?S781xwoK!hQPYsAiA%+6rO$iQZknU`5&$H>5}p&7== zz~Y>rlFG=y?~|FA>Q|bZlv)&$n3R*s$iP>Sn3-4NoS$2epO>0f!pI<|;ggkEmZ+at zUZU?_lvt3FnOtlQGJ-2OzqBYh)h!dGjmIrDFSVp7RS%?=k%7Z6wYbD1zqo{*!JLOd zj6s}-L5e||kwF+FjbfCM3nPOFT+}JCI5Ro8q$oc-6{O9AhryD;iig3P!G?#y7DU)F z*z+(rFgP+Y@WM5@<>!^~FgP(d^DwwDxH2-RM&;+FDx`o=adBpzf<{qlZb43Ba%z!6 zL1K}DODafIlZU~L!JVDKgNMPB!Hb8%8)Ui85x8?uB*^5F3-$M*Y|>IWrv!~$iSlE1`0yX;?xp| zZy6axkir=v1`cJ8^wg5@%#@N0aLjo!GH|A+mUyIQre~BeGH|36C6))JCYLZWuxogF zdU}EkWlv8n0R;&ogP?{cBJMy!){G2XDXB%7WvL(@BZIJpryHgc_F|X;LP%}`=>WTk z4{E+|YDrOMaxo)=1iCd)8EfR21!;$hGcs@&mlS2@r9=HC3biFCF)v*|7%XG03H7OC zaWXg+a)Epbkz-^K$D#q`cLoIp5e88P5MW|p0wp^JMg|E61_oIMMg~R(1_oBG?F@_? z85kHC86+7P7}&sq3mI5Ii4&@H6$2XsI|BnlmX`K*1}5zT49vbdyBSy_dABpLZew86 z5#SQw(%QzrE+CSkwT*#8KqO@w1E-GGHU=&hA)ajvyxSP~g!uh*wlN4;v4GS`vgmGO z5KLjsF=GX(mt@(-Ae6wGW5%YVE6OU$wv9m;;T}B(ZUzR1#SE+rOBlEqmNJMjEMw4N zSk7R@u!6ysVI_kz!zzX#hSdxS3~LxN8P+l|GsrM7FfcL5GRT2xc?MGkP?5mMAi^Ne IV8Xx!0EXuRvj6}9 diff --git a/src/Fenetre.class b/src/Fenetre.class deleted file mode 100644 index a58014962a64853bd37d77b51a38e00ad5ef719e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5065 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 diff --git a/src/Partie.class b/src/Partie.class deleted file mode 100644 index 85cd51fcbd3a82959e9ab4396dbd59e9fb42f688..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 271 zcmX^0Z`VEs1_pBmK`sUs23`&ZK6VCvb_M}P1~!|_yv!0iMh0dL%`ip=7U%qwR7M7V zpUk{eztY^K)S{5Yq?}Yn29A>a;F6-uymUqe5e-eBti-ZJ{hY+SbbW}ZH6sI8aDHh~ za;jSvVo^zEsvbxk4+AR$8zTb)BLf>ml#xLIBo5KG*e=O4g diff --git a/src/Pendu.class b/src/Pendu.class deleted file mode 100644 index 3fd926e95f461b7b4fe4cb40edf5abe45b33463e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 255 zcmX^0Z`VEs1_pBmel7-P1|D_>UUmjPMg}&U%)HDJJ4Oa(4b3n{1{UZ1lvG9rexJ;| zRKL>Pq|~C2#H5^5Mh2GL#LPTK1~H9jpRB~PME#t^ymbBGlA_GKbZd}CuHgLAqU2P! zOps!(fYiK{QazAD9tIW$Rz?O^um~fA07wj?**_^OHMxXAk%5VUnE?ct7#Kl{85kMZ z7#J9285kKD85kH?wYD=bZe(C!U}RutU|?Va3vw}VGH@_(LX}E_Wf?G)@iH(na4|42 IFfnig0FgN=lK=n! From 49e32b316ec4fa7528db55cb620a4407232cdcb6 Mon Sep 17 00:00:00 2001 From: dick Date: Wed, 8 Oct 2025 14:53:45 +0200 Subject: [PATCH 4/7] Fenetre fix + Event.java --- src/Dessin.java | 2 +- src/Event.java | 70 ++++++++++++++++++++++++++++++ src/Fenetre.java | 111 ++++++++++++++--------------------------------- 3 files changed, 103 insertions(+), 80 deletions(-) create mode 100644 src/Event.java diff --git a/src/Dessin.java b/src/Dessin.java index 92435cc..8c58016 100644 --- a/src/Dessin.java +++ b/src/Dessin.java @@ -4,7 +4,7 @@ import java.awt.*; /** * La classe Dessin gère uniquement le dessin du pendu * -* @version 0.1 +* @version 1.0 * @author Adrien * Date : 08-10-2025 * Licence : diff --git a/src/Event.java b/src/Event.java new file mode 100644 index 0000000..ec85c6f --- /dev/null +++ b/src/Event.java @@ -0,0 +1,70 @@ +import javax.swing.*; +import java.awt.event.*; +import java.util.function.Consumer; + +/** +* La classe Event regroupe et branche tous les listeners liés à Fenetre. +* - Validation de la saisie (1 lettre A-Z, majuscule) +* - Action sur Entrée ou clic bouton +* - Notification du handler externe (Fenetre#setOnLetterSubmitted) +* Aucune logique de jeu ici. +* @version 1.1 +* @author Adrien +* Date : 08-10-2025 +* Licence : +*/ +public class Event { + + private final Fenetre fenetre; + private final Consumer onLetterSubmitted; + + public Event(Fenetre fenetre, Consumer onLetterSubmitted) { + this.fenetre = fenetre; + this.onLetterSubmitted = onLetterSubmitted; + wireEvents(); + } + + /** Branchement des listeners sur les composants de Fenetre. */ + private void wireEvents() { + JTextField letterInput = fenetre.getLetterInput(); + JButton sendButton = fenetre.getSendButton(); + + // Action (Entrée + clic bouton) + Action sendAction = new AbstractAction() { + @Override public void actionPerformed(ActionEvent e) { submitLetter(); } + }; + sendButton.addActionListener(sendAction); + letterInput.addActionListener(sendAction); + + // UX : limiter à une seule lettre et forcer la majuscule + letterInput.addKeyListener(new KeyAdapter() { + @Override public void keyTyped(KeyEvent e) { + char c = e.getKeyChar(); + if (!Character.isLetter(c) || letterInput.getText().length() >= 1) { + e.consume(); + } else { + e.setKeyChar(Character.toUpperCase(c)); + } + } + }); + } + + /** Récupère, valide et transmet la lettre au handler externe. */ + private void submitLetter() { + JTextField letterInput = fenetre.getLetterInput(); + String text = letterInput.getText().trim().toUpperCase(); + letterInput.setText(""); + + if (text.length() != 1 || !text.matches("[A-Z]")) { + JOptionPane.showMessageDialog(fenetre.getWindow(), "Veuillez entrer une seule lettre (A-Z)."); + return; + } + + if (onLetterSubmitted != null) { + onLetterSubmitted.accept(text.charAt(0)); + } else { + JOptionPane.showMessageDialog(fenetre.getWindow(), "Lettre soumise (placeholder) : " + text); + } + } +} + diff --git a/src/Fenetre.java b/src/Fenetre.java index 44a7586..a62c14e 100644 --- a/src/Fenetre.java +++ b/src/Fenetre.java @@ -1,40 +1,38 @@ import javax.swing.*; import java.awt.*; -import java.awt.event.*; import java.util.function.Consumer; /** - * La classe Fenetre gère uniquement l'interface graphique : - * - zone de dessin (assurée par la classe Dessin) - * - affichage du mot masqué - * - saisie d'une lettre (événement remonté via un handler) - * - * Aucune logique de jeu (choix/vérification du mot) n'est ici. - * - * @version 1.0 - * @author Adrien - * Date : 08-10-25 - * Licence : - */ +* La classe Fenetre gère uniquement l'interface graphique : +* - zone de dessin (assurée par la classe Dessin) +* - affichage du mot masqué +* - saisie d'une lettre (les événements sont gérés dans Event) +* +* Aucune logique de jeu ici. +* @version 1.5 +* @author Adrien +* Date : 08-10-2025 +* Licence : +*/ + public class Fenetre { - // --- Composants de l'interface (UI only) --- + // --- Composants de l'interface --- private JFrame window; private JLabel wordLabel; private JTextField letterInput; private JButton sendButton; private JPanel drawZone; // instance de Dessin - // Handler externe pour la lettre soumise (fourni par la classe Partie / contrôleur) - private Consumer onLetterSubmitted; - - // --- Constructeur (orchestration courte) --- + // --- Constructeur --- public Fenetre() { setupWindow(); - JPanel root = createRoot(); + + JPanel root = new JPanel(); + root.setLayout(new BoxLayout(root, BoxLayout.Y_AXIS)); window.setContentPane(root); - drawZone = createDrawZone(); // -> new Dessin() + drawZone = new Dessin(); root.add(drawZone); wordLabel = createWordLabel(); @@ -48,7 +46,6 @@ public class Fenetre { } // --- Initialisation fenêtre --- - /** Configure la fenêtre principale (titre, taille, fermeture). */ private void setupWindow() { window = new JFrame("Jeu du Pendu"); window.setSize(600, 600); @@ -56,20 +53,7 @@ public class Fenetre { window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } - /** Crée le conteneur principal vertical. */ - private JPanel createRoot() { - JPanel root = new JPanel(); - root.setLayout(new BoxLayout(root, BoxLayout.Y_AXIS)); - return root; - } - // --- Sous-composants UI --- - /** Crée la zone de dessin via la classe Dessin. */ - private JPanel createDrawZone() { - return new Dessin(); - } - - /** Crée le label d'affichage du mot (placeholder jusqu'à injection par Partie). */ private JLabel createWordLabel() { JLabel label = new JLabel("_ _ _ _ _", SwingConstants.CENTER); label.setFont(new Font("Segoe UI", Font.BOLD, 32)); @@ -78,7 +62,6 @@ public class Fenetre { return label; } - /** Crée la zone de saisie (champ + bouton) et branche l'action. */ private JPanel createInputPanel() { JPanel inputPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10)); JLabel prompt = new JLabel("Entrez une lettre :"); @@ -89,57 +72,27 @@ public class Fenetre { sendButton = new JButton("Envoyer"); - Action sendAction = new AbstractAction() { - @Override public void actionPerformed(ActionEvent e) { submitLetter(); } - }; - sendButton.addActionListener(sendAction); - letterInput.addActionListener(sendAction); - - letterInput.addKeyListener(new KeyAdapter() { - @Override public void keyTyped(KeyEvent e) { - char c = e.getKeyChar(); - if (!Character.isLetter(c) || letterInput.getText().length() >= 1) e.consume(); - else e.setKeyChar(Character.toUpperCase(c)); - } - }); - inputPanel.add(prompt); inputPanel.add(letterInput); inputPanel.add(sendButton); return inputPanel; } - // --- Partie <-> UI --- - - /** Définit le texte du mot affiché (ex: "_ _ A _ _") fourni par la classe Partie. */ - public void setWordDisplay(String maskedWord) { - wordLabel.setText(maskedWord != null ? maskedWord : ""); - } - - /** Définit le handler appelé quand l'utilisateur soumet une lettre. */ - public void setOnLetterSubmitted(Consumer handler) { - this.onLetterSubmitted = handler; - } - - // --- Méthodes privées UI --- - /** Récupère la lettre et notifie le handler externe (aucune logique de jeu ici). */ - private void submitLetter() { - String text = letterInput.getText().trim().toUpperCase(); - letterInput.setText(""); - if (text.length() != 1 || !text.matches("[A-Z]")) { - JOptionPane.showMessageDialog(window, "Veuillez entrer une seule lettre (A-Z)."); - return; - } - if (onLetterSubmitted != null) onLetterSubmitted.accept(text.charAt(0)); - else JOptionPane.showMessageDialog(window, "Lettre soumise (placeholder) : " + text); - } + // --- Getters pour Event --- + public JFrame getWindow() { return window; } + public JTextField getLetterInput() { return letterInput; } + 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) { - Fenetre f = new Fenetre(); - f.setWordDisplay("_ _ _ _ _"); // placeholder - f.setOnLetterSubmitted(ch -> - JOptionPane.showMessageDialog(null, "Lettre reçue : " + ch + " (sans logique de jeu)") - ); + 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)") + ); + }); } -} +} \ No newline at end of file From 90874a3296090e1ba8fe12458e3a81db4f5d4b52 Mon Sep 17 00:00:00 2001 From: dick Date: Wed, 8 Oct 2025 15:04:08 +0200 Subject: [PATCH 5/7] Event fix --- src/Event.java | 59 ++++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/src/Event.java b/src/Event.java index ec85c6f..4b581d9 100644 --- a/src/Event.java +++ b/src/Event.java @@ -6,65 +6,68 @@ import java.util.function.Consumer; * La classe Event regroupe et branche tous les listeners liés à Fenetre. * - Validation de la saisie (1 lettre A-Z, majuscule) * - Action sur Entrée ou clic bouton -* - Notification du handler externe (Fenetre#setOnLetterSubmitted) +* - Notification du handler externe (fourni au constructeur) * Aucune logique de jeu ici. -* @version 1.1 -* @author Adrien +* @version 1.2 +* author Adrien * Date : 08-10-2025 * Licence : */ -public class Event { +public class Event implements ActionListener { - private final Fenetre fenetre; + private final Fenetre window; private final Consumer onLetterSubmitted; - public Event(Fenetre fenetre, Consumer onLetterSubmitted) { - this.fenetre = fenetre; + public Event(Fenetre window, Consumer onLetterSubmitted) { + this.window = window; this.onLetterSubmitted = onLetterSubmitted; wireEvents(); } - /** Branchement des listeners sur les composants de Fenetre. */ + /** Branche les listeners sur les composants de Fenetre. */ private void wireEvents() { - JTextField letterInput = fenetre.getLetterInput(); - JButton sendButton = fenetre.getSendButton(); + JTextField letterInput = window.getLetterInput(); + JButton sendButton = window.getSendButton(); - // Action (Entrée + clic bouton) - Action sendAction = new AbstractAction() { - @Override public void actionPerformed(ActionEvent e) { submitLetter(); } - }; - sendButton.addActionListener(sendAction); - letterInput.addActionListener(sendAction); + // Même listener (this) pour Entrée et clic bouton + sendButton.addActionListener(this); + letterInput.addActionListener(this); // UX : limiter à une seule lettre et forcer la majuscule letterInput.addKeyListener(new KeyAdapter() { - @Override public void keyTyped(KeyEvent e) { - char c = e.getKeyChar(); - if (!Character.isLetter(c) || letterInput.getText().length() >= 1) { - e.consume(); + @Override + public void keyTyped(KeyEvent keyEvent) { + char typedChar = keyEvent.getKeyChar(); + if (!Character.isLetter(typedChar) || letterInput.getText().length() >= 1) { + keyEvent.consume(); } else { - e.setKeyChar(Character.toUpperCase(c)); + keyEvent.setKeyChar(Character.toUpperCase(typedChar)); } } }); } + /** Réagit à Entrée ou au clic bouton : soumet la lettre. */ + @Override + public void actionPerformed(ActionEvent actionEvent) { + submitLetter(); + } + /** Récupère, valide et transmet la lettre au handler externe. */ private void submitLetter() { - JTextField letterInput = fenetre.getLetterInput(); - String text = letterInput.getText().trim().toUpperCase(); + JTextField letterInput = window.getLetterInput(); + String inputText = letterInput.getText().trim().toUpperCase(); letterInput.setText(""); - if (text.length() != 1 || !text.matches("[A-Z]")) { - JOptionPane.showMessageDialog(fenetre.getWindow(), "Veuillez entrer une seule lettre (A-Z)."); + if (inputText.length() != 1 || !inputText.matches("[A-Z]")) { + JOptionPane.showMessageDialog(window.getWindow(), "Veuillez entrer une seule lettre (A-Z)."); return; } if (onLetterSubmitted != null) { - onLetterSubmitted.accept(text.charAt(0)); + onLetterSubmitted.accept(inputText.charAt(0)); } else { - JOptionPane.showMessageDialog(fenetre.getWindow(), "Lettre soumise (placeholder) : " + text); + JOptionPane.showMessageDialog(window.getWindow(), "Lettre soumise (placeholder) : " + inputText); } } } - From 62f6f94be79efe28ceafcfdc362e770572998670 Mon Sep 17 00:00:00 2001 From: dick Date: Wed, 8 Oct 2025 15:15:04 +0200 Subject: [PATCH 6/7] Event commentaire --- src/Dessin.class | Bin 0 -> 1799 bytes src/Dessin.java | 18 ++++++------------ src/Event$1.class | Bin 0 -> 927 bytes src/Event.class | Bin 0 -> 2490 bytes src/Event.java | 39 +++++++++++++++++++-------------------- src/Fenetre.class | Bin 0 -> 4189 bytes src/Partie.class | Bin 0 -> 271 bytes src/Pendu.class | Bin 0 -> 255 bytes 8 files changed, 25 insertions(+), 32 deletions(-) create mode 100644 src/Dessin.class create mode 100644 src/Event$1.class create mode 100644 src/Event.class create mode 100644 src/Fenetre.class create mode 100644 src/Partie.class create mode 100644 src/Pendu.class diff --git a/src/Dessin.class b/src/Dessin.class new file mode 100644 index 0000000000000000000000000000000000000000..7e611f9a5043f09ff31883d55adc7d869c246a99 GIT binary patch literal 1799 zcmX^0Z`VEs1_pD6OfCi)26c7@4K4;I22CyoX$CEJ25l||Rt6mqM;9cm$Hkz}V8G5` z$jM;DU<@KmxEQz?OxYRCSR5P}7`Pbt7|cN;7Mu*M43;346-cu+h_K;euw}3ViP?h) z2N2=N!QjNs;LOh8!pOj8lbM%UV#mn9tf3jk$iU*9pOVVR!0(fpm+DuVo0M7DSHj33rs0#7SeB@tSYD#d0z*7ILn04D5<@Z%LkdGG4?`M=NC!Ecfsug?;vuLvD)fuXGxO5*y#f;R zQgav?ST#I7L7^m2oLUl4l$w@WRFs+$oLQC1$RLgsqHvFcgOp9f6QYZ^IJLwnF*!TE zD8Do>g^@uRNeehIz{&;T9)fwCk%29_C^fMpm61Ud7AGhX$H*WK*A$eRmy!yKK#$D4 zl43>%0dLpHct^hwPe&h5$6!xCcXoyhMh0f@)JjGM9?!hI)FS7c#Ny)AVnzm8NOXgY zMm0snJGIi9kwGZT(I?auVOYGsA0vYhL=!lT_$OthCYM+kAd0g%wFDBepi~J_3UVbx3><2lE{;Lo@$Ny6k&Fxi2o;cEWn|zePAvhm z85uazQ%k}#Q%XRgprPr>$iSJNTH=wKnVwMsOPyfP_$Gptu?kKMU_t+~#2iKj_LR)xg8brCMh0md5d!iogCc`8gA4-*Ff%YR$TG+=Ffzz9 zFfjNrurV+)FfeFoZD(NA+ReZeDaaHd$QZYsfq5GPi`H%i)<{8yuMo7Ifo&TD`$h%^ z21W)21_lNp1{MYe27U$>20;c<1|bGb24MykP?mz2&BVvR&LG0Tz?i3{y`6zWdm97i z0R}E#olOkfn;3YuG4Sf_X5fny;@{37u#G`bXA^_aHU?p>Z44rITH6>z%~)hbS#~gp z3Gn2Yv5K;YvZk1^>4>t5vdOaMh_Y>C5Eo^Y72wH9Fk{ydWfx@=Wfx`L#vm@smSe^N z5?~c&7v)F*i$S<70$e!>qU>NjU}3NVGfq)fGcHk9Q5LXS+&ZG1qFkb!qTC>}AodI7 znDK~mn(>Nqi}ECx@#%>2it?n0@_`5*)(lY|){Jco5+Htp8NVpMD2o7FPJ)>LNEyE< zuc!dXAOWr%GeNMNL{5U45J*l)lvh+RMN~+XML;AcVH<-uTrdGi5ae1jVUU!7D6gn+ zil~4nivR~)Jyy z7?c?t8Ppg&7}Oa;8MGMU7_=F(81xwO8T1+I7>pREGMF*UVK8S{z+l0!ioud$8-oqQ zK?YlfqYQQoXBg}m9x*sGyku};_{`wS@Snkhk(I%dk)OefQH8;W(UKv6(ViiYF@zzQ zF_R&TF_$5nfssL(K?RaF7^E2(!Rd}!NNNK-K|zvY3XVq^$l KFk%Q~;RFDvrFsJq{paBxo1c_;Z zSla9iI_wO3j12r`i8(4csU;<;MV@&Dr6r6E5H1zFsTCz|nW;G` z){G2nB^jB;Dh7-U>^`n#sd*(JA)Cy+%o00B1|^5s-_(+f{1kQueI5n_217;$4!_jm z5|8}i5*`MA1_2%hUIsoM20;cxb_OFJ24e;jb_P=(1~Ue8b_NR`21^Djb_Q!61{(%j z9tJxGLmmcu1_vGnM+PTG26nK0Du#>C!t__egR zGB9fCY-M25+Rnhdk%57MkwJukfq{*Ik%56hm4T5#ltB!tDFLcUOM4pwi>=HK2G*Gj zf?8V`n6@#nZDU|(S;)Ypy^VomIRm%0%nk<5Z46u>^O(Tqi7~J;FfeE^urg>eNHJ(J zC^G0UXfo(Ah%+!Sa4<0cVUS{EV`pGtkN`VXl0k}rfq{iVnn8v^7Azvopv%C(z{SAG Iz|8;#0P9!BO#lD@ literal 0 HcmV?d00001 diff --git a/src/Event.class b/src/Event.class new file mode 100644 index 0000000000000000000000000000000000000000..d707c907ea3ec188131d21f1554ddc6375b3b386 GIT binary patch literal 2490 zcmX^0Z`VEs1_pD69xeu11~X0u83uC@VZp^9!(hq9V8vh!B5b%AY#Hph7z`Qg*ct4( z7&sXmKpaPqDkl)jnTx@Q!39LPaxl1oMBG6f4-N)T5bXsr#G8Y`hl|0N!4D+j&&3eH z5Xj9C#1JgRz`zjB&Je-Q5XsIE#mKd%_cK1v&4>( zK~n?n7>HsVwrYkkGO#%3r=&76@cU%urTUfTCZ!gIBqrsgGBP+2X9zCmfXwD9&n!xH zElbTSDQ09~)&L3dCxU$*kXn?MUz7_97?7_vY_HbW*O0|O634nr;vLmopuBLi!+qi$3z4?_V%ArC_lLop+R zdRS^{W=>9Ol|pJ>Nl|K%LTO&ALUC$oPO3sqYDq~^s)B~2Zj`1TJ3|Q%Ln%WU4?{Ua z1v^6}4?`70H9JEM4?`_O9V3H)Q+|F)aY<2Pfp2O_Mt({$KN~|m2SWo7LnA{IBLgeg zv5X7?ATR5K(}sUiR%&tyBZDkh2t9OtGK))6^HPf#8N@*H75c^HnR)5@ULmO!C2pCi zIVmV+1(y_M=A|<-utU>0BLiQ0Y6&DlJo5@lOBflXG&I5Sh-s2FBLi=GYDsWvUW!v` zNlAVlBZD})Vu*w_BZDxCYaqgm41$R%DUeiwaJLeUbOTcXPC7~&KH!kC#^p9p`r=DW zN%2mtglS}Cz)X@z(qMDh(^E@8LB+@*0`&?c&>;b3&B(w~Qk0p?$iQ8aA6ih5TI8Hq zoXW_+UJTPE3Uxd5=a0-JPAoz;Ba6|&PXhBEMa6|(eTuChDIMm6})U>WMD5#%qdOvPh(_| z&~Sz%6Ero}j11CXOR<+!j0|jv$;qh&C5#Lx0ReXj7eg~c3nPO9C`lHjDir6J=4KYB zDrgksBqpb3);El$Ac2I5#~ zG_f!PSuAfftc==m|T)yRLRcJ#mKld53sR9Kp~|C?Tn-B+Bq68~&WSlW!I>qg*6a-3 zj0~z69>V4}Mg}?j>KGImWEf-_7#ZXkm>7gWg)IXEgAk~^Wng4bVPIfjVo+sZVPIrX zV^C*cV$fhPy42%q#3=9ln46FVuX+Qz_*utkc2je&tdmVtvojzNGykwKI}i9w1%l|h}sfPs-g zmq8C|gCYYX0}}%S1FP0H1|EcVF0h~}0}F#00~4sifGXe2zzlX!GQ=UQKHA$Dc(*a| zZDZi~)fN)i#vrJ(jX{WI0RxYYknlDJky#7^5S5}rVmlbbH)?HRU_Qnm4x)6Jw=qcU zV36F&AjQP6oIx0>PG=W`Gy?-jEjWllA*RK^#lXN|#lXQ}%^=KR!yw6E$DqYv&tS&j zz+lec%wWgh!VtvZ#*oC|!C=6^z`)1A@|Qu2oxzZu!H7qSpMizJ7;KgagDC?8ILbH~ i*xM4518+3}FCe8H!i{ literal 0 HcmV?d00001 diff --git a/src/Event.java b/src/Event.java index 4b581d9..88d9394 100644 --- a/src/Event.java +++ b/src/Event.java @@ -3,28 +3,28 @@ import java.awt.event.*; import java.util.function.Consumer; /** -* La classe Event regroupe et branche tous les listeners liés à Fenetre. -* - Validation de la saisie (1 lettre A-Z, majuscule) -* - Action sur Entrée ou clic bouton -* - Notification du handler externe (fourni au constructeur) -* Aucune logique de jeu ici. -* @version 1.2 -* author Adrien -* Date : 08-10-2025 -* Licence : -*/ + * La classe Event regroupe et branche tous les listeners liés à Fenetre. + * - Validation de la saisie (1 lettre A-Z, majuscule) + * - Action sur Entrée ou clic bouton + * - Notification du handler externe (fourni au constructeur) + * Aucune logique de jeu ici. + * @version 1.3 + * author Adrien + * Date : 08-10-2025 + */ public class Event implements ActionListener { private final Fenetre window; private final Consumer onLetterSubmitted; + /** Constructeur : conserve les références et branche les événements. */ public Event(Fenetre window, Consumer onLetterSubmitted) { this.window = window; this.onLetterSubmitted = onLetterSubmitted; wireEvents(); } - /** Branche les listeners sur les composants de Fenetre. */ + /** Branche les listeners sur les composants de Fenetre.*/ private void wireEvents() { JTextField letterInput = window.getLetterInput(); JButton sendButton = window.getSendButton(); @@ -47,27 +47,26 @@ public class Event implements ActionListener { }); } - /** Réagit à Entrée ou au clic bouton : soumet la lettre. */ + /** Réagit à Entrée ou au clic bouton : récupère, valide et transmet la lettre. */ @Override public void actionPerformed(ActionEvent actionEvent) { - submitLetter(); - } - - /** Récupère, valide et transmet la lettre au handler externe. */ - private void submitLetter() { JTextField letterInput = window.getLetterInput(); - String inputText = letterInput.getText().trim().toUpperCase(); - letterInput.setText(""); + String inputText = letterInput.getText().trim().toUpperCase(); + letterInput.setText(""); // reset du champ après tentative + + // Validation : exactement une lettre A–Z if (inputText.length() != 1 || !inputText.matches("[A-Z]")) { JOptionPane.showMessageDialog(window.getWindow(), "Veuillez entrer une seule lettre (A-Z)."); return; } + // Notification du handler externe, sinon placeholder if (onLetterSubmitted != null) { onLetterSubmitted.accept(inputText.charAt(0)); } else { - JOptionPane.showMessageDialog(window.getWindow(), "Lettre soumise (placeholder) : " + inputText); + JOptionPane.showMessageDialog(window.getWindow(), + "Lettre soumise (placeholder) : " + inputText); } } } diff --git a/src/Fenetre.class b/src/Fenetre.class new file mode 100644 index 0000000000000000000000000000000000000000..97ced7c4dd349345381ace02306f6fd616741ab9 GIT binary patch literal 4189 zcmX^0Z`VEs1_pD67hDW>42fI}W(-N}49Q#!%nXU_3@Ka;tPH6jP8uhJ8ACc3g9t+g zJ3}TH0~bRgNF)m+mkrXD1LEd_Sa~2-`5Zp4PU#b3U|^Wc#W00oDm%k8kTVn6 z8Kw&{Ffz>MVz6MC0}`1l#K6R`fQw-v!yH1!7MTxno){G3C<@rS^K8Z=GIT%X7qSlNI+&QTwC89NGH?~A=A}55mXze@F*1mvs)GnyGcs_b6eX5N<>#eh*cXtPmzrbE$iQZknU`5& z$H>5}p&7==z~Y>rlFG=y?~|FA>Q|bZlv)&$n3R*s$iQ8kT2fjN4)q^@a#3nxNoqL4 zJ7OA|sBVCHNC2V~>>;qFj0_lR!Q!CsNlz_-S%IMl7KnW5sU<$hfh2`)HF7ZVrl*z! zBZZVWx?*@(@qjExc!)bawZsJ;dMvq#nRy_WM}vK-pOcuEt{+@dl$n=q4GK5joW$Iu zltdMfG8IEc1{A&lBZH!bk6UV9YDrP5HIf0&8Hq)S$t9^pU^BRa^Gl18Q{6H_;mre8 zt_Mm;JPe);UOWuG3|@>3LLdQn$^wTRBZDZipi_Q@Phw?$X$eT%5*~)749j>J>=_(* z7?v}vU}Ru(Ni8nU%;RBjXYk-*Sjn)8hry4*pNGMb!HI_N-4;q^*jt47&h`SY+~5V!?1;6E4n^#dSGPWj8}j{ zMg}QlR|kW#igSKmaY?9!>G`P&p`IZ5?K})S z7X&iT0o`FW{%B|HrK84fTq2qVnO$uCEQ&_R${%NQAi zUGqwcQmYh7^HLQ+nXo8T!HSVV45SMl-0+kI(zBI^;Sk85V1waGAnA#bf!#H)EWa|f zh=;+I!HtnYz$rh!q`0IgvA{RABqKkin4gW|umFP>KO4gl9)_a~$JiN;^DvxXILXMs z4vl(723FUy)VvY_hEx1(45tMc&hRjtWjF`2`aBOq5JNCO8^Z+-hKoE5ml!UyGhE?e zxXN&ikwF0DVn_n@Ps&P71{EV3kVFRxNay^#lElos)FNw7P{QRbPA!3i1tWtrk}`;x zZ(?3zIy8Cm6{nVfG^gg3fKnYJgE*3MkOah3kfF?pDJhH$S}5|+$gqYK6R0r+Db7m5 zGK(|8g$;{F6v!BnqSV6D)Z!Ai{N&PN&pcSkz^tJe#mFEEH61-CvKOb81ZP&IGBU7g zc!Iqs3i4upa$-qleqK;&PGU)BS!zf=y8Geo3u9!EC{8VLNli;E%_(ut$uCazFGwu{ zYiDF&(Eyt%hQ)TU1T0XHodt0Q$YGFFECkgIiVlznIQL6}q79acobroOQj6RYlS}f8 zDj69BA!Vp*Zb3;UL<&@*czSwzLP8U!EeWhmAEE?Qo))K;KsbyHau7?gD+Pr%Z*gjg zV@_szUT$h$Nd(BJZXjVc4Ujcqj0|GMsU;ryMVVEg1e60;$;EJ;;RdKOyvfMGTvQ4! zBq6SXq`{!lygX19VvQ}ohn8gKWR_&67Bez%XXcgVXQ%okmZTOT;szXya3etOL5X)r z0=L!-13BOpBZCCQlMtIxOINnUME0L|j)C)~B z;CO(_Iw$7j1ZS3jT6iiLfdg?YB&OjRdIs%%4YAi6xxE65Ud(`l`+%L{IU|EAh9|Ja z2qS|Wesv6r3}y^=3=9mc3{0T*2Ll5G6R4E|rkxpFz_cra8<=)y@L*tI;9+0{HFX#m z8N3-77&bAmGB7hRFr;a1XJFLY#=x|jfjM$J1B;LLZU)v!ZI(dn*Hvw$>H~o^1@g;aXbT82Gj_@Ph>S!2;VD1bnr1z|1WS94y-y1huv> z2yJ5!4&TVYz`)4h!@$5`#lXkFz#zlG!XV4Q!645dz@We&%b>`h%Am|(z@Wll$)LvI z$e_;P#h}UH&!EK+%Ams#%b?4U%Am)<1Zt&0-5<=r!obMDz@V+Qn?WQ}NOU`c*j5G( zkb4E0A_SQtwlRopEBtSIVHU>$ABg7b385kIh7hM4I6O zr-mp74u(VlE>O`8)nWlnh!VRQ%p$iln0xPLu!z*s+QneWz_6Xc3MuLHf#W%vfrBBI zL7X8$fQuoPAr5Ma8Uqv9d_Jvh4A$Da7;Hec+ahd-1Z*4wGebN$OD8Zq1b4w18SXPY mWq80K$F*GE8Ea2xiS-n8`4UVIBh`!+Zd*aYzmT literal 0 HcmV?d00001 diff --git a/src/Partie.class b/src/Partie.class new file mode 100644 index 0000000000000000000000000000000000000000..85cd51fcbd3a82959e9ab4396dbd59e9fb42f688 GIT binary patch literal 271 zcmX^0Z`VEs1_pBmK`sUs23`&ZK6VCvb_M}P1~!|_yv!0iMh0dL%`ip=7U%qwR7M7V zpUk{eztY^K)S{5Yq?}Yn29A>a;F6-uymUqe5e-eBti-ZJ{hY+SbbW}ZH6sI8aDHh~ za;jSvVo^zEsvbxk4+AR$8zTb)BLf>ml#xLIBo5KG*e=O4g literal 0 HcmV?d00001 diff --git a/src/Pendu.class b/src/Pendu.class new file mode 100644 index 0000000000000000000000000000000000000000..3fd926e95f461b7b4fe4cb40edf5abe45b33463e GIT binary patch literal 255 zcmX^0Z`VEs1_pBmel7-P1|D_>UUmjPMg}&U%)HDJJ4Oa(4b3n{1{UZ1lvG9rexJ;| zRKL>Pq|~C2#H5^5Mh2GL#LPTK1~H9jpRB~PME#t^ymbBGlA_GKbZd}CuHgLAqU2P! zOps!(fYiK{QazAD9tIW$Rz?O^um~fA07wj?**_^OHMxXAk%5VUnE?ct7#Kl{85kMZ z7#J9285kKD85kH?wYD=bZe(C!U}RutU|?Va3vw}VGH@_(LX}E_Wf?G)@iH(na4|42 IFfnig0FgN=lK=n! literal 0 HcmV?d00001 From f7aecb038df7ca3779f4a07340dd759b495a9ae9 Mon Sep 17 00:00:00 2001 From: dick Date: Wed, 8 Oct 2025 15:16:13 +0200 Subject: [PATCH 7/7] Event commentaire --- src/Dessin.class | Bin 1799 -> 0 bytes src/Event$1.class | Bin 927 -> 0 bytes src/Event.class | Bin 2490 -> 0 bytes src/Fenetre.class | Bin 4189 -> 0 bytes src/Partie.class | Bin 271 -> 0 bytes src/Pendu.class | Bin 255 -> 0 bytes 6 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/Dessin.class delete mode 100644 src/Event$1.class delete mode 100644 src/Event.class delete mode 100644 src/Fenetre.class delete mode 100644 src/Partie.class delete mode 100644 src/Pendu.class diff --git a/src/Dessin.class b/src/Dessin.class deleted file mode 100644 index 7e611f9a5043f09ff31883d55adc7d869c246a99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1799 zcmX^0Z`VEs1_pD6OfCi)26c7@4K4;I22CyoX$CEJ25l||Rt6mqM;9cm$Hkz}V8G5` z$jM;DU<@KmxEQz?OxYRCSR5P}7`Pbt7|cN;7Mu*M43;346-cu+h_K;euw}3ViP?h) z2N2=N!QjNs;LOh8!pOj8lbM%UV#mn9tf3jk$iU*9pOVVR!0(fpm+DuVo0M7DSHj33rs0#7SeB@tSYD#d0z*7ILn04D5<@Z%LkdGG4?`M=NC!Ecfsug?;vuLvD)fuXGxO5*y#f;R zQgav?ST#I7L7^m2oLUl4l$w@WRFs+$oLQC1$RLgsqHvFcgOp9f6QYZ^IJLwnF*!TE zD8Do>g^@uRNeehIz{&;T9)fwCk%29_C^fMpm61Ud7AGhX$H*WK*A$eRmy!yKK#$D4 zl43>%0dLpHct^hwPe&h5$6!xCcXoyhMh0f@)JjGM9?!hI)FS7c#Ny)AVnzm8NOXgY zMm0snJGIi9kwGZT(I?auVOYGsA0vYhL=!lT_$OthCYM+kAd0g%wFDBepi~J_3UVbx3><2lE{;Lo@$Ny6k&Fxi2o;cEWn|zePAvhm z85uazQ%k}#Q%XRgprPr>$iSJNTH=wKnVwMsOPyfP_$Gptu?kKMU_t+~#2iKj_LR)xg8brCMh0md5d!iogCc`8gA4-*Ff%YR$TG+=Ffzz9 zFfjNrurV+)FfeFoZD(NA+ReZeDaaHd$QZYsfq5GPi`H%i)<{8yuMo7Ifo&TD`$h%^ z21W)21_lNp1{MYe27U$>20;c<1|bGb24MykP?mz2&BVvR&LG0Tz?i3{y`6zWdm97i z0R}E#olOkfn;3YuG4Sf_X5fny;@{37u#G`bXA^_aHU?p>Z44rITH6>z%~)hbS#~gp z3Gn2Yv5K;YvZk1^>4>t5vdOaMh_Y>C5Eo^Y72wH9Fk{ydWfx@=Wfx`L#vm@smSe^N z5?~c&7v)F*i$S<70$e!>qU>NjU}3NVGfq)fGcHk9Q5LXS+&ZG1qFkb!qTC>}AodI7 znDK~mn(>Nqi}ECx@#%>2it?n0@_`5*)(lY|){Jco5+Htp8NVpMD2o7FPJ)>LNEyE< zuc!dXAOWr%GeNMNL{5U45J*l)lvh+RMN~+XML;AcVH<-uTrdGi5ae1jVUU!7D6gn+ zil~4nivR~)Jyy z7?c?t8Ppg&7}Oa;8MGMU7_=F(81xwO8T1+I7>pREGMF*UVK8S{z+l0!ioud$8-oqQ zK?YlfqYQQoXBg}m9x*sGyku};_{`wS@Snkhk(I%dk)OefQH8;W(UKv6(ViiYF@zzQ zF_R&TF_$5nfssL(K?RaF7^E2(!Rd}!NNNK-K|zvY3XVq^$l KFk%Q~;RFDvrFsJq{paBxo1c_;Z zSla9iI_wO3j12r`i8(4csU;<;MV@&Dr6r6E5H1zFsTCz|nW;G` z){G2nB^jB;Dh7-U>^`n#sd*(JA)Cy+%o00B1|^5s-_(+f{1kQueI5n_217;$4!_jm z5|8}i5*`MA1_2%hUIsoM20;cxb_OFJ24e;jb_P=(1~Ue8b_NR`21^Djb_Q!61{(%j z9tJxGLmmcu1_vGnM+PTG26nK0Du#>C!t__egR zGB9fCY-M25+Rnhdk%57MkwJukfq{*Ik%56hm4T5#ltB!tDFLcUOM4pwi>=HK2G*Gj zf?8V`n6@#nZDU|(S;)Ypy^VomIRm%0%nk<5Z46u>^O(Tqi7~J;FfeE^urg>eNHJ(J zC^G0UXfo(Ah%+!Sa4<0cVUS{EV`pGtkN`VXl0k}rfq{iVnn8v^7Azvopv%C(z{SAG Iz|8;#0P9!BO#lD@ diff --git a/src/Event.class b/src/Event.class deleted file mode 100644 index d707c907ea3ec188131d21f1554ddc6375b3b386..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2490 zcmX^0Z`VEs1_pD69xeu11~X0u83uC@VZp^9!(hq9V8vh!B5b%AY#Hph7z`Qg*ct4( z7&sXmKpaPqDkl)jnTx@Q!39LPaxl1oMBG6f4-N)T5bXsr#G8Y`hl|0N!4D+j&&3eH z5Xj9C#1JgRz`zjB&Je-Q5XsIE#mKd%_cK1v&4>( zK~n?n7>HsVwrYkkGO#%3r=&76@cU%urTUfTCZ!gIBqrsgGBP+2X9zCmfXwD9&n!xH zElbTSDQ09~)&L3dCxU$*kXn?MUz7_97?7_vY_HbW*O0|O634nr;vLmopuBLi!+qi$3z4?_V%ArC_lLop+R zdRS^{W=>9Ol|pJ>Nl|K%LTO&ALUC$oPO3sqYDq~^s)B~2Zj`1TJ3|Q%Ln%WU4?{Ua z1v^6}4?`70H9JEM4?`_O9V3H)Q+|F)aY<2Pfp2O_Mt({$KN~|m2SWo7LnA{IBLgeg zv5X7?ATR5K(}sUiR%&tyBZDkh2t9OtGK))6^HPf#8N@*H75c^HnR)5@ULmO!C2pCi zIVmV+1(y_M=A|<-utU>0BLiQ0Y6&DlJo5@lOBflXG&I5Sh-s2FBLi=GYDsWvUW!v` zNlAVlBZD})Vu*w_BZDxCYaqgm41$R%DUeiwaJLeUbOTcXPC7~&KH!kC#^p9p`r=DW zN%2mtglS}Cz)X@z(qMDh(^E@8LB+@*0`&?c&>;b3&B(w~Qk0p?$iQ8aA6ih5TI8Hq zoXW_+UJTPE3Uxd5=a0-JPAoz;Ba6|&PXhBEMa6|(eTuChDIMm6})U>WMD5#%qdOvPh(_| z&~Sz%6Ero}j11CXOR<+!j0|jv$;qh&C5#Lx0ReXj7eg~c3nPO9C`lHjDir6J=4KYB zDrgksBqpb3);El$Ac2I5#~ zG_f!PSuAfftc==m|T)yRLRcJ#mKld53sR9Kp~|C?Tn-B+Bq68~&WSlW!I>qg*6a-3 zj0~z69>V4}Mg}?j>KGImWEf-_7#ZXkm>7gWg)IXEgAk~^Wng4bVPIfjVo+sZVPIrX zV^C*cV$fhPy42%q#3=9ln46FVuX+Qz_*utkc2je&tdmVtvojzNGykwKI}i9w1%l|h}sfPs-g zmq8C|gCYYX0}}%S1FP0H1|EcVF0h~}0}F#00~4sifGXe2zzlX!GQ=UQKHA$Dc(*a| zZDZi~)fN)i#vrJ(jX{WI0RxYYknlDJky#7^5S5}rVmlbbH)?HRU_Qnm4x)6Jw=qcU zV36F&AjQP6oIx0>PG=W`Gy?-jEjWllA*RK^#lXN|#lXQ}%^=KR!yw6E$DqYv&tS&j zz+lec%wWgh!VtvZ#*oC|!C=6^z`)1A@|Qu2oxzZu!H7qSpMizJ7;KgagDC?8ILbH~ i*xM4518+3}FCe8H!i{ diff --git a/src/Fenetre.class b/src/Fenetre.class deleted file mode 100644 index 97ced7c4dd349345381ace02306f6fd616741ab9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4189 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 mWq80K$F*GE8Ea2xiS-n8`4UVIBh`!+Zd*aYzmT diff --git a/src/Partie.class b/src/Partie.class deleted file mode 100644 index 85cd51fcbd3a82959e9ab4396dbd59e9fb42f688..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 271 zcmX^0Z`VEs1_pBmK`sUs23`&ZK6VCvb_M}P1~!|_yv!0iMh0dL%`ip=7U%qwR7M7V zpUk{eztY^K)S{5Yq?}Yn29A>a;F6-uymUqe5e-eBti-ZJ{hY+SbbW}ZH6sI8aDHh~ za;jSvVo^zEsvbxk4+AR$8zTb)BLf>ml#xLIBo5KG*e=O4g diff --git a/src/Pendu.class b/src/Pendu.class deleted file mode 100644 index 3fd926e95f461b7b4fe4cb40edf5abe45b33463e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 255 zcmX^0Z`VEs1_pBmel7-P1|D_>UUmjPMg}&U%)HDJJ4Oa(4b3n{1{UZ1lvG9rexJ;| zRKL>Pq|~C2#H5^5Mh2GL#LPTK1~H9jpRB~PME#t^ymbBGlA_GKbZd}CuHgLAqU2P! zOps!(fYiK{QazAD9tIW$Rz?O^um~fA07wj?**_^OHMxXAk%5VUnE?ct7#Kl{85kMZ z7#J9285kKD85kH?wYD=bZe(C!U}RutU|?Va3vw}VGH@_(LX}E_Wf?G)@iH(na4|42 IFfnig0FgN=lK=n!