From 7d2a0a12f9f81acfbc32ba8204f387f89831aea9 Mon Sep 17 00:00:00 2001 From: raban Date: Wed, 8 Oct 2025 14:55:22 +0200 Subject: [PATCH] =?UTF-8?q?Affichage=20int=C3=A9gr=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- out/Affiche.class | Bin 0 -> 2936 bytes out/Mouse.class | Bin 0 -> 643 bytes out/fr/iut/Projet/Action.class | Bin 5331 -> 4791 bytes out/fr/iut/Projet/Affiche.class | Bin 0 -> 3583 bytes out/fr/iut/Projet/Random_word.class | Bin 3721 -> 3725 bytes src/fr/iut/Projet/Action.java | 215 ++++++++++++---------------- src/fr/iut/Projet/Affiche.java | 118 +++++++++++---- src/fr/iut/Projet/Mouse.java | 25 ---- src/fr/iut/Projet/Random_word.java | 7 +- 9 files changed, 182 insertions(+), 183 deletions(-) create mode 100644 out/Affiche.class create mode 100644 out/Mouse.class create mode 100644 out/fr/iut/Projet/Affiche.class delete mode 100644 src/fr/iut/Projet/Mouse.java diff --git a/out/Affiche.class b/out/Affiche.class new file mode 100644 index 0000000000000000000000000000000000000000..c56eac450c23afe2e8f49b458850fadb2e3944e6 GIT binary patch literal 2936 zcmX^0Z`VEs1_pD6nOqEd4DOr^x(ps5!jp?Zm%$4p<_%)`fCyhM20sRW5Gw#g1cJCh zAR?HZA%vYFl*Pe;fq{#Gk0FeUftMkilR<_d0>lDqi3Dkh0uj+5A_gQ83nJn`L_A0= zft?|di$R7ViN%otVo)+jE(K&zDu_s9XGrH@$lzj7X2=A|WN|QLgXkPChFpd`5Gx;~ ztbl`|ke#83ouQbKfu*=4wSbX<(UXyZtuntfJTs4xfia4afz2i}FSEpsk%3u5GmMde z#W_DEm63tpCo?bAuQWF)wJ0PpDJPYYfxS4jBp7T2i-spiC1-JJNhH)D7L6#75MM!J zW?qSNer`d2UTR(mBZHWRPgY`CqJCm|iN1SLVnIe`a%Z67$k?6Z04uI6&GQON$a285FSV@q_}9rJNwu!P%ub zIgAW~AU4GLzNy8VZ7K!(hx{!o#4?V8Fv* z$Y8|7Py*swGuZGjlrog@FqAV?urpNhFjO&A^Dxvf)bcRYfrxsB1|Eh+h9*V^VUQ^( z!C>UV$RGk2bxJJGOb#w7%Fj*(+11R$(8AEl!_dai&ck5GV9&$g03w`0gbRr10NLLO zGQJB$I5IdfGVsAobI#AnF9Mm<03y117@WNHP<%6P$)v+iuF$bi! zpNC-r!$d{~PIpINR|Wqt*B~B-Neq+O8K&?sOl6qH!!VtppNC-v$Po5O|4@Z+Pd`Qm zc4$yBGKhf;uFx+o&&*5L_d-et>_w^Iw86;0ky-3tkXTrn3QloRj10W#sU=Q{$=T^e z`K5U&j0{2=nutUL_K7tkgCNLYl<;F@;3!Tl0n0No2qQ&4SO}a}IMP!~!ZTA!GQd`O zGBR+cr9 z^8{xxup1#_tl=J>A+C%J%t5X$j11yXJ985A()EK&iZb)ktsz=K*%T6~LQplJyay5i zyNWM8wFJcRO)V+POa^B)q|io^u|`gvNaBnP+{Iw~paCliwFTKFnx2ddT%h~~aTy~6 zt9y{Es~>{`gD!&}0|NsS0~07KfmwzOMhpxLoD2-09LB)NV9LP2pwGa>z{tSBz^}EP zfl-TjD+3dVVBW~Uz`)30#=yY9$H2_Mz`(-5!obSF$-u_I$Y9Q30oAMpHlBfjOG_H0 zaT@~*x;{<@Rt7ExP6loUMg~g;D{T6hwXo>pV_;?AXW(QIU|?aeX0UO2Z#29!O#2G{wBp8$!q#3jrWEjjDWEt!jE;#=yX!#lX*?%^<^|%b>}i$6(H2z~I7Q z$iM_D+91|5+B0x5a4|42+z@1VXe*FnCtzg8A|uMenv-D0Dl5v8V8$lOCXkX~#x7uE z#v$Nl#t8~5mW2$w+A^}DETSyi7^FZVtP2_VwMAJ)*+f}I*|#xBg2dPsGDv{M1Vj=< zSw%TgMA-yH5}=aoXp#xYk{k;eL_j*(MOisgMA=0-VY&p^kYo~2Wfm}qX+azXat6C7 zhbZSZ25C@;KqAkGfro*C!GwXE!IVLP!HhwL!JI(@oEohd{1~hmvKed`Iv8vj7Bbi| z>}GIaxX$1RjyPEc_Wul43|#CCy6gyK@j3lQ0RgD2@5qa8$Gm;1>vCt5=03d zm;gLbKpuxA1vPM9cVQ4>aAiXVO1$wC{FZQxE<(B8zL2=bbYC<{kUf~+Wu09#H1hz-Kq7!)sjucX1 z5m4FApt_AgO-S8}ReKwQh83G6n2&5+Eni6MpI5JM`% zF@`jTGYshrR~a%G9x!AwJY&dW_`s0Oz{KDJ3tEP91~vwE1_lOu?M)2Y*xak*3v#ZX zt`5kpEMT{?fZWO|U}VOotpmzs+Zd1>3W?u526l#g262W01}TO@26=`e1~rCa21AAt U22+Mo20Ml_21W)~aQW{B08HjMQ~&?~ literal 0 HcmV?d00001 diff --git a/out/Mouse.class b/out/Mouse.class new file mode 100644 index 0000000000000000000000000000000000000000..c279c32b92889acb18ddf645e0bc041d4bd73929 GIT binary patch literal 643 zcmX^0Z`VEs1_pBmO)drw1~E z{YrC_Qj0c7)MDPsz@(+Um4SI90|Nsig8%~qgAfA?0|NsG0}BHi11AF~10Mqy10#bV zgAmk!bOvSyCI$uuL+u?5EHfGSw6-uXvutBvUCyAWwS|F6fPE2zgjVDh1}2sSkl|Yx zm_fqZ7}!8oFoCU*VqjxnVBlk5XAoczVi0DKW)NXeWe{aBV31%CW?*1oVPF!HWng3w I0lQul05QjZr~m)} literal 0 HcmV?d00001 diff --git a/out/fr/iut/Projet/Action.class b/out/fr/iut/Projet/Action.class index 654fe3bac8da8465356cbfd2ec9504730148a184..e07c5a27963bfc054c03ab6a2771ccb126d72b75 100644 GIT binary patch delta 2768 zcmcbtxm~sX)W2Q(7#JAL8I`#hq8TdL8LGG#m>4QK8KM}fxfr4tYCuFSh+8Mbz`)SV z#h}j60^+uEG4L?7u`{%DFm!;JogktMM0B$=^l&i;Rn8+{* z#F`8urm!>APX$>wjf+8wp%Y~4basXr91JtL7~~jcfdpr>Gt2?eb3w}H2{AA-ECeZA z#Llo7CNuWZYShu5;`R=h+!9Og_MvFjoQB?*d=B4E4#+T<8 zrSLE$GoH zJPfxOZu2nQVYti4Ad2c5sJnR>QW?^q2I(i3m*~4>=BDNqXXfYeFr+iw-(S$G(V7&3SmSsB@Q7>XH6co^9kIoKIFc^J7ExhEfDQ&QpKVdQ1_%)`jX$ic(N z&v2WEQGk(+hf$E>CJ&V@CE!w z#TdmI8ARaX(6F04k3(THGpGCHC7ec+y*L9V%W~;Xp32q0!mOd`Ia!!H!kZ&KwZtd0 zEVY=Cfuk7CWX&uN&(C9I09hTGUmBj7$H>54oLb_Vl39|Nl#|NND8a)h$tcUiP|8ro z&M3#j@SahAau2sDqvGa6+^ZQGl_ux$`Zz~1L^CijurV-!vK0dZ0~06#gXsi@crcyF zkOZca8B)M>Dnl9r0|N&GBSShv1_L8Q=H$P;cJ)~d3=DD%>1`H|;h739kMhr}#91qgLz`&@+z{bGHz`$@xYc~T=q!90R2EMHfTv}TgxY)Ka z@PlYUragj;U$!v_XzgYYjNHy3w3R_vYYT($ZU&J^LB=>i#tGXQM7J@Bfy6e|Gl*|v zkN`1RwlPR*?PidQ)Y`(pvW-D{JA=$t23f5w46?f!tkw#|SA+6dw=!7OgDlw2 zU}ME9$qEX5A=~W?GTRvJ!X;TjAp~OSO0q&Vux(|q+Rb1eDde!7!O@CMl5IDG6DYd4 zwlg?yV{p-xWCJVI)&=_jloqtNF}Q{!f;Edlih+S4l!2cif@U!oVa9Y7P`ZayA14LkI&CIG-AT5&$$yZDR-q zp=_*n+bNcFv~WE@Z}8Lpp?wKjUg1|5$zoeL7)(4-o_9CG9MC%QVeVib)am^#jt}x zlwlWxEW=&~Rfc^Gx(xeaz7k~@U;-6{P%C8_7{OMuYHeeP1epYJDWpg;U|?n_2M1LJ sqYMKB0~Z4$qZFe8qcnpgLp=ingAfA~LjwadLnA{ILnFg{21bSj0LtTWuK)l5 delta 3179 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 diff --git a/out/fr/iut/Projet/Affiche.class b/out/fr/iut/Projet/Affiche.class new file mode 100644 index 0000000000000000000000000000000000000000..2f899f19811e3acd7b84348b652ccab8c5fa38dc GIT binary patch literal 3583 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 diff --git a/src/fr/iut/Projet/Action.java b/src/fr/iut/Projet/Action.java index 5bcaf5e..c215214 100644 --- a/src/fr/iut/Projet/Action.java +++ b/src/fr/iut/Projet/Action.java @@ -4,29 +4,42 @@ import javax.swing.*; import java.awt.*; /** - * Classe qui représente l'interface graphique du jeu du pendu. - * Elle gère l'affichage du mot caché, des lettres incorrectes, des vies - * et permet de saisir des lettres. Un bouton permet de relancer le jeu. + * Classe principale qui gère l'interface graphique du jeu du pendu. + *

+ * Cette classe crée la fenêtre du jeu, affiche le mot caché, les lettres incorrectes, + * le dessin du pendu (via {@link Affiche}), et permet à l'utilisateur de saisir des lettres. + * Elle gère également la logique de mise à jour et la fin de partie. + *

+ * + * @author + * @version 1.0 */ public class Action { - // Fenêtre principale du jeu + /** Fenêtre principale du jeu. */ private JFrame gameFrame; - // Labels pour afficher le mot, les lettres incorrectes et les vies + /** Label affichant le mot caché avec les lettres découvertes. */ private JLabel wordLabel; - private JLabel incorrectLettersLabel; - private JLabel livesLabel; - // Champ de saisie pour entrer une lettre + /** Label affichant la liste des lettres incorrectes. */ + private JLabel incorrectLettersLabel; + + /** Champ de texte permettant à l'utilisateur d'entrer une lettre. */ private JTextField letterInputField; - // Instance du jeu + /** Instance du jeu, contenant la logique (mot, vies, lettres, etc.). */ private Random_word game; + /** Composant graphique qui affiche le dessin du pendu. */ + private Affiche affiche; + /** - * Constructeur de la classe Action. - * Initialise le jeu, les composants graphiques et affiche la fenêtre. + * Constructeur de la classe {@code Action}. + *

+ * Initialise le jeu, crée les composants graphiques, met en place la mise en page + * et affiche la fenêtre du jeu. + *

*/ public Action() { game = new Random_word(); @@ -36,27 +49,25 @@ public class Action { gameFrame.setVisible(true); } - // ==================== Initialisation des composants ==================== + // ==================== Initialisation ==================== /** - * Initialise tous les composants graphiques : - * - Fenêtre principale - * - Labels pour le mot, les vies et les lettres incorrectes - * - Champ de saisie pour entrer les lettres + * Initialise tous les composants graphiques (labels, champs, boutons...). */ private void initializeComponents() { gameFrame = new JFrame("Hanging Man"); gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - gameFrame.setSize(600, 400); + gameFrame.setSize(700, 500); + + affiche = new Affiche(); + affiche.setPreferredSize(new Dimension(350, 400)); + affiche.setBackground(Color.WHITE); + affiche.setOpaque(true); wordLabel = new JLabel(game.getHiddenWord()); wordLabel.setFont(new Font("Arial", Font.BOLD, 32)); wordLabel.setHorizontalAlignment(SwingConstants.CENTER); - livesLabel = new JLabel("Lives: " + game.getLives()); - livesLabel.setFont(new Font("Arial", Font.BOLD, 20)); - livesLabel.setHorizontalAlignment(SwingConstants.CENTER); - incorrectLettersLabel = new JLabel("Incorrect letters: " + game.getIncorrectLetters()); incorrectLettersLabel.setFont(new Font("Arial", Font.PLAIN, 20)); incorrectLettersLabel.setHorizontalAlignment(SwingConstants.CENTER); @@ -65,119 +76,60 @@ public class Action { letterInputField.setFont(new Font("Arial", Font.PLAIN, 24)); } - // ==================== Layout des composants ==================== + // ==================== Mise en page ==================== /** - * Dispose les composants dans la fenêtre principale en utilisant GridBagLayout. - * Sépare la fenêtre en deux parties : le haut (mot et vies) et le bas (lettres incorrectes, saisie, bouton restart) + * Dispose les composants graphiques dans la fenêtre selon un {@link BorderLayout}. */ private void layoutComponents() { - JPanel mainPanel = new JPanel(new GridBagLayout()); - GridBagConstraints mainConstraints = new GridBagConstraints(); - mainConstraints.gridx = 0; - mainConstraints.fill = GridBagConstraints.BOTH; - mainConstraints.insets = new Insets(5, 5, 5, 5); + JPanel mainPanel = new JPanel(new BorderLayout()); - JPanel topPanel = createTopPanel(); - mainConstraints.gridy = 0; - mainConstraints.weighty = 3.0; - mainConstraints.weightx = 1.0; - mainPanel.add(topPanel, mainConstraints); + // --- panneau gauche : dessin du pendu --- + JPanel leftPanel = new JPanel(new BorderLayout()); + leftPanel.add(affiche, BorderLayout.CENTER); + mainPanel.add(leftPanel, BorderLayout.WEST); - JPanel bottomPanel = createBottomPanel(); - mainConstraints.gridy = 1; - mainConstraints.weighty = 1.0; - mainPanel.add(bottomPanel, mainConstraints); + // --- panneau droit : interface du jeu --- + JPanel rightPanel = new JPanel(new GridBagLayout()); + GridBagConstraints gbc = new GridBagConstraints(); + gbc.gridx = 0; + gbc.fill = GridBagConstraints.BOTH; + gbc.insets = new Insets(5, 5, 5, 5); - gameFrame.add(mainPanel, BorderLayout.CENTER); - } + // Mot caché + gbc.gridy = 0; + gbc.weighty = 1.0; + rightPanel.add(wordLabel, gbc); - /** - * Crée le panneau supérieur avec : - * - Le label des vies (à gauche) - * - Le label du mot caché (à droite) - * @return JPanel configuré pour la partie supérieure - */ - private JPanel createTopPanel() { - JPanel topPanel = new JPanel(new GridBagLayout()); - - // Panel pour les vies - JPanel livesPanel = new JPanel(new GridBagLayout()); - GridBagConstraints livesConstraints = new GridBagConstraints(); - livesConstraints.anchor = GridBagConstraints.CENTER; - livesConstraints.fill = GridBagConstraints.NONE; - livesPanel.add(livesLabel, livesConstraints); - - // Panel pour le mot - JPanel wordPanel = new JPanel(new GridBagLayout()); - GridBagConstraints wordConstraints = new GridBagConstraints(); - wordConstraints.anchor = GridBagConstraints.CENTER; - wordConstraints.fill = GridBagConstraints.NONE; - wordPanel.add(wordLabel, wordConstraints); - - // Ajout des panels dans topPanel - GridBagConstraints leftConstraints = new GridBagConstraints(); - leftConstraints.gridx = 0; - leftConstraints.weightx = 0.5; - leftConstraints.weighty = 1.0; - leftConstraints.fill = GridBagConstraints.BOTH; - topPanel.add(livesPanel, leftConstraints); - - GridBagConstraints rightConstraints = new GridBagConstraints(); - rightConstraints.gridx = 1; - rightConstraints.weightx = 0.5; - rightConstraints.weighty = 1.0; - rightConstraints.fill = GridBagConstraints.BOTH; - topPanel.add(wordPanel, rightConstraints); - - return topPanel; - } - - /** - * Crée le panneau inférieur avec : - * - Le label des lettres incorrectes - * - Le champ de saisie pour entrer une lettre - * - Le bouton "Restart" en bas à droite - * @return JPanel configuré pour la partie inférieure - */ - private JPanel createBottomPanel() { - JPanel bottomPanel = new JPanel(); - bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.Y_AXIS)); - - // Label des lettres incorrectes - incorrectLettersLabel.setAlignmentX(Component.CENTER_ALIGNMENT); - bottomPanel.add(incorrectLettersLabel); + // Lettres incorrectes + gbc.gridy = 1; + rightPanel.add(incorrectLettersLabel, gbc); // Champ de saisie - JLabel promptLabel = new JLabel("Enter a letter:"); - promptLabel.setFont(new Font("Arial", Font.PLAIN, 16)); - promptLabel.setAlignmentX(Component.CENTER_ALIGNMENT); - - JPanel inputRow = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 5)); - inputRow.add(promptLabel); + gbc.gridy = 2; + JPanel inputRow = new JPanel(); + inputRow.add(new JLabel("Enter a letter:")); inputRow.add(letterInputField); - inputRow.setAlignmentX(Component.CENTER_ALIGNMENT); + rightPanel.add(inputRow, gbc); - bottomPanel.add(Box.createVerticalStrut(10)); - bottomPanel.add(inputRow); - - // Bouton "Restart" en bas à droite + // Bouton de redémarrage + gbc.gridy = 3; JButton restartButton = new JButton("Restart"); restartButton.addActionListener(new PlayButtonListener(gameFrame)); - JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); - buttonPanel.add(restartButton); + rightPanel.add(restartButton, gbc); - bottomPanel.add(Box.createVerticalStrut(10)); - bottomPanel.add(buttonPanel); - - return bottomPanel; + mainPanel.add(rightPanel, BorderLayout.CENTER); + gameFrame.add(mainPanel); } // ==================== Gestion du jeu ==================== /** * Gère la saisie d'une lettre par le joueur. - * Vérifie la validité de la lettre, met à jour l'affichage et termine le jeu si nécessaire. + *

+ * Vérifie la validité de la lettre, met à jour le jeu, l'affichage + * et teste si la partie est terminée. + *

*/ private void handleGuess() { String inputText = letterInputField.getText(); @@ -187,17 +139,17 @@ public class Action { char guessedLetter = inputText.charAt(0); String message = game.guessLetter(guessedLetter); + updateUI(); if (game.isGameOver()) endGame(message); } /** - * Vérifie si la saisie de l'utilisateur est valide : - * - Une seule lettre - * - Caractère alphabétique - * @param inputText texte saisi par l'utilisateur - * @return true si la saisie est valide, false sinon + * Vérifie que la saisie de l'utilisateur est une seule lettre valide. + * + * @param inputText texte saisi dans le champ de saisie + * @return {@code true} si la saisie est valide, {@code false} sinon */ private boolean isValidInput(String inputText) { if (inputText.length() != 1 || !Character.isLetter(inputText.charAt(0))) { @@ -208,24 +160,33 @@ public class Action { } /** - * Met à jour l'affichage des labels : - * - Mot caché - * - Lettres incorrectes - * - Nombre de vies restantes + * Met à jour les éléments de l'interface graphique : + *
    + *
  • le mot affiché,
  • + *
  • les lettres incorrectes,
  • + *
  • et le dessin du pendu selon les vies restantes.
  • + *
*/ private void updateUI() { wordLabel.setText(game.getHiddenWord()); incorrectLettersLabel.setText("Incorrect letters: " + game.getIncorrectLetters()); - livesLabel.setText("Lives: " + game.getLives()); + affiche.setLives(game.getLives()); } /** - * Termine le jeu et affiche un message. - * Désactive le champ de saisie. - * @param message Message à afficher (victoire ou défaite) + * Termine la partie en affichant un message selon le résultat (victoire ou défaite) + * et empêche de nouvelles saisies. + * + * @param message message à afficher dans une boîte de dialogue */ private void endGame(String message) { + if (game.isWon()) { + affiche.setYouWin(true); + } else { + affiche.setLives(0); + } + JOptionPane.showMessageDialog(gameFrame, message); letterInputField.setEditable(false); } -} +} \ No newline at end of file diff --git a/src/fr/iut/Projet/Affiche.java b/src/fr/iut/Projet/Affiche.java index 63c9627..c8d06e5 100644 --- a/src/fr/iut/Projet/Affiche.java +++ b/src/fr/iut/Projet/Affiche.java @@ -1,20 +1,58 @@ +package fr.iut.Projet; + import javax.swing.*; import java.awt.*; +/** + * Classe graphique responsable du dessin du pendu dans le jeu. + *

+ * Cette classe hérite de {@link JComponent} et redéfinit la méthode + * {@link #paintComponent(Graphics)} pour afficher le pendu selon le nombre + * de vies restantes. Elle affiche également un message de victoire ou de défaite. + *

+ * + * @author + * @version 1.0 + */ class Affiche extends JComponent { - private int step = 0; + + /** Nombre de vies restantes (entre 0 et 8). */ + private int lives = 8; + + /** Indique si le joueur a gagné. */ private boolean youWin = false; - public void setStep(int step) { - this.step = step; + /** + * Définit le nombre de vies restantes et redessine le composant. + * + * @param lives nombre de vies restantes + */ + public void setLives(int lives) { + this.lives = lives; repaint(); } + /** + * Définit si le joueur a gagné et redessine le composant. + * + * @param value {@code true} si le joueur a gagné, sinon {@code false} + */ public void setYouWin(boolean value) { this.youWin = value; repaint(); } + /** + * Redessine le pendu en fonction du nombre de vies restantes. + *
    + *
  • Affiche la potence dès la première erreur
  • + *
  • Ajoute progressivement les membres du pendu
  • + *
  • Affiche une tête de mort si toutes les vies sont perdues
  • + *
  • Affiche un message "YOU WIN" si la partie est gagnée
  • + *
+ * + * @param g contexte graphique utilisé pour dessiner + */ @Override protected void paintComponent(Graphics g) { super.paintComponent(g); @@ -28,43 +66,67 @@ class Affiche extends JComponent { g2.setStroke(new BasicStroke(3)); g2.setColor(Color.BLACK); - drawGallows(g2); - drawHangman(g2); - - if (step >= 7) drawSkull(g2); + if (lives <= 7) drawGallows(g2); + if (lives <= 6) drawHead(g2); + if (lives <= 5) drawBody(g2); + if (lives <= 4) drawLeftArm(g2); + if (lives <= 3) drawRightArm(g2); + if (lives <= 2) drawLeftLeg(g2); + if (lives <= 1) drawRightLeg(g2); + if (lives == 1) drawAura(g2); + if (lives == 0) drawSkull(g2); if (youWin) drawYouWinMessage(g2); g2.dispose(); } + // ==================== Méthodes de dessin ==================== + + /** Dessine la potence. */ private void drawGallows(Graphics2D g2) { - // Base and vertical post g2.drawLine(50, 350, 200, 350); g2.drawLine(100, 350, 100, 50); - // Horizontal beam and rope g2.drawLine(100, 50, 250, 50); g2.drawLine(250, 50, 250, 100); - // Diagonal support g2.drawLine(100, 100, 180, 50); } - private void drawHangman(Graphics2D g2) { - int headX = 225, headY = 100, headDiam = 50; - int bodyX = headX + headDiam / 2, bodyYStart = headY + headDiam, bodyYEnd = bodyYStart + 100; - int armLength = 60; - int legLength = 70; + // Coordonnées et tailles du pendu + private final int headX = 225, headY = 100, headDiam = 50; + private final int bodyX = headX + headDiam / 2; + private final int bodyYStart = headY + headDiam; + private final int bodyYEnd = bodyYStart + 100; + private final int armLength = 60; + private final int legLength = 70; - if (step >= 1) g2.drawOval(headX, headY, headDiam, headDiam); // head - if (step >= 2) g2.drawLine(bodyX, bodyYStart, bodyX, bodyYEnd); // body - if (step >= 3) g2.drawLine(bodyX, bodyYStart + 20, bodyX - armLength, bodyYStart + 20); // left arm - if (step >= 4) g2.drawLine(bodyX, bodyYStart + 20, bodyX + armLength, bodyYStart + 20); // right arm - if (step >= 5) g2.drawLine(bodyX, bodyYEnd, bodyX - 5, bodyYEnd + legLength); // left leg - if (step >= 6) g2.drawLine(bodyX, bodyYEnd, bodyX + 5, bodyYEnd + legLength); // right leg + /** Dessine la tête du pendu. */ + private void drawHead(Graphics2D g2) { g2.drawOval(headX, headY, headDiam, headDiam); } - if (step == 6) drawAura(g2, headX, headY, headDiam, bodyX, bodyYStart, bodyYEnd, armLength, legLength); + /** Dessine le corps du pendu. */ + private void drawBody(Graphics2D g2) { g2.drawLine(bodyX, bodyYStart, bodyX, bodyYEnd); } + + /** Dessine le bras gauche. */ + private void drawLeftArm(Graphics2D g2) { + g2.drawLine(bodyX, bodyYStart + 20, bodyX - armLength, bodyYStart + 20); } - private void drawAura(Graphics2D g2, int headX, int headY, int headDiam, int bodyX, int bodyYStart, int bodyYEnd, int armLength, int legLength) { + /** Dessine le bras droit. */ + private void drawRightArm(Graphics2D g2) { + g2.drawLine(bodyX, bodyYStart + 20, bodyX + armLength, bodyYStart + 20); + } + + /** Dessine la jambe gauche. */ + private void drawLeftLeg(Graphics2D g2) { + g2.drawLine(bodyX, bodyYEnd, bodyX - 5, bodyYEnd + legLength); + } + + /** Dessine la jambe droite. */ + private void drawRightLeg(Graphics2D g2) { + g2.drawLine(bodyX, bodyYEnd, bodyX + 5, bodyYEnd + legLength); + } + + /** Dessine une aura bleue lorsque le joueur est sur sa dernière vie. */ + private void drawAura(Graphics2D g2) { g2.setColor(new Color(0, 0, 255, 100)); g2.setStroke(new BasicStroke(8, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); g2.drawOval(headX, headY, headDiam, headDiam); @@ -75,27 +137,22 @@ class Affiche extends JComponent { g2.drawLine(bodyX, bodyYEnd, bodyX + 5, bodyYEnd + legLength); } + /** Dessine la tête de mort et le message "GAME OVER". */ private void drawSkull(Graphics2D g2) { int skullX = 225, skullY = 100, skullDiam = 50; - // Skull g2.setColor(Color.BLACK); g2.fillOval(skullX, skullY, skullDiam, skullDiam); - // Eyes g2.setColor(Color.WHITE); g2.fillOval(skullX + skullDiam / 5, skullY + skullDiam / 6, skullDiam / 5, skullDiam / 5); g2.fillOval(skullX + 3 * skullDiam / 5, skullY + skullDiam / 6, skullDiam / 5, skullDiam / 5); - - // Nose g2.fillOval(skullX + skullDiam / 2 - skullDiam / 12, skullY + skullDiam / 2 - skullDiam / 12, skullDiam / 6, skullDiam / 6); - // Mouth g2.setStroke(new BasicStroke(2)); g2.drawLine(skullX + skullDiam / 5, skullY + 2 * skullDiam / 3, skullX + 4 * skullDiam / 5, skullY + 2 * skullDiam / 3); - // GAME OVER message g2.setColor(Color.RED); g2.setFont(new Font("Arial", Font.BOLD, 36)); String message = "GAME OVER"; @@ -106,6 +163,7 @@ class Affiche extends JComponent { g2.drawString(message, xText, yText); } + /** Dessine le message "YOU WIN" en vert en cas de victoire. */ private void drawYouWinMessage(Graphics2D g2) { g2.setColor(Color.GREEN); g2.setFont(new Font("Arial", Font.BOLD, 36)); @@ -116,4 +174,4 @@ class Affiche extends JComponent { int yText = 50; g2.drawString(message, xText, yText); } -} +} \ No newline at end of file diff --git a/src/fr/iut/Projet/Mouse.java b/src/fr/iut/Projet/Mouse.java deleted file mode 100644 index bb270fa..0000000 --- a/src/fr/iut/Projet/Mouse.java +++ /dev/null @@ -1,25 +0,0 @@ -import java.awt.event.*; -import javax.swing.SwingUtilities; - -class Mouse extends MouseAdapter { - private Affiche aff; - private int step = 0; // correspond à Affiche.step - - public Mouse(Affiche aff) { - this.aff = aff; - } - - @Override - public void mousePressed(MouseEvent e) { - if (SwingUtilities.isRightMouseButton(e)) { - // clic droit -> gagne - aff.setYouWin(true); - } else { - // clic gauche -> incrémente étape - if (step < 7) { - step++; - aff.setStep(step); // <-- utiliser setStep - } - } - } -} \ No newline at end of file diff --git a/src/fr/iut/Projet/Random_word.java b/src/fr/iut/Projet/Random_word.java index bc57dcd..adf9114 100644 --- a/src/fr/iut/Projet/Random_word.java +++ b/src/fr/iut/Projet/Random_word.java @@ -102,7 +102,12 @@ public class Random_word { } public boolean isWon() { - return secretWord.equals(String.valueOf(hiddenWord)); + for (char c : hiddenWord) { + if (c == '_') { + return false; + } + } + return true; } public String getSecretWord() {