From 2f3b2f3125ad7a11136855a9c8dc0e6bac55afa3 Mon Sep 17 00:00:00 2001 From: amary Date: Thu, 16 Oct 2025 10:32:02 +0200 Subject: [PATCH 1/5] =?UTF-8?q?Mod=C3=A8les?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modèles/Modèle Class.txt | 23 +++++++++++++++++++++++ Modèles/Modèle Event.txt | 23 +++++++++++++++++++++++ Modèles/Modèle Interface.txt | 14 ++++++++++++++ Modèles/Modèle Main.txt | 14 ++++++++++++++ 4 files changed, 74 insertions(+) create mode 100644 Modèles/Modèle Class.txt create mode 100644 Modèles/Modèle Event.txt create mode 100644 Modèles/Modèle Interface.txt create mode 100644 Modèles/Modèle Main.txt diff --git a/Modèles/Modèle Class.txt b/Modèles/Modèle Class.txt new file mode 100644 index 0000000..b4ab692 --- /dev/null +++ b/Modèles/Modèle Class.txt @@ -0,0 +1,23 @@ + +/** +* La classe Class +* +* @version +* @author +* Date : +* Licence : +*/ +public class Class { + //Attributs + + //Constructeur + public Class() { + + } + //Méthodes + + //Affichage + public String toString() { + return "" ; + } +} diff --git a/Modèles/Modèle Event.txt b/Modèles/Modèle Event.txt new file mode 100644 index 0000000..a460b85 --- /dev/null +++ b/Modèles/Modèle Event.txt @@ -0,0 +1,23 @@ +import javax.swing.*; +import java.awt.event.*; + +/** +* La classe Event +* +* @version +* @author +* Date : +* Licence : +*/ +public class Event implements ActionListener { + // Attributs + + // Constructeur de l'évennement + public Event() { + + } + // Action de l'évennement + public void actionPerformed(ActionEvent event){ + + } +} diff --git a/Modèles/Modèle Interface.txt b/Modèles/Modèle Interface.txt new file mode 100644 index 0000000..8b6e6d3 --- /dev/null +++ b/Modèles/Modèle Interface.txt @@ -0,0 +1,14 @@ + +/** +* L'interface Interface +* +* @version +* @author +* Date : +* Licence : +*/ +public interface Interface { + //Méthodes + public void Action() ; + +} diff --git a/Modèles/Modèle Main.txt b/Modèles/Modèle Main.txt new file mode 100644 index 0000000..e6573a9 --- /dev/null +++ b/Modèles/Modèle Main.txt @@ -0,0 +1,14 @@ + +/** +* La classe Main +* +* @version +* @author +* Date : +* Licence : +*/ +public class Main { + public static void main(String[] args){ + + } +} From 962d21d2a6dd2d6c84f1a4c643c2eb15fc7205c8 Mon Sep 17 00:00:00 2001 From: dick Date: Thu, 16 Oct 2025 10:57:32 +0200 Subject: [PATCH 2/5] Fix orthographe readme --- README.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 165a591..1ee337b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # BUT3 Projet Jeu Groupe -*Auteurs : AMARY Aurelien, DICK Adrien, FELIX-VIMALARATNAM Patrick, RABN Hugo* +*Auteurs : AMARY Aurelien, DICK Adrien, FELIX-VIMALARATNAM Patrick, RABAN Hugo* Date de création : 16/10/25 @@ -10,11 +10,12 @@ Dans un second temps, on fera des bots le plus efficace possible (probablement u Le jeu de notre groupe est **Avalam**. -## Présentation Avalam -Sur un plateau de jeu, les joueurs dispose de 24 pions chacun. Le but est de créer des petites tours avec son pions de couleur au dessus. Pour ce faire chaque joueur déplace son pion sur une tour ou déplace une tour sur un autre pion. La personne avec le plus de pions sur le dessus de chaque tour gagne. +## Présentation [Avalam](https://escaleajeux.fr/?principal=/jeu/avaxl?) + +Sur un plateau de jeu, les joueurs disposent de 24 pions chacun. Le but est de créer de petites tours avec son pion de couleur au-dessus. Pour ce faire, chaque joueur déplace son pion sur une tour ou déplace une tour sur un autre pion. La personne ayant le plus de pions sur le dessus des tours gagne. ### Régles officiel : -**Regle de base** \ +**Régle de base** \ Chaque joueur choisit sa couleur. Le but du jeu est de constituer un maximum de tours de 1 à 5 pions, jamais plus, surmontées par un pion de sa couleur. Un joueur est le propriétaire d'une tour lorsqu'un pion de sa couleur en occupe le sommet. Un pion isolé constitue également une tour. @@ -23,7 +24,7 @@ Un joueur est le propriétaire d'une tour lorsqu'un pion de sa couleur en occupe Chaque joueur en effectue un seul, dans n'importe quel sens (horizontal, vertical, diagonal) avec n'importe quel pion (ou pile de pions), quelle qu'en soit la couleur. Ce mouvement consiste à empiler le ou les pions déplacés sur un trou directement voisin déjà occupé par un ou plusieurs pions. **Mouvement interdit (1)** \ -On déplace obligatoirement toute la pile se trouvant sur un troue (elle peut évidemment n'être constituée que d'un seul pion). Autrement dit, une pile de pions ne peut qu'augmenter, jamais diminuer. +On déplace obligatoirement toute la pile se trouvant sur un trou (elle peut évidemment n'être constituée que d'un seul pion). Autrement dit, une pile de pions ne peut qu'augmenter, jamais diminuer. **Mouvement interdit (2)** \ On ne peut jamais poser de pions sur un trou inoccupé: il le reste donc définitivement. Un pion (ou une tour) isolé de tous les cotés ne pourra donc plus changer de propriétaire. @@ -31,4 +32,5 @@ On ne peut jamais poser de pions sur un trou inoccupé: il le reste donc défini **Fin de partie** \ Tans qu'un joueur peut effectuer un mouvement il a l'obligation de jouer, la partie ne s'achevant que lorque plus aucun déplacement n'est possible. On compte alors combien de pions de chaque couleur occupent le sommet des tours restantes, le vainqueur étant évidemment celui qui en totalise le plus. -Attention! Qu'une tour comporte 1,2,... ou 5 pions, elle vaut toujours UN point. \ No newline at end of file +Attention! Qu'une tour comporte 1,2,... ou 5 pions, elle vaut toujours UN point. + From dde0cf6ee25ed936b0a1b2922192f42da77aecbe Mon Sep 17 00:00:00 2001 From: amary Date: Thu, 16 Oct 2025 11:56:58 +0200 Subject: [PATCH 3/5] Classe Tower --- fr/iut_fbleau/Avalam/Color.java | 6 ++++ fr/iut_fbleau/Avalam/Tower.java | 41 ++++++++++++++++++++++++ fr/iut_fbleau/Avalam/temp | 0 fr/iut_fbleau/AvalamTests/TestTower.java | 28 ++++++++++++++++ 4 files changed, 75 insertions(+) create mode 100644 fr/iut_fbleau/Avalam/Color.java create mode 100644 fr/iut_fbleau/Avalam/Tower.java delete mode 100644 fr/iut_fbleau/Avalam/temp create mode 100644 fr/iut_fbleau/AvalamTests/TestTower.java diff --git a/fr/iut_fbleau/Avalam/Color.java b/fr/iut_fbleau/Avalam/Color.java new file mode 100644 index 0000000..5b91d92 --- /dev/null +++ b/fr/iut_fbleau/Avalam/Color.java @@ -0,0 +1,6 @@ +package fr.iut_fbleau.Avalam ; + +public enum Color{ + RED, + YELLOW +} \ No newline at end of file diff --git a/fr/iut_fbleau/Avalam/Tower.java b/fr/iut_fbleau/Avalam/Tower.java new file mode 100644 index 0000000..0c39254 --- /dev/null +++ b/fr/iut_fbleau/Avalam/Tower.java @@ -0,0 +1,41 @@ +package fr.iut_fbleau.Avalam ; + +/** +* La classe Tower stocke la couleur de son pion haut et la hauteur de la tour. +* +* @version 1.0 +* @author Aurélien +* Date : 16-10-25 ; 16-10-25 +* Licence : +*/ +public class Tower { + //Attributs + private Color color ; + private byte height = 1 ; + + //Constructeur + public Tower(Color color) { + this.color = color ; + } + //Méthodes + public Color getColor() { + return this.color ; + } + public byte getHeight() { + return this.height ; + } + + /** + * Méthode qui empile une autre tour sur l'objet sur lequel le méthode est appelée. + * Aucune vérification de hauteur n'est effectuée. + */ + public void mergeTower(Tower tower) { + this.color = tower.getColor(); + this.height += tower.getHeight(); + } + + //Affichage + public String toString() { + return "" ; + } +} diff --git a/fr/iut_fbleau/Avalam/temp b/fr/iut_fbleau/Avalam/temp deleted file mode 100644 index e69de29..0000000 diff --git a/fr/iut_fbleau/AvalamTests/TestTower.java b/fr/iut_fbleau/AvalamTests/TestTower.java new file mode 100644 index 0000000..710edf6 --- /dev/null +++ b/fr/iut_fbleau/AvalamTests/TestTower.java @@ -0,0 +1,28 @@ +package fr.iut_fbleau.AvalamTests ; + +import fr.iut_fbleau.Avalam.Tower ; +import fr.iut_fbleau.Avalam.Color ; + +/** +* La classe TestPion +* +* @version 1.0 +* @author Aurélien +* Date : 16-10-25 ; 16-10-25 +* Licence : +*/ +public class TestTower { + public static void main(String[] args){ + Tower t1 = new Tower(Color.RED); + Tower t2 = new Tower(Color.YELLOW); + + System.out.println("Vérification données :"); + System.out.println("RED = " + t1.getColor()); + System.out.println("1 = " + t1.getHeight()); + + System.out.println("\nVérification empilement :"); + t1.mergeTower(t2); + System.out.println("YELLOW = " + t1.getColor()); + System.out.println("2 = " + t1.getHeight()); + } +} \ No newline at end of file From 7bb6b79d532820d2077088cc2afe5e466a9f38d2 Mon Sep 17 00:00:00 2001 From: dick Date: Thu, 20 Nov 2025 13:25:09 -0500 Subject: [PATCH 4/5] Plateau graphique v1 --- Makefile | 41 ++++ fr/iut_fbleau/Avalam/AvalamPanel.java | 184 ++++++++++++++++++ fr/iut_fbleau/Avalam/AvalamWindow.java | 30 +++ fr/iut_fbleau/Avalam/Color.java | 37 +++- fr/iut_fbleau/Avalam/Main.java | 17 ++ fr/iut_fbleau/AvalamTests/TestTower.class | Bin 0 -> 1577 bytes fr/iut_fbleau/GameAPI/AbstractBoard.class | Bin 0 -> 2065 bytes fr/iut_fbleau/GameAPI/AbstractGame.class | Bin 0 -> 2148 bytes .../GameAPI/AbstractGamePlayer.class | Bin 0 -> 431 bytes fr/iut_fbleau/GameAPI/AbstractPly.class | Bin 0 -> 417 bytes fr/iut_fbleau/GameAPI/IBoard.class | Bin 0 -> 636 bytes fr/iut_fbleau/GameAPI/Player.class | Bin 0 -> 998 bytes fr/iut_fbleau/GameAPI/Result.class | Bin 0 -> 1042 bytes fr/iut_fbleau/Res/Plateau.txt | 9 + 14 files changed, 313 insertions(+), 5 deletions(-) create mode 100644 Makefile create mode 100644 fr/iut_fbleau/Avalam/AvalamPanel.java create mode 100644 fr/iut_fbleau/Avalam/AvalamWindow.java create mode 100644 fr/iut_fbleau/Avalam/Main.java create mode 100644 fr/iut_fbleau/AvalamTests/TestTower.class create mode 100644 fr/iut_fbleau/GameAPI/AbstractBoard.class create mode 100644 fr/iut_fbleau/GameAPI/AbstractGame.class create mode 100644 fr/iut_fbleau/GameAPI/AbstractGamePlayer.class create mode 100644 fr/iut_fbleau/GameAPI/AbstractPly.class create mode 100644 fr/iut_fbleau/GameAPI/IBoard.class create mode 100644 fr/iut_fbleau/GameAPI/Player.class create mode 100644 fr/iut_fbleau/GameAPI/Result.class create mode 100644 fr/iut_fbleau/Res/Plateau.txt 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 0000000000000000000000000000000000000000..a832969a069861bfc59a4d4962ff0ac22bc92163 GIT binary patch literal 1577 zcmX^0Z`VEs1_nolSS|)824;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00Sb_Nbc2C1|n{mjym__U;))WlMK$Fjtn#9aN5{PNTyP6jRpZgvJ99tK_p zK3poD^Kfg?S&1ng@@200B)e17F(&|uJH zXVBtd&}Ps<^%mG*Mh5n>#GKMp|1?GhHDr4sQEIJ;=@cOb1_nJI27LwtMh5ZR#Oze( z{JiAElJLxu4Cnm3;*!L?l43N&V4lD<4CE^#9tL9u6GjHk^wbiM)XemZ5^w@?5@KLv zFaud+4hj<|EKcEIuw-PA=0Xkk)ZBv1oYdUZyb@5zvol!pFxW8IGBR-GrWU2Af|DNZ z6atpE)(jJ3U}De{Vqj)4V`p$=WKhPI@Iq3HON#YDBv=K~zY38-wg722t&849Ytg)ORuHGBChJ40kb@!ni^f+ZbfEb+$2BA*;57 zNo#LoFx+92}QAUpVY82A|k7#Y|zGK)*{iz*oz z1bx6xD=o>)(RWELEKRlMWDsHyW@ixLVGsqmMFyXtj124nK8}&DL53h*;yerzAT3Za zBW?yM25EK%86E~%202Csel(jH88{MCQrt3&ic1(7L^U7|K?);l%`lJ&3Oo#o3`&d) z+(oIm`DLk4^&%RYm>Sp_R2Uf)u{#(RcmX+;AXC+N7}PZMk}=?6Fk~=d zWDtRPB_OBLttdYiZilLdCJ~mfGng4`bPC5a`ea77#p7K{uUe)$RoIh6{Tc?!@}p`(zOUy_lTm#&bU zn5U4Gs!*DjlAo8##bC-{1xnD?Xwem1Qk0pOZmk){&S1;PfFr?pLQ^egaAta5Vo7OH zDkFm#BnlCU&xQ#9+gUR*7~zTyXj(@%*IF}-k%7fIKP8osf!`-HFV(L!Hz~C!Brz!` zm60KwMAL|KCCEzN;F84TY~REJs7<2jsU<#%#Uug7s2>>_xH5}D zMT37CDEBjKXhtzIaHgl01f>?2=9Dlp;5GrG!kUqRJ+s&clq?t-h)ds5j0_x^C847o?iy{LD0}}%ygAD@{0~4skWnf@n0u_u5j0|>Q zwmkzc10w?~g98H-gChe2gE6Q$XJBC9*V@j&sHMG?fn7^yD+BLF1_lO31}6pv1|bF( z1_lNh1{MZc22KV!20jLPs8P-gETH0mfe~zw7uaG31{tj_4D6d21eY=JYHeZ=+seSc zoPkSg6NBJZ26m9COh~4xGjK6zFo-Z{Ge|S&Ft{)AL=~- literal 0 HcmV?d00001 diff --git a/fr/iut_fbleau/GameAPI/AbstractGame.class b/fr/iut_fbleau/GameAPI/AbstractGame.class new file mode 100644 index 0000000000000000000000000000000000000000..9c63903f185feb1d7de32a42c7c025003f6eaaa5 GIT binary patch literal 2148 zcmX^0Z`VEs1_nolL@ov<24;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00SP6iGJPId+^9tLg(9!3VGv?Be?(vtYJq@2{mQhoQt+*HQ^PkqOv;*z4o z^1x5xz3e;3!T^OLfjKsKn=LXb5vL zC^Bg9FlaJpF*5L^XO^W#=9d=v=9i^1GB|7C@Gw*>uJC|4E+D58949(F47v<@j126V z#XhO&i881OI{G8i#3u%_e(kVFs--N3}a+qan4UkWn|#@$;?aj zE6q(xEec6Y%1LEps3X}tDtZUxGUlSvJVplI;F84TY~REJu(Q}1{23V(38rgC2Cm@z z(xT*4w@i>%1d)SG50u0h83dg2^GiU5W`S>NNk)E3F$Y5kBZC?wKouAjGK&=w6_RrD z^HVAnk~2~hOY{^x6+n4cp|n7cpN%1miy@pLf}J4}ln|pB8B{>VLdx;Xyt4f4RDDPS zf}~Bi#N?9vqDn@F8OTWtsu1D;kHox`oYZ0!pZxsn(gJHpbb<2~#2{o56pbO31*yoA zQ037`CSb`+P$QfZb8><+OH!>F8F)PN@=}YOa}tY-Q;XRdVi_4!G5mzhsq75#j0|%4 zl`=B0LHxy{$iTtC#K6G7#J~iq(ZDQz1_1^}1~)Lsgk%5)LgMo>`lYxQ37*t&{ zFfj0IZD(NA(%#CzuBEe;fp;SV0|O(27Xt%>5CaPX1A__!3xg^HCxaRTAA>s7C~pQv z1|J4j21c+!I~kb4Dl@dUFtG1r5M*SS#Sp5sg@G5s7iVPH#vpxwLD2`oS7v1J)z;a@ zpza6a>+WRGW@4DhAOPj)Gchb@5ZTRO9I3s7!E_gcH3P$T2K)WX|1Sk8*va6;$glzI z9gqvv7&sXi7z`LdrK|#j5rY2Gc@?2Wm u85p&+w=%GA1gqv}U|`^5U}j)o5M*Fs5MtnD5N2Uy5MU4l%L;+b5e5L^=xGT6 literal 0 HcmV?d00001 diff --git a/fr/iut_fbleau/GameAPI/AbstractPly.class b/fr/iut_fbleau/GameAPI/AbstractPly.class new file mode 100644 index 0000000000000000000000000000000000000000..5a3a4d20f066e14f40c4519eb2abb9c8c4c97a13 GIT binary patch literal 417 zcmX^0Z`VEs1_nn45iSNM24;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00SP6iGJPId+^9tLg(9!3Vmv?Be?(vtYJq@2{mQhoQt+*HQ^PkqOv;*z4o zw!XmMUjDnfr){E zfsug;lsEGaEYWn{3%s>p^2 z+w80v8CX;D19B>fbzT@F1AA#6R133)W*8#_M{#0Ws&jrpCBE>0M2Hz{1EN$RGq37iJJ)U|?Wm5M>Z!U}O+y kU|^790GZ6dz@)VSEF;0dz`(}9$iTqh%fQGW2{u6r0MzTEOaK4? literal 0 HcmV?d00001 diff --git a/fr/iut_fbleau/GameAPI/Player.class b/fr/iut_fbleau/GameAPI/Player.class new file mode 100644 index 0000000000000000000000000000000000000000..c659c8b3dfd9f18f69828f989b5b73e4ea30458f GIT binary patch literal 998 zcmX^0Z`VEs1_nn4eRc*WMh2O*BK^$LlK8ZwoYcfpefPxNRL1~M{eYar%G4rG21W)J z9tKthHbw^a03XLl*C0bi200&mdaOa3ICvO1ku({B#JG7Fco=vY8Q4|A9DPDvgBcm* zqw$->#lX)Xz|O$S!yw2Y#K^#!oRgoI%E%z1q3M&ASeB@tlbDyT@1K;Fnp|Sd#UR2U z%FZCh!ywKe!N|aeP~e(Zn#;(*UY3|sn(Cj%$Y830q}w?svAEb8Ng%kSC^IkJ8rcSr z0bui`co?J^WEdIPY%=pQOY9gK#E^}G>h#nM<6vOrVqj#D;$Ywe(TY3_N({;%kAvM% z%*ddqp-I5&j0|ir#VpSGDXEMM{63j^seYxoNvTC4iAg!Bj0{FtY}dpeqKpgzzNsY{ z`6&U3MTxnoC8V!f*sUxKybP=iQVh%tObihB=rHJl H-K7TrLd?jw literal 0 HcmV?d00001 diff --git a/fr/iut_fbleau/GameAPI/Result.class b/fr/iut_fbleau/GameAPI/Result.class new file mode 100644 index 0000000000000000000000000000000000000000..4234ba934331213fdbeea51a1ec69d20b4ed21e5 GIT binary patch literal 1042 zcmX^0Z`VEs1_nn4V|E56Mh2O*BK^$LlK8ZwoYcfpefPxNRL1~M{h-w1(wq`b21W)J z9tKthHbw^Ka8Ex*200&m>a9T8waPOv zGcYqSFtBTB%WP+m*@$5eNFOH?1A_nq80#{C^y>+5f#MkITzv)>kZT#l+4eFpMlx?= zU=EIC*~Gve9Lc(gfh!o(EgTH`40=$_K~T+lyBQcGg%p^#GbnCmUpt6~P7vWAJuzn5(UT}zTF{m@JGcYkgoN2&d2zIU!0Nw7+@&Et; literal 0 HcmV?d00001 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 From 27bfff9aa1ec2ba6bca0bb8c402e3acb65104725 Mon Sep 17 00:00:00 2001 From: dick Date: Sat, 22 Nov 2025 11:56:51 -0500 Subject: [PATCH 5/5] Plateau graphique v2 *score,tourJoueur,tailleTour,selection* + maj makefile,readme --- Makefile | 37 ++-- README.md | 2 +- fr/iut_fbleau/Avalam/AvalamPanel.java | 184 ------------------ fr/iut_fbleau/Avalam/AvalamWindow.java | 36 ++-- fr/iut_fbleau/Avalam/Color.java | 21 +- fr/iut_fbleau/Avalam/Main.java | 10 - fr/iut_fbleau/Avalam/Tower.java | 6 +- fr/iut_fbleau/Avalam/logic/BoardLoader.java | 60 ++++++ fr/iut_fbleau/Avalam/logic/GameState.java | 70 +++++++ fr/iut_fbleau/Avalam/logic/ScoreManager.java | 37 ++++ fr/iut_fbleau/Avalam/logic/TurnManager.java | 35 ++++ fr/iut_fbleau/Avalam/ui/BoardView.java | 84 ++++++++ fr/iut_fbleau/Avalam/ui/HighlightLayer.java | 74 +++++++ .../Avalam/ui/InteractionController.java | 116 +++++++++++ fr/iut_fbleau/Avalam/ui/PieceButton.java | 90 +++++++++ fr/iut_fbleau/Avalam/ui/PieceLayer.java | 77 ++++++++ fr/iut_fbleau/Avalam/ui/ScoreView.java | 46 +++++ fr/iut_fbleau/Avalam/ui/TurnView.java | 41 ++++ fr/iut_fbleau/AvalamTests/TestTower.class | Bin 1577 -> 0 bytes fr/iut_fbleau/AvalamTests/TestTower.java | 28 --- 20 files changed, 784 insertions(+), 270 deletions(-) delete mode 100644 fr/iut_fbleau/Avalam/AvalamPanel.java create mode 100644 fr/iut_fbleau/Avalam/logic/BoardLoader.java create mode 100644 fr/iut_fbleau/Avalam/logic/GameState.java create mode 100644 fr/iut_fbleau/Avalam/logic/ScoreManager.java create mode 100644 fr/iut_fbleau/Avalam/logic/TurnManager.java create mode 100644 fr/iut_fbleau/Avalam/ui/BoardView.java create mode 100644 fr/iut_fbleau/Avalam/ui/HighlightLayer.java create mode 100644 fr/iut_fbleau/Avalam/ui/InteractionController.java create mode 100644 fr/iut_fbleau/Avalam/ui/PieceButton.java create mode 100644 fr/iut_fbleau/Avalam/ui/PieceLayer.java create mode 100644 fr/iut_fbleau/Avalam/ui/ScoreView.java create mode 100644 fr/iut_fbleau/Avalam/ui/TurnView.java delete mode 100644 fr/iut_fbleau/AvalamTests/TestTower.class delete mode 100644 fr/iut_fbleau/AvalamTests/TestTower.java diff --git a/Makefile b/Makefile index eb07785..3ed12b8 100644 --- a/Makefile +++ b/Makefile @@ -1,41 +1,40 @@ -# Répertoires -SRC_DIR = . +# === Répertoires === +SRC_DIR = fr BIN_DIR = bin -# Trouve tous les fichiers .java +# === Recherche automatique des fichiers .java dans tous les sous-dossiers === SOURCES := $(shell find $(SRC_DIR) -name "*.java") -# Classe principale -MAIN = fr.iut_fbleau.Avalam.Main +# === Classe principale === +MAIN_CLASS = fr.iut_fbleau.Avalam.Main -# Options javac +# === Commandes Java === JC = javac JCFLAGS = -d $(BIN_DIR) -# Options java JAVA = java JAVAFLAGS = -cp $(BIN_DIR) -# Règle par défaut +# === Règle par défaut === all: build -# Compilation +# === Compilation === build: - @echo "Compilation du projet..." + @echo "===> Compilation du projet Avalam..." @mkdir -p $(BIN_DIR) @$(JC) $(JCFLAGS) $(SOURCES) - @echo "✔ Compilation terminée !" + @echo "✔ Compilation terminée." -# Exécution +# === Exécution === run: - @echo "Lancement du jeu Avalam..." - @$(JAVA) $(JAVAFLAGS) $(MAIN) + @echo "===> Lancement du jeu Avalam..." + @$(JAVA) $(JAVAFLAGS) $(MAIN_CLASS) -# Nettoyage des .class +# === Nettoyage === clean: - @echo "Suppression des fichiers compilés..." + @echo "===> Suppression des fichiers compilés..." @rm -rf $(BIN_DIR) - @echo "✔ Nettoyage terminé !" + @echo "✔ Nettoyage complet." -# Recompile + run -re: clean all run +# === Recompile + run === +re: clean build run diff --git a/README.md b/README.md index 1ee337b..3f2fc48 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Le but du jeu est de constituer un maximum de tours de 1 à 5 pions, jamais plus Un joueur est le propriétaire d'une tour lorsqu'un pion de sa couleur en occupe le sommet. Un pion isolé constitue également une tour. **Deplacements** \ -Chaque joueur en effectue un seul, dans n'importe quel sens (horizontal, vertical, diagonal) avec n'importe quel pion (ou pile de pions), quelle qu'en soit la couleur. Ce mouvement consiste à empiler le ou les pions déplacés sur un trou directement voisin déjà occupé par un ou plusieurs pions. +Chaque joueur en effectue un seul mouvement, dans n'importe quel sens (horizontal, vertical, diagonal) avec n'importe quel pion (ou pile de pions), quelle qu'en soit la couleur. Ce mouvement consiste à empiler le ou les pions déplacés sur un trou directement voisin déjà occupé par un ou plusieurs pions. **Mouvement interdit (1)** \ On déplace obligatoirement toute la pile se trouvant sur un trou (elle peut évidemment n'être constituée que d'un seul pion). Autrement dit, une pile de pions ne peut qu'augmenter, jamais diminuer. diff --git a/fr/iut_fbleau/Avalam/AvalamPanel.java b/fr/iut_fbleau/Avalam/AvalamPanel.java deleted file mode 100644 index 17a9408..0000000 --- a/fr/iut_fbleau/Avalam/AvalamPanel.java +++ /dev/null @@ -1,184 +0,0 @@ -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 index 7d7038a..1b8a46f 100644 --- a/fr/iut_fbleau/Avalam/AvalamWindow.java +++ b/fr/iut_fbleau/Avalam/AvalamWindow.java @@ -1,29 +1,41 @@ package fr.iut_fbleau.Avalam; +import fr.iut_fbleau.Avalam.logic.*; +import fr.iut_fbleau.Avalam.ui.*; + import javax.swing.*; +import java.awt.*; /** - * 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 + * Fenêtre principale du jeu Avalam. */ public class AvalamWindow extends JFrame { - /** - * Constructeur : initialise la fenêtre du jeu. - */ public AvalamWindow() { super("Avalam - Plateau Graphique"); - setSize(750, 750); + setSize(750, 800); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - // Ajout du panneau contenant le plateau - add(new AvalamPanel()); + Tower[][] grid = BoardLoader.loadFromFile("fr/iut_fbleau/Res/Plateau.txt"); + GameState gs = new GameState(grid); + ScoreManager sm = new ScoreManager(); + + int y = sm.count(Color.COLOR1, grid); + int r = sm.count(Color.COLOR2, grid); + + ScoreView scoreView = new ScoreView(y, r); + TurnView turnView = new TurnView("Tour du joueur : Jaune"); + + BoardView boardView = new BoardView(gs); + + JPanel top = new JPanel(new GridLayout(2,1)); + top.add(scoreView); + top.add(turnView); + + add(top, BorderLayout.NORTH); + add(boardView, BorderLayout.CENTER); setVisible(true); } diff --git a/fr/iut_fbleau/Avalam/Color.java b/fr/iut_fbleau/Avalam/Color.java index cf75509..1d3414a 100644 --- a/fr/iut_fbleau/Avalam/Color.java +++ b/fr/iut_fbleau/Avalam/Color.java @@ -3,30 +3,25 @@ package fr.iut_fbleau.Avalam; /** * 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. + * COLOR1 : couleur du Joueur Jaune + * COLOR2 : couleur du Joueur Rouge * - * @version 2.0 + * Les couleurs Swing associées peuvent être modifiées ici pour changer tout le jeu. + * + * @version 3.0 */ public enum Color { - RED(java.awt.Color.RED), - YELLOW(java.awt.Color.YELLOW); + COLOR1(java.awt.Color.YELLOW), // Joueur Jaune + COLOR2(java.awt.Color.RED); // Joueur Rouge - /** Couleur Swing associée à la couleur Avalam. */ + /** Couleur Swing associée */ 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 index ef3497d..822dfdd 100644 --- a/fr/iut_fbleau/Avalam/Main.java +++ b/fr/iut_fbleau/Avalam/Main.java @@ -1,15 +1,5 @@ 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/Avalam/Tower.java b/fr/iut_fbleau/Avalam/Tower.java index 0c39254..bfecdd7 100644 --- a/fr/iut_fbleau/Avalam/Tower.java +++ b/fr/iut_fbleau/Avalam/Tower.java @@ -5,8 +5,6 @@ package fr.iut_fbleau.Avalam ; * * @version 1.0 * @author Aurélien -* Date : 16-10-25 ; 16-10-25 -* Licence : */ public class Tower { //Attributs @@ -17,10 +15,12 @@ public class Tower { public Tower(Color color) { this.color = color ; } + //Méthodes public Color getColor() { return this.color ; } + public byte getHeight() { return this.height ; } @@ -34,7 +34,7 @@ public class Tower { this.height += tower.getHeight(); } - //Affichage + @Override public String toString() { return "" ; } diff --git a/fr/iut_fbleau/Avalam/logic/BoardLoader.java b/fr/iut_fbleau/Avalam/logic/BoardLoader.java new file mode 100644 index 0000000..55000c7 --- /dev/null +++ b/fr/iut_fbleau/Avalam/logic/BoardLoader.java @@ -0,0 +1,60 @@ +package fr.iut_fbleau.Avalam.logic; + +import fr.iut_fbleau.Avalam.Color; +import fr.iut_fbleau.Avalam.Tower; +import java.io.*; + +/** + * La classe BoardLoader est responsable du chargement d'un plateau Avalam + * depuis un fichier texte externe (généralement Plateau.txt). + * + * Le fichier doit contenir une matrice 9×9 de valeurs numériques séparées par des virgules : + * - 0 : case vide (trou) + * - 1 : pion appartenant au joueur COLOR1 (Jaune) + * - 2 : pion appartenant au joueur COLOR2 (Rouge) + * + * Aucun contrôle de cohérence avancé n'est effectué, le chargeur se contente + * d’interpréter les valeurs comme demandé. + * + * @author + * @version 1.0 + */ +public class BoardLoader { + + /** + * Charge un plateau Avalam depuis un fichier. + * + * @param path chemin du fichier plateau. + * @return un tableau 9×9 contenant des objets Tower ou null. + */ + public static Tower[][] loadFromFile(String path) { + + Tower[][] grid = new Tower[9][9]; + + try (BufferedReader br = new BufferedReader(new FileReader(new File(path)))) { + + String line; + int row = 0; + + while ((line = br.readLine()) != null && row < 9) { + + String[] parts = line.split(","); + + for (int col = 0; col < 9; col++) { + int v = Integer.parseInt(parts[col]); + + // Interprétation des valeurs + if (v == 1) grid[row][col] = new Tower(Color.COLOR1); + else if (v == 2) grid[row][col] = new Tower(Color.COLOR2); + else grid[row][col] = null; // Case vide + } + row++; + } + + } catch (Exception e) { + e.printStackTrace(); + } + + return grid; + } +} diff --git a/fr/iut_fbleau/Avalam/logic/GameState.java b/fr/iut_fbleau/Avalam/logic/GameState.java new file mode 100644 index 0000000..e595dcc --- /dev/null +++ b/fr/iut_fbleau/Avalam/logic/GameState.java @@ -0,0 +1,70 @@ +package fr.iut_fbleau.Avalam.logic; + +import fr.iut_fbleau.Avalam.Color; +import fr.iut_fbleau.Avalam.Tower; + +/** + * La classe GameState représente l'état courant du jeu Avalam : + * - la grille 9×9 + * - le joueur dont c'est le tour + * + * Elle ne contient aucune logique de déplacement ni de vérification des règles ; + * son rôle est uniquement de stocker et de fournir l'état du jeu. + * + * @author + * @version 1.0 + */ +public class GameState { + + /** Grille du plateau : 9×9 tours ou cases vides. */ + private Tower[][] grid; + + /** Joueur dont c’est le tour (COLOR1 ou COLOR2). */ + private Color currentPlayer = Color.COLOR1; + + /** + * Constructeur. + * + * @param grid la grille initiale du plateau. + */ + public GameState(Tower[][] grid) { + this.grid = grid; + } + + /** + * Retourne la tour présente à la position (r,c), ou null. + */ + public Tower get(int r, int c) { + return grid[r][c]; + } + + /** + * Retourne la grille complète. + */ + public Tower[][] getGrid() { + return grid; + } + + /** + * Retourne le joueur dont c'est le tour. + */ + public Color getCurrentPlayer() { + return currentPlayer; + } + + /** + * Change le joueur courant : COLOR1 → COLOR2 → COLOR1. + */ + public void switchPlayer() { + currentPlayer = (currentPlayer == Color.COLOR1) ? Color.COLOR2 : Color.COLOR1; + } + + /** + * Vérifie si une position (r,c) est dans les limites du plateau. + * + * @return vrai si la position est comprise dans un plateau 9×9. + */ + public boolean isInside(int r, int c) { + return r >= 0 && r < 9 && c >= 0 && c < 9; + } +} diff --git a/fr/iut_fbleau/Avalam/logic/ScoreManager.java b/fr/iut_fbleau/Avalam/logic/ScoreManager.java new file mode 100644 index 0000000..72955ab --- /dev/null +++ b/fr/iut_fbleau/Avalam/logic/ScoreManager.java @@ -0,0 +1,37 @@ +package fr.iut_fbleau.Avalam.logic; + +import fr.iut_fbleau.Avalam.Color; +import fr.iut_fbleau.Avalam.Tower; + +/** + * La classe ScoreManager gère le calcul des scores + * selon les règles officielles d’Avalam : + * + * Un joueur gagne 1 point par tour dont le sommet (couleur) lui appartient, + * indépendamment de la hauteur de la tour. + * + * Cette classe n’a aucune responsabilité autre que compter. + * + * @author + * @version 1.0 + */ +public class ScoreManager { + + /** + * Compte le nombre de tours dont le sommet appartient à la couleur donnée. + * + * @param c couleur du joueur (COLOR1 ou COLOR2) + * @param grid grille 9×9 contenant des tours ou null + * @return score du joueur + */ + public static int count(Color c, Tower[][] grid) { + int score = 0; + + for (int i = 0; i < 9; i++) + for (int j = 0; j < 9; j++) + if (grid[i][j] != null && grid[i][j].getColor() == c) + score++; + + return score; + } +} diff --git a/fr/iut_fbleau/Avalam/logic/TurnManager.java b/fr/iut_fbleau/Avalam/logic/TurnManager.java new file mode 100644 index 0000000..5f37453 --- /dev/null +++ b/fr/iut_fbleau/Avalam/logic/TurnManager.java @@ -0,0 +1,35 @@ +package fr.iut_fbleau.Avalam.logic; + +import fr.iut_fbleau.Avalam.Color; + +/** + * La classe TurnManager gère le déroulement des tours d’Avalam. + * + * Son rôle est simple : + * - identifier le joueur dont c’est le tour + * - passer au joueur suivant + * + * Elle ne contient pas de logique de mouvement, ni de validation. + * + * @author + * @version 1.0 + */ +public class TurnManager { + + /** Joueur dont c'est le tour (COLOR1 commence la partie). */ + private Color current = Color.COLOR1; + + /** + * Retourne le joueur actuel. + */ + public Color getPlayer() { + return current; + } + + /** + * Passe au joueur suivant. + */ + public void next() { + current = (current == Color.COLOR1) ? Color.COLOR2 : Color.COLOR1; + } +} diff --git a/fr/iut_fbleau/Avalam/ui/BoardView.java b/fr/iut_fbleau/Avalam/ui/BoardView.java new file mode 100644 index 0000000..b5d5e9c --- /dev/null +++ b/fr/iut_fbleau/Avalam/ui/BoardView.java @@ -0,0 +1,84 @@ +package fr.iut_fbleau.Avalam.ui; + +import fr.iut_fbleau.Avalam.logic.GameState; + +import javax.swing.*; + +/** + * La classe BoardView représente l'affichage complet du plateau Avalam. + * Elle s’appuie sur une architecture en couches (layered pane) pour séparer proprement : + * + *
    + *
  • HighlightLayer : les cases jouables mises en surbrillance
  • + *
  • PieceLayer : les pions affichés sous forme de boutons ronds
  • + *
+ * + * La vue ne contient pas la logique de jeu : elle la délègue entièrement + * à un InteractionController. + * + * @author + * @version 1.0 + */ +public class BoardView extends JLayeredPane { + + /** Taille des pions affichés. */ + private final int size = 50; + + /** Distance entre deux cases de la grille. */ + private final int spacing = 70; + + /** Décalages pour centrer l'affichage. */ + private final int xBase = 60, yBase = 60; + + /** Accès à l'état du jeu. */ + private GameState state; + + /** Couche d'affichage des ronds verts. */ + private HighlightLayer highlightLayer; + + /** Couche d'affichage des pions. */ + private PieceLayer pieceLayer; + + /** Gestionnaire d'interactions utilisateur. */ + private InteractionController controller; + + /** + * Constructeur de la vue du plateau. + * + * @param state l'état du jeu Avalam + */ + public BoardView(GameState state) { + this.state = state; + setLayout(null); + + controller = new InteractionController(state); + + highlightLayer = new HighlightLayer(xBase, yBase, spacing, size); + pieceLayer = new PieceLayer(); + + add(highlightLayer, JLayeredPane.DEFAULT_LAYER); + add(pieceLayer, JLayeredPane.PALETTE_LAYER); + + refresh(); + } + + /** + * Met à jour l'affichage des couches en fonction de l'état actuel du jeu. + */ + public void refresh() { + + pieceLayer.displayGrid( + state.getGrid(), + xBase, yBase, spacing, size, + + // Callback appelé lorsqu’un pion est cliqué + (r, c) -> { + controller.onPieceClicked(r, c); + highlightLayer.setLegalMoves(controller.getLegalMoves()); + highlightLayer.repaint(); + } + ); + + highlightLayer.repaint(); + } +} diff --git a/fr/iut_fbleau/Avalam/ui/HighlightLayer.java b/fr/iut_fbleau/Avalam/ui/HighlightLayer.java new file mode 100644 index 0000000..81513bd --- /dev/null +++ b/fr/iut_fbleau/Avalam/ui/HighlightLayer.java @@ -0,0 +1,74 @@ +package fr.iut_fbleau.Avalam.ui; + +import javax.swing.*; +import java.awt.*; +import java.util.List; + +/** + * La classe HighlightLayer est responsable de l'affichage des + * cases de déplacement autorisées sous forme de cercles verts. + * + * Elle n'interagit pas directement avec les pièces, mais se contente + * de dessiner en arrière-plan selon une liste de positions légales. + * + * @author + * @version 1.0 + */ +public class HighlightLayer extends JPanel { + + private int xBase, yBase, spacing, size; + + /** Liste des positions jouables (cases en vert). */ + private List legalMoves; + + /** + * Constructeur. + * + * @param xBase position X de base du plateau + * @param yBase position Y de base du plateau + * @param spacing espacement entre cases + * @param size taille des pions + */ + public HighlightLayer(int xBase, int yBase, int spacing, int size) { + this.xBase = xBase; + this.yBase = yBase; + this.spacing = spacing; + this.size = size; + + setOpaque(false); + setBounds(0, 0, 800, 800); + } + + /** + * Définit la liste des cases légales à afficher. + */ + public void setLegalMoves(List moves) { + this.legalMoves = moves; + repaint(); + } + + /** + * Dessine les cercles verts autour des cases autorisées. + */ + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + + if (legalMoves == null) return; + + Graphics2D g2 = (Graphics2D) g; + g2.setColor(new Color(0, 255, 0, 120)); + + for (Point p : legalMoves) { + + int r = p.x; + int c = p.y; + + int x = xBase + c * spacing; + int y = yBase + r * spacing; + + int highlight = size + 20; // Cercle plus grand que le pion + g2.fillOval(x - 10, y - 10, highlight, highlight); + } + } +} diff --git a/fr/iut_fbleau/Avalam/ui/InteractionController.java b/fr/iut_fbleau/Avalam/ui/InteractionController.java new file mode 100644 index 0000000..f532679 --- /dev/null +++ b/fr/iut_fbleau/Avalam/ui/InteractionController.java @@ -0,0 +1,116 @@ +package fr.iut_fbleau.Avalam.ui; + +import fr.iut_fbleau.Avalam.Tower; +import fr.iut_fbleau.Avalam.logic.GameState; + +import java.awt.*; +import java.util.ArrayList; +import java.util.List; + +/** + * La classe InteractionController gère entièrement + * la logique d'interaction de l'utilisateur : + * + *
    + *
  • Sélection d'un pion
  • + *
  • Annulation de la sélection
  • + *
  • Calcul des cases de déplacement légales
  • + *
+ * + * Aucun affichage n'est réalisé ici ; la vue (BoardView) récupère + * simplement les données calculées pour les afficher. + * + * @author + * @version 1.0 + */ +public class InteractionController { + + private GameState state; + + /** Position du pion sélectionné (ou -1 s'il n'y en a pas). */ + private int selectedRow = -1, selectedCol = -1; + + /** Liste des déplacements possibles depuis la sélection. */ + private List legalMoves = new ArrayList<>(); + + /** + * Constructeur. + * + * @param state état du jeu à manipuler + */ + public InteractionController(GameState state) { + this.state = state; + } + + /** + * Retourne les cases jouables calculées. + */ + public List getLegalMoves() { + return legalMoves; + } + + /** + * Gère le clic sur un pion donné. + * + * @param r ligne de la case cliquée + * @param c colonne de la case cliquée + */ + public void onPieceClicked(int r, int c) { + + Tower t = state.get(r, c); + if (t == null) return; + + // Annulation si on reclique la sélection + if (r == selectedRow && c == selectedCol) { + selectedRow = -1; + selectedCol = -1; + legalMoves.clear(); + return; + } + + // Interdiction de jouer le pion adverse + if (t.getColor() != state.getCurrentPlayer()) { + selectedRow = -1; + selectedCol = -1; + legalMoves.clear(); + return; + } + + selectedRow = r; + selectedCol = c; + + computeLegalMoves(); + } + + /** + * Calcule toutes les cases accessibles à partir du pion sélectionné. + */ + private void computeLegalMoves() { + + legalMoves.clear(); + + Tower[][] grid = state.getGrid(); + Tower src = grid[selectedRow][selectedCol]; + int h = src.getHeight(); + + int[] d = {-1, 0, 1}; + + for (int dr : d) { + for (int dc : d) { + + if (dr == 0 && dc == 0) continue; + + int nr = selectedRow + dr; + int nc = selectedCol + dc; + + if (!state.isInside(nr, nc)) continue; + + Tower dest = grid[nr][nc]; + if (dest == null) continue; + if (h + dest.getHeight() > 5) continue; + + legalMoves.add(new Point(nr, nc)); + } + } + } +} diff --git a/fr/iut_fbleau/Avalam/ui/PieceButton.java b/fr/iut_fbleau/Avalam/ui/PieceButton.java new file mode 100644 index 0000000..c0ef110 --- /dev/null +++ b/fr/iut_fbleau/Avalam/ui/PieceButton.java @@ -0,0 +1,90 @@ +package fr.iut_fbleau.Avalam.ui; + +import javax.swing.*; +import java.awt.*; + +/** + * La classe PieceButton représente graphiquement une tour Avalam. + * Il s'agit d'un bouton rond : + * + *
    + *
  • coloré selon le joueur
  • + *
  • affichant sa hauteur
  • + *
  • avec un effet de survol visuel
  • + *
+ * + * Ce composant sert d'interaction principale pour cliquer les pions. + * + * @author + * @version 1.0 + */ +public class PieceButton extends JButton { + + private Color color; + private int height; + private boolean hover = false; + + /** Position de la tour sur la grille. */ + public final int row, col; + + /** + * Constructeur. + * + * @param c couleur graphique du pion + * @param height hauteur de la tour + * @param row ligne du pion + * @param col colonne du pion + */ + public PieceButton(java.awt.Color c, int height, int row, int col) { + this.color = c; + this.height = height; + this.row = row; + this.col = col; + + setBorderPainted(false); + setContentAreaFilled(false); + setFocusPainted(false); + setOpaque(false); + + addMouseListener(new java.awt.event.MouseAdapter() { + @Override public void mouseEntered(java.awt.event.MouseEvent e) { hover = true; repaint(); } + @Override public void mouseExited (java.awt.event.MouseEvent e) { hover = false; repaint(); } + }); + } + + /** + * Dessine le pion rond ainsi que son chiffre au centre. + */ + @Override + protected void paintComponent(Graphics g) { + Graphics2D g2 = (Graphics2D) g.create(); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + // Couleur foncée lorsque survolé + g2.setColor(hover ? color.darker() : color); + g2.fillOval(0, 0, getWidth(), getHeight()); + + // Hauteur affichée au centre + g2.setColor(java.awt.Color.BLACK); + g2.setFont(new Font("Arial", Font.BOLD, 18)); + + String txt = String.valueOf(height); + FontMetrics fm = g2.getFontMetrics(); + + int x = (getWidth() - fm.stringWidth(txt)) / 2; + int y = (getHeight() + fm.getAscent()) / 2 - 3; + + g2.drawString(txt, x, y); + g2.dispose(); + } + + /** + * Rend le bouton réellement rond (zone cliquable circulaire). + */ + @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); + } +} diff --git a/fr/iut_fbleau/Avalam/ui/PieceLayer.java b/fr/iut_fbleau/Avalam/ui/PieceLayer.java new file mode 100644 index 0000000..0c69076 --- /dev/null +++ b/fr/iut_fbleau/Avalam/ui/PieceLayer.java @@ -0,0 +1,77 @@ +package fr.iut_fbleau.Avalam.ui; + +import fr.iut_fbleau.Avalam.Tower; + +import javax.swing.*; +import java.awt.*; + +/** + * La classe PieceLayer gère l'affichage des pions + * (sous forme de PieceButton) sur la grille. + * + * Elle s'occupe uniquement : + *
    + *
  • d'afficher les pièces
  • + *
  • de positionner correctement les boutons
  • + *
  • d'attacher un callback à chaque clic
  • + *
+ * + * Aucune logique de jeu n'est réalisée ici. + * + * @author + * @version 1.0 + */ +public class PieceLayer extends JPanel { + + /** + * Constructeur. + * Initialise un panneau transparent prêt à recevoir des pions. + */ + public PieceLayer() { + setLayout(null); + setOpaque(false); + setBounds(0, 0, 800, 800); + } + + /** + * Affiche la grille de tours sous forme de boutons. + * + * @param grid grille 9×9 des tours + * @param xBase offset X du plateau + * @param yBase offset Y du plateau + * @param spacing espacement entre cases + * @param size taille d'un pion + * @param clickCallback fonction appelée lors d’un clic sur un pion + */ + public void displayGrid(Tower[][] grid, int xBase, int yBase, + int spacing, int size, + java.util.function.BiConsumer clickCallback) { + + removeAll(); + + for (int r = 0; r < 9; r++) { + for (int c = 0; c < 9; c++) { + + Tower t = grid[r][c]; + if (t != null) { + + PieceButton pb = new PieceButton( + t.getColor().getSwingColor(), + t.getHeight(), + r, c + ); + + pb.setBounds(xBase + c * spacing, yBase + r * spacing, size, size); + + int fr = r, fc = c; + pb.addActionListener(e -> clickCallback.accept(fr, fc)); + + add(pb); + } + } + } + + revalidate(); + repaint(); + } +} diff --git a/fr/iut_fbleau/Avalam/ui/ScoreView.java b/fr/iut_fbleau/Avalam/ui/ScoreView.java new file mode 100644 index 0000000..494d33f --- /dev/null +++ b/fr/iut_fbleau/Avalam/ui/ScoreView.java @@ -0,0 +1,46 @@ +package fr.iut_fbleau.Avalam.ui; + +import javax.swing.*; +import java.awt.*; + +/** + * La classe ScoreView affiche les scores actuels des deux joueurs. + * + * Elle est purement graphique : aucune logique de calcul n'est présente. + * + * @author + * @version 1.0 + */ +public class ScoreView extends JPanel { + + private JLabel scoreY, scoreR; + + /** + * Constructeur. + * + * @param y score initial du joueur jaune + * @param r score initial du joueur rouge + */ + public ScoreView(int y, int r) { + setBackground(new Color(200,200,200)); + setLayout(new FlowLayout()); + + scoreY = new JLabel("Score Jaune : " + y); + scoreR = new JLabel("Score Rouge : " + r); + + scoreY.setFont(new Font("Arial", Font.BOLD, 18)); + scoreR.setFont(new Font("Arial", Font.BOLD, 18)); + + add(scoreY); + add(new JLabel(" | ")); + add(scoreR); + } + + /** + * Met à jour l'affichage des scores. + */ + public void updateScores(int y, int r) { + scoreY.setText("Score Jaune : " + y); + scoreR.setText("Score Rouge : " + r); + } +} diff --git a/fr/iut_fbleau/Avalam/ui/TurnView.java b/fr/iut_fbleau/Avalam/ui/TurnView.java new file mode 100644 index 0000000..5b28c90 --- /dev/null +++ b/fr/iut_fbleau/Avalam/ui/TurnView.java @@ -0,0 +1,41 @@ +package fr.iut_fbleau.Avalam.ui; + +import javax.swing.*; +import java.awt.*; + +/** + * La classe TurnView affiche le joueur à qui c'est le tour. + * + * Elle agit comme une simple bannière d’information, + * mise à jour par la logique du jeu. + * + * @author + * @version 1.0 + */ +public class TurnView extends JPanel { + + private JLabel text; + + /** + * Constructeur. + * + * @param initial message initial à afficher + */ + public TurnView(String initial) { + setBackground(new Color(220,220,220)); + + text = new JLabel(initial); + text.setFont(new Font("Arial", Font.BOLD, 20)); + + add(text); + } + + /** + * Met à jour le texte affichant le joueur courant. + * + * @param s message à afficher + */ + public void setTurn(String s) { + text.setText(s); + } +} diff --git a/fr/iut_fbleau/AvalamTests/TestTower.class b/fr/iut_fbleau/AvalamTests/TestTower.class deleted file mode 100644 index a832969a069861bfc59a4d4962ff0ac22bc92163..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1577 zcmX^0Z`VEs1_nolSS|)824;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00Sb_Nbc2C1|n{mjym__U;))WlMK$Fjtn#9aN5{PNTyP6jRpZgvJ99tK_p zK3poD^Kfg?S&1ng@@200B)e17F(&|uJH zXVBtd&}Ps<^%mG*Mh5n>#GKMp|1?GhHDr4sQEIJ;=@cOb1_nJI27LwtMh5ZR#Oze( z{JiAElJLxu4Cnm3;*!L?l43N&V4lD<4CE^#9tL9u6GjHk^wbiM)XemZ5^w@?5@KLv zFaud+4hj<|EKcEIuw-PA=0Xkk)ZBv1oYdUZyb@5zvol!pFxW8IGBR-GrWU2Af|DNZ z6atpE)(jJ3U}De{Vqj)4V`p$=WKhPI@Iq3HON#YDBv=K~zY38-wg722t&849Ytg)ORuHGBChJ40kb@!ni^f+ZbfEb+$2BA*;57 zNo#LoFxTestPion -* -* @version 1.0 -* @author Aurélien -* Date : 16-10-25 ; 16-10-25 -* Licence : -*/ -public class TestTower { - public static void main(String[] args){ - Tower t1 = new Tower(Color.RED); - Tower t2 = new Tower(Color.YELLOW); - - System.out.println("Vérification données :"); - System.out.println("RED = " + t1.getColor()); - System.out.println("1 = " + t1.getHeight()); - - System.out.println("\nVérification empilement :"); - t1.mergeTower(t2); - System.out.println("YELLOW = " + t1.getColor()); - System.out.println("2 = " + t1.getHeight()); - } -} \ No newline at end of file