Compare commits
	
		
			3 Commits
		
	
	
		
			93e31b0aac
			...
			fae2ecf2c8
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| fae2ecf2c8 | |||
| 7679f1f35b | |||
| fd393bfc85 | 
							
								
								
									
										62
									
								
								Jeu_pendu/Front/Gallows.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,62 @@
 | 
				
			|||||||
 | 
					package front;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import javax.swing.*;
 | 
				
			||||||
 | 
					import java.awt.*;
 | 
				
			||||||
 | 
					import java.io.File;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Gère les images du pendu (une par étape).
 | 
				
			||||||
 | 
					 * - Charge les images depuis assets
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class Gallows {
 | 
				
			||||||
 | 
					    /** Dossier d'assets relatif à la racine du projet */
 | 
				
			||||||
 | 
					    private static final String ASSETS_DIR = "assets" + File.separator + "images";
 | 
				
			||||||
 | 
					    /** Nombre d'étapes (0 = aucun membre, 7 = étape finale) */
 | 
				
			||||||
 | 
					    private static final int MAX_STAGE = 6;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static final ImageIcon[] ICONS = new ImageIcon[MAX_STAGE + 1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static {
 | 
				
			||||||
 | 
					        for (int i = 0; i <= MAX_STAGE; i++) {
 | 
				
			||||||
 | 
					            String path = ASSETS_DIR + File.separator + i + ".png";
 | 
				
			||||||
 | 
					            File f = new File(path);
 | 
				
			||||||
 | 
					            if (f.exists()) {
 | 
				
			||||||
 | 
					                ICONS[i] = new ImageIcon(path);
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                // Placeholder si fichier manquant
 | 
				
			||||||
 | 
					                ICONS[i] = placeholder("Missing: " + i + ".png");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Retourne l'icône correspondant au nombre d'erreurs.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static ImageIcon icon(int errors) {
 | 
				
			||||||
 | 
					        int idx = Math.max(0, Math.min(errors, MAX_STAGE));
 | 
				
			||||||
 | 
					        return ICONS[idx];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Crée une petite image placeholder (si un asset est manquant).
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private static ImageIcon placeholder(String text) {
 | 
				
			||||||
 | 
					        int w = 320, h = 240;
 | 
				
			||||||
 | 
					        Image img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
 | 
				
			||||||
 | 
					        Graphics2D g = (Graphics2D) img.getGraphics();
 | 
				
			||||||
 | 
					        g.setColor(Color.LIGHT_GRAY);
 | 
				
			||||||
 | 
					        g.fillRect(0, 0, w, h);
 | 
				
			||||||
 | 
					        g.setColor(Color.DARK_GRAY);
 | 
				
			||||||
 | 
					        g.drawRect(0, 0, w - 1, h - 1);
 | 
				
			||||||
 | 
					        g.drawString(text, 10, h / 2);
 | 
				
			||||||
 | 
					        g.dispose();
 | 
				
			||||||
 | 
					        return new ImageIcon(img);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Import manquant pour BufferedImage
 | 
				
			||||||
 | 
					    private static class BufferedImage extends java.awt.image.BufferedImage {
 | 
				
			||||||
 | 
					        public BufferedImage(int width, int height, int imageType) {
 | 
				
			||||||
 | 
					            super(width, height, imageType);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										123
									
								
								Jeu_pendu/Front/GameUI.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,123 @@
 | 
				
			|||||||
 | 
					package front;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import back.*;
 | 
				
			||||||
 | 
					import javax.swing.*;
 | 
				
			||||||
 | 
					import java.awt.*;
 | 
				
			||||||
 | 
					import java.awt.event.ActionEvent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Interface graphique (Swing) du jeu du pendu.
 | 
				
			||||||
 | 
					 * - Affiche une image différente à chaque erreur.
 | 
				
			||||||
 | 
					 * - Champ de saisie pour entrer une lettre.
 | 
				
			||||||
 | 
					 * - Texte pour le mot masqué et les lettres essayées.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class GameUI {
 | 
				
			||||||
 | 
					    private JFrame frame;
 | 
				
			||||||
 | 
					    private JLabel imgLabel;
 | 
				
			||||||
 | 
					    private JLabel wordLabel;
 | 
				
			||||||
 | 
					    private JLabel triedLabel;
 | 
				
			||||||
 | 
					    private JTextField input;
 | 
				
			||||||
 | 
					    private JButton tryBtn;
 | 
				
			||||||
 | 
					    private JButton newGameBtn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private Game game;
 | 
				
			||||||
 | 
					    private String currentWord;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** Affiche la fenêtre principale */
 | 
				
			||||||
 | 
					    public void show() {
 | 
				
			||||||
 | 
					        setupUI();
 | 
				
			||||||
 | 
					        startNewGame();
 | 
				
			||||||
 | 
					        frame.setVisible(true);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** Initialise les composants Swing */
 | 
				
			||||||
 | 
					    private void setupUI() {
 | 
				
			||||||
 | 
					        frame = new JFrame("Jeu du Pendu");
 | 
				
			||||||
 | 
					        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 | 
				
			||||||
 | 
					        frame.setSize(520, 520);
 | 
				
			||||||
 | 
					        frame.setLocationRelativeTo(null);
 | 
				
			||||||
 | 
					        frame.setLayout(new BorderLayout(12, 12));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Image du pendu
 | 
				
			||||||
 | 
					        imgLabel = new JLabel("", SwingConstants.CENTER);
 | 
				
			||||||
 | 
					        frame.add(imgLabel, BorderLayout.CENTER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Panneau bas: saisie + actions
 | 
				
			||||||
 | 
					        JPanel bottom = new JPanel(new BorderLayout(8, 8));
 | 
				
			||||||
 | 
					        JPanel inputPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
 | 
				
			||||||
 | 
					        input = new JTextField(5);
 | 
				
			||||||
 | 
					        tryBtn = new JButton("Essayer");
 | 
				
			||||||
 | 
					        inputPanel.add(new JLabel("Lettre :"));
 | 
				
			||||||
 | 
					        inputPanel.add(input);
 | 
				
			||||||
 | 
					        inputPanel.add(tryBtn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        newGameBtn = new JButton("Nouvelle partie");
 | 
				
			||||||
 | 
					        bottom.add(inputPanel, BorderLayout.WEST);
 | 
				
			||||||
 | 
					        bottom.add(newGameBtn, BorderLayout.EAST);
 | 
				
			||||||
 | 
					        frame.add(bottom, BorderLayout.SOUTH);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Panneau haut: mot + lettres essayées
 | 
				
			||||||
 | 
					        JPanel top = new JPanel();
 | 
				
			||||||
 | 
					        top.setLayout(new BoxLayout(top, BoxLayout.Y_AXIS));
 | 
				
			||||||
 | 
					        wordLabel = new JLabel("Mot : ");
 | 
				
			||||||
 | 
					        triedLabel = new JLabel("Lettres essayées : ");
 | 
				
			||||||
 | 
					        wordLabel.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
 | 
				
			||||||
 | 
					        triedLabel.setBorder(BorderFactory.createEmptyBorder(0, 8, 8, 8));
 | 
				
			||||||
 | 
					        top.add(wordLabel);
 | 
				
			||||||
 | 
					        top.add(triedLabel);
 | 
				
			||||||
 | 
					        frame.add(top, BorderLayout.NORTH);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Actions
 | 
				
			||||||
 | 
					        tryBtn.addActionListener(this::onTry);
 | 
				
			||||||
 | 
					        input.addActionListener(this::onTry);
 | 
				
			||||||
 | 
					        newGameBtn.addActionListener(e -> startNewGame());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** Démarre une nouvelle partie */
 | 
				
			||||||
 | 
					    private void startNewGame() {
 | 
				
			||||||
 | 
					        currentWord = Words.random();
 | 
				
			||||||
 | 
					        game = new Game(currentWord, 7);
 | 
				
			||||||
 | 
					        input.setText("");
 | 
				
			||||||
 | 
					        input.requestFocusInWindow();
 | 
				
			||||||
 | 
					        refreshUI();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** Gère le clic sur "Essayer" ou Entrée dans le champ */
 | 
				
			||||||
 | 
					    private void onTry(ActionEvent e) {
 | 
				
			||||||
 | 
					        String text = input.getText();
 | 
				
			||||||
 | 
					        if (!Check.isLetter(text)) {
 | 
				
			||||||
 | 
					            JOptionPane.showMessageDialog(frame, "Tape une seule lettre (A-Z).");
 | 
				
			||||||
 | 
					            input.requestFocusInWindow();
 | 
				
			||||||
 | 
					            input.selectAll();
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        char c = Character.toLowerCase(text.charAt(0));
 | 
				
			||||||
 | 
					        Result res = game.play(c);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        switch (res) {
 | 
				
			||||||
 | 
					            case ALREADY -> JOptionPane.showMessageDialog(frame, "Lettre déjà utilisée.");
 | 
				
			||||||
 | 
					            case HIT -> {}   // rien, rafraîchissement visuel suffit
 | 
				
			||||||
 | 
					            case MISS -> {}  // idem
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        input.setText("");
 | 
				
			||||||
 | 
					        refreshUI();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (game.isWin()) {
 | 
				
			||||||
 | 
					            refreshUI();
 | 
				
			||||||
 | 
					            JOptionPane.showMessageDialog(frame, "Bravo ! Le mot était : " + currentWord);
 | 
				
			||||||
 | 
					        } else if (game.isLose()) {
 | 
				
			||||||
 | 
					            refreshUI();
 | 
				
			||||||
 | 
					            JOptionPane.showMessageDialog(frame, "Perdu ! Le mot était : " + currentWord);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** Met à jour l'image et les textes selon l'état courant */
 | 
				
			||||||
 | 
					    private void refreshUI() {
 | 
				
			||||||
 | 
					        imgLabel.setIcon(Gallows.icon(game.getErrors()));
 | 
				
			||||||
 | 
					        wordLabel.setText("Mot : " + game.maskedWord());
 | 
				
			||||||
 | 
					        triedLabel.setText("Lettres essayées : " + String.join(", ", game.triedLetters()));
 | 
				
			||||||
 | 
					        frame.repaint();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
blablabla
 | 
					 | 
				
			||||||
							
								
								
									
										17
									
								
								Jeu_pendu/Main/Main.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					package main;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import front.GameUI;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Point d'entrée du programme.
 | 
				
			||||||
 | 
					 * Lance l'interface graphique du jeu du pendu.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class Main {
 | 
				
			||||||
 | 
					    public static void main(String[] args) {
 | 
				
			||||||
 | 
					        // Démarre l'UI Swing sur le thread de l'EDT
 | 
				
			||||||
 | 
					        javax.swing.SwingUtilities.invokeLater(() -> {
 | 
				
			||||||
 | 
					            GameUI ui = new GameUI();
 | 
				
			||||||
 | 
					            ui.show();
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								Jeu_pendu/assets/images/0.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.9 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Jeu_pendu/assets/images/1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.9 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Jeu_pendu/assets/images/2.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Jeu_pendu/assets/images/3.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.4 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Jeu_pendu/assets/images/4.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Jeu_pendu/assets/images/5.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.9 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Jeu_pendu/assets/images/6.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 4.3 KiB  |