diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..eb07785 --- /dev/null +++ b/Makefile @@ -0,0 +1,41 @@ +# Répertoires +SRC_DIR = . +BIN_DIR = bin + +# Trouve tous les fichiers .java +SOURCES := $(shell find $(SRC_DIR) -name "*.java") + +# Classe principale +MAIN = fr.iut_fbleau.Avalam.Main + +# Options javac +JC = javac +JCFLAGS = -d $(BIN_DIR) + +# Options java +JAVA = java +JAVAFLAGS = -cp $(BIN_DIR) + +# Règle par défaut +all: build + +# Compilation +build: + @echo "Compilation du projet..." + @mkdir -p $(BIN_DIR) + @$(JC) $(JCFLAGS) $(SOURCES) + @echo "✔ Compilation terminée !" + +# Exécution +run: + @echo "Lancement du jeu Avalam..." + @$(JAVA) $(JAVAFLAGS) $(MAIN) + +# Nettoyage des .class +clean: + @echo "Suppression des fichiers compilés..." + @rm -rf $(BIN_DIR) + @echo "✔ Nettoyage terminé !" + +# Recompile + run +re: clean all run diff --git a/fr/iut_fbleau/Avalam/AvalamPanel.java b/fr/iut_fbleau/Avalam/AvalamPanel.java new file mode 100644 index 0000000..17a9408 --- /dev/null +++ b/fr/iut_fbleau/Avalam/AvalamPanel.java @@ -0,0 +1,184 @@ +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; + } +} diff --git a/fr/iut_fbleau/Avalam/AvalamWindow.java b/fr/iut_fbleau/Avalam/AvalamWindow.java new file mode 100644 index 0000000..7d7038a --- /dev/null +++ b/fr/iut_fbleau/Avalam/AvalamWindow.java @@ -0,0 +1,30 @@ +package fr.iut_fbleau.Avalam; + +import javax.swing.*; + +/** + * La classe AvalamWindow représente la fenêtre principale du jeu Avalam. + * + * Elle crée une fenêtre Swing, lui donne une taille, un titre, + * puis y ajoute un AvalamPanel qui contient l'affichage réel du plateau. + * + * @version 1.0 + */ +public class AvalamWindow extends JFrame { + + /** + * Constructeur : initialise la fenêtre du jeu. + */ + public AvalamWindow() { + super("Avalam - Plateau Graphique"); + + setSize(750, 750); + setLocationRelativeTo(null); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + // Ajout du panneau contenant le plateau + add(new AvalamPanel()); + + setVisible(true); + } +} diff --git a/fr/iut_fbleau/Avalam/Color.java b/fr/iut_fbleau/Avalam/Color.java index 5b91d92..cf75509 100644 --- a/fr/iut_fbleau/Avalam/Color.java +++ b/fr/iut_fbleau/Avalam/Color.java @@ -1,6 +1,33 @@ -package fr.iut_fbleau.Avalam ; +package fr.iut_fbleau.Avalam; -public enum Color{ - RED, - YELLOW -} \ No newline at end of file +/** + * L'énumération Color représente la couleur du sommet d'une tour Avalam. + * + * Chaque valeur contient directement sa couleur Swing associée, + * ce qui évite les conversions dans le code graphique. + * + * @version 2.0 + */ +public enum Color { + + RED(java.awt.Color.RED), + YELLOW(java.awt.Color.YELLOW); + + /** Couleur Swing associée à la couleur Avalam. */ + private final java.awt.Color swingColor; + + /** + * Constructeur interne de l’énumération. + * @param col couleur Swing associée. + */ + Color(java.awt.Color col) { + this.swingColor = col; + } + + /** + * Retourne la couleur Swing (java.awt.Color) associée. + */ + public java.awt.Color getSwingColor() { + return this.swingColor; + } +} diff --git a/fr/iut_fbleau/Avalam/Main.java b/fr/iut_fbleau/Avalam/Main.java new file mode 100644 index 0000000..ef3497d --- /dev/null +++ b/fr/iut_fbleau/Avalam/Main.java @@ -0,0 +1,17 @@ +package fr.iut_fbleau.Avalam; + +import fr.iut_fbleau.Avalam.AvalamWindow; + +/** + * Classe principale lançant le programme Avalam. + * + * Le point d'entrée du programme crée simplement une fenêtre AvalamWindow, + * qui initialise l'affichage du jeu. + * + * @version 1.0 + */ +public class Main { + public static void main(String[] args) { + new AvalamWindow(); + } +} diff --git a/fr/iut_fbleau/AvalamTests/TestTower.class b/fr/iut_fbleau/AvalamTests/TestTower.class new file mode 100644 index 0000000..a832969 Binary files /dev/null and b/fr/iut_fbleau/AvalamTests/TestTower.class differ diff --git a/fr/iut_fbleau/GameAPI/AbstractBoard.class b/fr/iut_fbleau/GameAPI/AbstractBoard.class new file mode 100644 index 0000000..5372ca6 Binary files /dev/null and b/fr/iut_fbleau/GameAPI/AbstractBoard.class differ diff --git a/fr/iut_fbleau/GameAPI/AbstractGame.class b/fr/iut_fbleau/GameAPI/AbstractGame.class new file mode 100644 index 0000000..9c63903 Binary files /dev/null and b/fr/iut_fbleau/GameAPI/AbstractGame.class differ diff --git a/fr/iut_fbleau/GameAPI/AbstractGamePlayer.class b/fr/iut_fbleau/GameAPI/AbstractGamePlayer.class new file mode 100644 index 0000000..ff18254 Binary files /dev/null and b/fr/iut_fbleau/GameAPI/AbstractGamePlayer.class differ diff --git a/fr/iut_fbleau/GameAPI/AbstractPly.class b/fr/iut_fbleau/GameAPI/AbstractPly.class new file mode 100644 index 0000000..5a3a4d2 Binary files /dev/null and b/fr/iut_fbleau/GameAPI/AbstractPly.class differ diff --git a/fr/iut_fbleau/GameAPI/IBoard.class b/fr/iut_fbleau/GameAPI/IBoard.class new file mode 100644 index 0000000..986c0b3 Binary files /dev/null and b/fr/iut_fbleau/GameAPI/IBoard.class differ diff --git a/fr/iut_fbleau/GameAPI/Player.class b/fr/iut_fbleau/GameAPI/Player.class new file mode 100644 index 0000000..c659c8b Binary files /dev/null and b/fr/iut_fbleau/GameAPI/Player.class differ diff --git a/fr/iut_fbleau/GameAPI/Result.class b/fr/iut_fbleau/GameAPI/Result.class new file mode 100644 index 0000000..4234ba9 Binary files /dev/null and b/fr/iut_fbleau/GameAPI/Result.class differ diff --git a/fr/iut_fbleau/Res/Plateau.txt b/fr/iut_fbleau/Res/Plateau.txt new file mode 100644 index 0000000..250d0c9 --- /dev/null +++ b/fr/iut_fbleau/Res/Plateau.txt @@ -0,0 +1,9 @@ +0,0,1,2,0,0,0,0,0 +0,1,2,1,2,0,0,0,0 +0,2,1,2,1,2,1,0,0 +0,1,2,1,2,1,2,1,2 +1,2,1,2,0,2,1,2,1 +2,1,2,1,2,1,2,1,0 +0,0,1,2,1,2,1,2,0 +0,0,0,0,2,1,2,1,0 +0,0,0,0,0,2,1,0,0