Files
TD3_DEV51_brigitte_aissi/PenduJudeChrist/HangedGameGUI.java
Aissi Jude Christ 9869c9b289 branche jude
2025-10-08 14:17:18 +02:00

248 lines
7.8 KiB
Java

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<Character> 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();
}
});
}
}