Plateau graphique v1

This commit was merged in pull request #10.
This commit is contained in:
2025-11-20 13:25:09 -05:00
parent 8cefae7da6
commit 7bb6b79d53
14 changed files with 313 additions and 5 deletions

41
Makefile Normal file
View File

@@ -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

View File

@@ -0,0 +1,184 @@
package fr.iut_fbleau.Avalam;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
/**
* La classe <code>AvalamPanel</code> 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 dun 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;
}
}

View File

@@ -0,0 +1,30 @@
package fr.iut_fbleau.Avalam;
import javax.swing.*;
/**
* La classe <code>AvalamWindow</code> 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 <code>AvalamPanel</code> 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);
}
}

View File

@@ -1,6 +1,33 @@
package fr.iut_fbleau.Avalam ; package fr.iut_fbleau.Avalam;
public enum Color{ /**
RED, * L'énumération <code>Color</code> représente la couleur du sommet d'une tour Avalam.
YELLOW *
* 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;
}
} }

View File

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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -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