package fr.iut_fbleau.Avalam; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; /** * La classe AvalamPanel gère l'affichage graphique du plateau Avalam. * * Elle a pour rôle : * - de charger la configuration initiale du plateau depuis le fichier Plateau.txt * - d'afficher les pions sous forme de boutons ronds cliquables * - de gérer leur positionnement visuel sur une fenêtre Swing * * À ce stade, les clics ne modifient pas le modèle (aucune règle appliquée), * ils servent seulement à confirmer que la sélection fonctionne. * * @version 1.0 * @author --- */ public class AvalamPanel extends JPanel { /** Grille du plateau contenant des objets Tower ou null (case vide). */ private Tower[][] grid = new Tower[9][9]; /** Taille visuelle d’un pion. */ private final int pionTaille = 50; /** Distance entre deux pions. */ private final int pas = 70; /** Décalage horizontal pour centrer le plateau. */ private final int xBase = 60; /** Décalage vertical pour centrer le plateau. */ private final int yBase = 60; /** * Constructeur. * Initialise le layout, charge le plateau et affiche les pions. */ public AvalamPanel() { setLayout(null); chargerPlateau(); afficherPions(); } /** * Charge la grille du plateau depuis le fichier Plateau.txt (matrice du plateau). * * 0 → case vide * 1 → pion du joueur 1 (couleur YELLOW) * 2 → pion du joueur 2 (couleur RED) */ private void chargerPlateau() { try { File f = new File("fr/iut_fbleau/Res/Plateau.txt"); BufferedReader br = new BufferedReader(new FileReader(f)); String line; int row = 0; while ((line = br.readLine()) != null && row < 9) { String[] parts = line.split(","); for (int col = 0; col < 9; col++) { int valeur = Integer.parseInt(parts[col]); if (valeur == 1) grid[row][col] = new Tower(Color.YELLOW); else if (valeur == 2) grid[row][col] = new Tower(Color.RED); else grid[row][col] = null; } row++; } br.close(); } catch (Exception e) { e.printStackTrace(); } } /** * Ajoute graphiquement les pions sur le plateau. * Chaque pion est représenté par un bouton rond Swing. */ private void afficherPions() { for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { Tower t = grid[i][j]; if (t != null) { // Conversion couleur Avalam → couleur Swing java.awt.Color swingColor = t.getColor().getSwingColor(); JButton pion = creerBoutonRond(swingColor); int x = xBase + j * pas; int y = yBase + i * pas; pion.setBounds(x, y, pionTaille, pionTaille); int finalI = i; int finalJ = j; // !!!TEMPORAIRE!!! permet de voir quel endroit cliqué pion.addActionListener(e -> JOptionPane.showMessageDialog(null, "Tu as cliqué sur (" + finalI + ", " + finalJ + ")") ); add(pion); } } } } /** * Crée un bouton rond représentant un pion. * * Un effet d'assombrissement est appliqué au survol pour un meilleur feedback visuel. * * @param couleurSwing la couleur Swing du pion * @return un bouton circulaire */ private JButton creerBoutonRond(java.awt.Color couleurSwing) { JButton bouton = new JButton() { /** Indique si la souris survole le bouton. */ private boolean hover = false; { setBorderPainted(false); setContentAreaFilled(false); setFocusPainted(false); setOpaque(false); // Gestion du survol addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { hover = true; repaint(); } @Override public void mouseExited(MouseEvent e) { hover = false; repaint(); } }); } /** * Dessine le pion sous forme de cercle. */ @Override protected void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g.create(); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setColor(hover ? couleurSwing.darker() : couleurSwing); g2.fillOval(0, 0, getWidth(), getHeight()); g2.dispose(); } /** * Rend le clique précis au cercle (pas carré). */ @Override public boolean contains(int x, int y) { double dx = x - getWidth() / 2.0; double dy = y - getHeight() / 2.0; return dx * dx + dy * dy <= (getWidth() / 2.0) * (getWidth() / 2.0); } }; bouton.setPreferredSize(new Dimension(pionTaille, pionTaille)); return bouton; } }