import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.HashSet; import java.util.Set; public class HangedGameGUI { private static final int MAX_LIVES = 12; private String word; private Set guessedLetters; private int lives; // Composants de l'interface private JFrame frame; private JLabel wordLabel; private JLabel livesLabel; private JLabel messageLabel; private JTextField letterField; private JButton guessButton; private JPanel hangmanPanel; public HangedGameGUI() { word = WordSelector.pickRandomWord(); guessedLetters = new HashSet<>(); lives = MAX_LIVES; initializeGUI(); } private void initializeGUI() { frame = new JFrame("Jeu du Pendu"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.setSize(500, 400); // Panel du haut - Affichage du mot et des vies JPanel topPanel = new JPanel(new GridLayout(3, 1)); wordLabel = new JLabel("", JLabel.CENTER); wordLabel.setFont(new Font("Arial", Font.BOLD, 24)); updateWordDisplay(); livesLabel = new JLabel("Vies: " + lives + "/" + MAX_LIVES, JLabel.CENTER); livesLabel.setFont(new Font("Arial", Font.PLAIN, 16)); messageLabel = new JLabel("Devinez le mot !", JLabel.CENTER); messageLabel.setFont(new Font("Arial", Font.ITALIC, 14)); topPanel.add(wordLabel); topPanel.add(livesLabel); topPanel.add(messageLabel); // Panel du pendu (visuel simple) hangmanPanel = new JPanel() { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); drawHangman(g); } }; hangmanPanel.setPreferredSize(new Dimension(200, 200)); hangmanPanel.setBackground(Color.WHITE); // Panel de saisie JPanel inputPanel = new JPanel(); inputPanel.setLayout(new FlowLayout()); JLabel inputLabel = new JLabel("Entrez une lettre:"); letterField = new JTextField(2); letterField.setFont(new Font("Arial", Font.BOLD, 18)); guessButton = new JButton("Deviner"); inputPanel.add(inputLabel); inputPanel.add(letterField); inputPanel.add(guessButton); // Ajout des composants à la fenêtre frame.add(topPanel, BorderLayout.NORTH); frame.add(hangmanPanel, BorderLayout.CENTER); frame.add(inputPanel, BorderLayout.SOUTH); // Gestion des événements setupEventHandlers(); frame.setVisible(true); } private void drawHangman(Graphics g) { int errors = MAX_LIVES - lives; g.setColor(Color.BLACK); // Base if (errors >= 1) g.drawLine(50, 150, 100, 150); // Poteau if (errors >= 2) g.drawLine(75, 150, 75, 50); // Traverse if (errors >= 3) g.drawLine(75, 50, 125, 50); // Corde if (errors >= 4) g.drawLine(125, 50, 125, 70); // Tête if (errors >= 5) g.drawOval(120, 70, 10, 10); // Corps if (errors >= 6) g.drawLine(125, 80, 125, 110); // Bras gauche if (errors >= 7) g.drawLine(125, 85, 115, 95); // Bras droit if (errors >= 8) g.drawLine(125, 85, 135, 95); // Jambe gauche if (errors >= 9) g.drawLine(125, 110, 115, 125); // Jambe droite if (errors >= 10) g.drawLine(125, 110, 135, 125); // Visage triste if (errors >= 11) { g.drawArc(122, 73, 3, 3, 0, 180); // œil gauche g.drawArc(127, 73, 3, 3, 0, 180); // œil droit g.drawArc(122, 78, 6, 3, 0, -180); // bouche } } private void updateWordDisplay() { StringBuilder display = new StringBuilder(); for (int i = 0; i < word.length(); i++) { char letter = word.charAt(i); if (guessedLetters.contains(letter)) { display.append(letter).append(" "); } else { display.append("_ "); } } wordLabel.setText(display.toString()); } private void setupEventHandlers() { // Bouton deviner guessButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { processGuess(); } }); // Entrée dans le champ texte letterField.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { processGuess(); } }); } private void processGuess() { String input = letterField.getText().toLowerCase().trim(); letterField.setText(""); if (input.length() != 1 || !Character.isLetter(input.charAt(0))) { messageLabel.setText("Veuillez entrer une seule lettre !"); return; } char letter = input.charAt(0); if (guessedLetters.contains(letter)) { messageLabel.setText("Vous avez déjà essayé cette lettre !"); return; } guessedLetters.add(letter); if (!word.contains(String.valueOf(letter))) { lives--; messageLabel.setText("Mauvaise lettre ! Il vous reste " + lives + " vies."); } else { messageLabel.setText("Bonne lettre ! Continuez !"); } updateWordDisplay(); livesLabel.setText("Vies: " + lives + "/" + MAX_LIVES); hangmanPanel.repaint(); checkGameStatus(); } private void checkGameStatus() { if (lives <= 0) { endGame(false); } else if (GameLogic.isWordGuessed(word, guessedLetters)) { endGame(true); } } private void endGame(boolean won) { guessButton.setEnabled(false); letterField.setEnabled(false); if (won) { messageLabel.setText("VICTOIRE ! Le mot était: " + word); JOptionPane.showMessageDialog(frame, "Félicitations ! Vous avez gagné !\n" + "Le mot était: " + word + "\n" + "Vies restantes: " + lives, "Victoire !", JOptionPane.INFORMATION_MESSAGE); } else { messageLabel.setText("PERDU ! Le mot était: " + word); JOptionPane.showMessageDialog(frame, "Désolé ! Vous avez perdu !\n" + "Le mot était: " + word, "Défaite", JOptionPane.ERROR_MESSAGE); } // Bouton pour rejouer int choice = JOptionPane.showConfirmDialog(frame, "Voulez-vous rejouer ?", "Nouvelle partie", JOptionPane.YES_NO_OPTION); if (choice == JOptionPane.YES_OPTION) { restartGame(); } } private void restartGame() { word = WordSelector.pickRandomWord(); guessedLetters.clear(); lives = MAX_LIVES; guessButton.setEnabled(true); letterField.setEnabled(true); updateWordDisplay(); livesLabel.setText("Vies: " + lives + "/" + MAX_LIVES); messageLabel.setText("Nouvelle partie - Devinez le mot !"); hangmanPanel.repaint(); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new HangedGameGUI(); } }); } }