MISE A JOUR

This commit is contained in:
HP_pellel
2025-09-07 14:44:32 +02:00
parent 117a58acbc
commit 564aceb193
22 changed files with 507 additions and 123 deletions
+201 -30
View File
@@ -1,58 +1,208 @@
package vue;
import modele.piece.Piece;
import java.awt.*;
import java.lang.ref.Reference;
import modele.Case;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;
public class CaseSwingUI extends JPanel {
private int ligne;
private int colonne;
private Color couleurdeFond;
import modele.Case;
import modele.piece.Piece;
import modele.Couleur;
public class CaseSwingUI extends JPanel implements MouseListener{
private Color couleurCaseClaire;
private Color couleurCaseFoncee;
private Color couleurCaseSelection;
private Color couleurCasePrecedente;
private final int ligne;
private final int colonne;
private boolean estDernierCoupOrigine = false;
private boolean estDernierCoupDestination = false;
private boolean selectionnee = false;
private final JLabel label = new JLabel("", SwingConstants.CENTER);
private final Case caseModele; // reference vers la case de le modele
public CaseSwingUI(Color couleurdeFond, int ligne, int colonne, Case caseModele) {
this.couleurdeFond = couleurdeFond;
public CaseSwingUI(String style, int ligne, int colonne, Case caseModele) {
switch (style) {
case "RETRO_BOIS" -> {
// Style Bois rétro :
couleurCaseClaire = new Color(222, 184, 135); // Burlywood (bois clair rétro)
couleurCaseFoncee = new Color(139, 69, 19); // SaddleBrown (bois foncé rétro)
couleurCaseSelection = new Color(205, 133, 63); // Peru (orange/brun vieilli)
}
case "METAL_FUTURISTE" -> {
// Style métallique Futuriste
couleurCaseClaire = new Color(192, 192, 192); // Silver
couleurCaseFoncee = new Color(105, 105, 105); // DimGray
couleurCaseSelection = new Color(0, 255, 255); // Cyan flashy (effet néon)
}
case "BOIS_CLAIR" -> {
// Style Bois clair
couleurCaseClaire = new Color(240, 218, 181); // Beige clair
couleurCaseFoncee = new Color(181, 136, 99); // Marron clair
couleurCaseSelection = new Color(209, 83, 71); // Rouge-orangé
couleurCasePrecedente = new Color(255, 112, 99); // Rouge clair
}
case "JAUNE_CHALEUREUX" -> {
// Style Jaune Chaleureux
couleurCaseClaire = new Color(253, 231, 76); // Jaune vif
couleurCaseFoncee = new Color(227, 101, 91); // Rouge doux
couleurCaseSelection = new Color(248, 161, 87); // Orange doux
}
case "VINTAGE_PASTEL" -> {
// Style vintage pastel
couleurCaseClaire = new Color(246, 229, 189); // Beige pastel
couleurCaseFoncee = new Color(249, 125, 125); // Rose brique clair
couleurCaseSelection = new Color(200, 90, 90); // Rouge passé
}
default -> {
couleurCaseClaire = new Color(255, 255, 255); // Blanc
couleurCaseFoncee = new Color(200, 200, 200); // Gris
couleurCaseSelection = new Color(100, 100, 100); // Gris foncé
}
}
this.ligne = ligne;
this.colonne = colonne;
this.caseModele = caseModele;
// Gestion de la couleur
if ((ligne + colonne) % 2 == 0) {
setBackground(this.couleurCaseClaire); // couleur claire
} else {
setBackground(this.couleurCaseFoncee); // couleur foncée
}
setOpaque(true);
setBackground(couleurdeFond);
setPreferredSize(new Dimension(64, 64));
setLayout(new BorderLayout());
// Ajout du label à la case
label.setFont(new Font("SansSerif", Font.BOLD, 28));
label.setFont(new Font("SansSerif", Font.BOLD, 60));
add(label, BorderLayout.CENTER);
this.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 2));
this.updateFromModel(); // Mise à jour de l'affichage à partir du modèle
this.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
this.updateFromModel(); // Mise à jour de l'affichage à partir du modèle
//Ajoutons l'ecouteur
addMouseListener(this);
}
@Override
public void mouseClicked(MouseEvent e) {
Container parent = this.getParent();
while(parent != null && !(parent instanceof PlateauSwingUI)) {
parent = parent.getParent();
}
if (parent instanceof PlateauSwingUI plateau) {
plateau.selectionnerCase(this);
}
//System.out.println("Case cliquée : " + ligne + ", " + colonne);
}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
protected void paintComponent(Graphics pinceaux) {
super.paintComponent(pinceaux); // Pour effacer l'ancien objet
Graphics2D g2d = (Graphics2D) pinceaux.create();
// Appliquer l'anti-aliasing pour des bords plus doux
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
int w = getWidth();
int h = getHeight();
// Couleur de fond (jaune)
//System.out.println("Selectionner debug: "+selectionnee );
if(selectionnee){
this.setBackground(new Color(255, 215, 0)); // Jaune doux sélectionnée
this.setBackground(couleurCaseSelection);
// Pour le truc de dégradé
// //Dégradé radial: claire au centre, foncé aux bords
// Color centre = new Color(255, 150, 130); // plus claire au centre
// Color bord = new Color(200, 50, 40); // plus foncé aux bords
// float[] dist = {0.0f, 1.0f};
// Color[] colors = {centre, bord};
// RadialGradientPaint gradient = new RadialGradientPaint(
// w / 2f, h / 2f, Math.max(w, h) / 2f, // centre X, centre Y, rayon
// dist, // fractions
// colors // couleurs
// );
// g2d.setPaint(gradient);
// g2d.fillRect(0, 0, w, h);
// //petit contour plus sombre
// g2d.setColor(new Color(150, 30, 30));
// g2d.drawRect(0, 0, w-1, h-1);
}else{
this.setBackground(this.couleurdeFond);
// Couleur normale
//this.setBackground(this.couleurdeFond);
if ((ligne + colonne) % 2 == 0) {
g2d.setColor(couleurCaseClaire);
} else {
g2d.setColor(couleurCaseFoncee);
}
g2d.fillRect(0, 0, w, h);
}
// Surbrillance du dernier coup
if(estDernierCoupOrigine) {
g2d.setColor(couleurCasePrecedente);
g2d.fillRect(0, 0, w, h);
}
if(estDernierCoupDestination) {
g2d.setColor(couleurCaseSelection);
g2d.fillRect(0, 0, w, h);
}
g2d.dispose(); // Libération des ressources graphiques
}
// Rafrachit le contenu visuel depuis le model
public void updateFromModel(){
Piece p = (caseModele != null) ? caseModele.getPiece(): null;
label.setText(toUnicode(p));
label.setForeground(Color.BLACK);
repaint();
if(p != null) {
label.setForeground(new Color(0,0,0));
if (caseModele.getPiece().getCouleur() == Couleur.BLANC) {
label.setForeground(new Color(250,250,250));
}else{
label.setForeground(new Color(30,30,30));
}
}
repaint(); // double appel car setForeground le fais deja
}
private String toUnicode(Piece piece) {
@@ -60,35 +210,56 @@ public class CaseSwingUI extends JPanel {
if (piece == null) return "";
String symbole = piece.getSymbole();
return switch (symbole) {
case "BP" -> "";
case "BC" -> "";
case "BF" -> "";
case "BT" -> "";
case "BQ" -> "";
case "BK" -> "";
case "BP" -> "";
case "BC" -> "";
case "BF" -> "";
case "BT" -> "";
case "BR" -> "";
case "BO" -> "";
case "NP" -> "";
case "NC" -> "";
case "NF" -> "";
case "NT" -> "";
case "NQ" -> "";
case "NK" -> "";
case "NR" -> "";
case "NO" -> "";
default -> symbole;
};
}
// Getters/setters utiles pour l'IHM
public Piece getPiece() { return piece; }
public void setPiece(Piece piece) { this.piece = piece; }
public Piece getPiece() {
return (caseModele != null) ? caseModele.getPiece() : null;
}
public void setPiece(Piece piece) {
if(caseModele !=null ){
caseModele.setPiece(piece);
}
updateFromModel();
}
// Getters pour l'état de sélection
public boolean isSelectionnee() { return selectionnee; }
public void setSelectionnee(boolean selectionnee) {
this.selectionnee = selectionnee;
this.setBorder(BorderFactory.createLineBorder(selectionnee ? Color.ORANGE : Color.DARK_GRAY,selectionnee ? 4 : 2));
//this.setBorder(BorderFactory.createLineBorder(selectionnee ? new Color(248, 161, 87) : Color.DARK_GRAY,selectionnee ? 3 : 1));
// Repaint pour mettre à jour la couleur de fond
repaint();
}
// Gestion du dernier coup
public void setLastOrigin(boolean estDernierCoupOrigine) {
this.estDernierCoupOrigine = estDernierCoupOrigine;
repaint();
}
public void setLastDestination(boolean estDernierCoupDestination) {
this.estDernierCoupDestination = estDernierCoupDestination;
repaint();
}
// Getters pour la position de la case
public int getLigne() { return ligne; }
public int getColonne() { return colonne; }
}
}
+105 -10
View File
@@ -1,26 +1,43 @@
package vue;
import modele.Case;
import modele.Plateau;
import javax.swing.*;
import java.awt.*;
import javax.swing.*;
import modele.Coup;
import modele.Partie;
import modele.Plateau;
import modele.joueur.Joueur;
public class PlateauSwingUI extends JPanel {
private final CaseSwingUI[][] cases = new CaseSwingUI[8][8];
private final Plateau plateauModele;
private final VueGraphiqueSwing vueGraphiqueSwing;
private final Partie partieModel;
// Pour la gestion du dernier coup
private Point prevOrigine = null;
private Point prevDestination = null;
private CaseSwingUI caseSelectionnee = null;
public PlateauSwingUI(Plateau plateauModel, Partie partieModel,VueGraphiqueSwing vueGraphiqueSwing) {
this.plateauModele = plateauModel;
this.partieModel = partieModel;
this.vueGraphiqueSwing = vueGraphiqueSwing;
public PlateauSwingUI(Plateau plateauModele) {
this.plateauModele = plateauModele;
setLayout(new GridLayout(8, 8)); // Création de la grille 8x8
for (int ligne = 0; ligne < 8; ligne++) {
for (int colonne = 0; colonne < 8; colonne++) {
// Détermination de la couleur de fond
boolean claire = ((ligne + colonne) % 2 == 0);
Color couleur = claire ? new Color(240, 217, 181) : new Color(181, 136, 99);
//boolean estCaseClaire = ((ligne + colonne) % 2 == 0);
// Récupère la case du modèle, ne la crée pas !
var caseModele = plateauModele.getCase(ligne, colonne);
// Création de la case SwingUI
var caseUI = new CaseSwingUI(couleur, ligne, colonne, caseModele);
var caseUI = new CaseSwingUI(plateauModele.getStyle(), ligne, colonne, caseModele);
cases[ligne][colonne] = caseUI; // Stockage de la case dans le tableau
add(caseUI);
}
@@ -29,9 +46,10 @@ public class PlateauSwingUI extends JPanel {
// pour rafraîchir l'affichage
public void rafraichir() {
System.out.println("PlateauSwingUI : rafraichir() appelée");
for (int ligne = 0; ligne < 8; ligne++) {
for (int colonne = 0; colonne < 8; colonne++) {
// Mettre à jour l'état de chaque case
//cases[ligne][colonne].setSelectionnee(false);
cases[ligne][colonne].updateFromModel();
}
}
@@ -41,4 +59,81 @@ public class PlateauSwingUI extends JPanel {
public CaseSwingUI getCase(int ligne, int colonne) {
return cases[ligne][colonne];
s}
}
public void applyLastMove(Coup coup) {
// 1) Netoyer ancien
if (prevOrigine != null) {
cases[prevOrigine.x][prevOrigine.y].setLastOrigin(false);
cases[prevOrigine.x][prevOrigine.y].repaint();
}
if (prevDestination != null) {
cases[prevDestination.x][prevDestination.y].setLastDestination(false);
cases[prevDestination.x][prevDestination.y].repaint();
}
// 2) Appliquons le nouveau coup
if (coup != null) {
Point O = new Point(coup.getOrigine().x, coup.getOrigine().y);
Point D = new Point(coup.getDestination().x, coup.getDestination().y);
prevDestination = D;
cases[O.x][O.y].setLastOrigin(true);
cases[D.x][D.y].setLastDestination(true);
prevOrigine = O;
prevDestination = D;
// 3) Repaint des cases concernées
cases[O.x][O.y].repaint();
cases[D.x][D.y].repaint();
}
}
// Méthode à appeler depuis CaseSwingUI quand une case est cliquée
public void selectionnerCase(CaseSwingUI caseCliquee) {
Joueur joueur = partieModel.getJoueurActif();
// Etat 0 pas de case selection au paravant
if (caseSelectionnee == null) {
//1) il faut une piece
var piece = caseCliquee.getPiece();
if(piece == null) return; // Pas de pièce sur la case cliquée, rien à faire
// 2) et que la pièce appartient au joueur actif
if(piece.getCouleur() != joueur.getCouleur()) return;
caseSelectionnee = caseCliquee;
caseCliquee.setSelectionnee(true);
// Etat 1 une origine est deja selectionnée
}else{
if(caseCliquee == caseSelectionnee ){ // a revoir
// re-clique sur la meme case = annuller
caseCliquee.setSelectionnee(false);
caseSelectionnee = null;
return;
}
// 2e clic = destination on fabrique le coup
Coup coup = new Coup(
caseSelectionnee.getLigne(), caseSelectionnee.getColonne(),
caseCliquee.getLigne(), caseCliquee.getColonne()
);
// Rreset visuel + etat
caseSelectionnee.setSelectionnee(false);
caseSelectionnee = null;
// transmettre le coup a la vue
vueGraphiqueSwing.recevoirCoup(coup);
}
}
}
+1
View File
@@ -7,4 +7,5 @@ public interface Vue {
Coup demanderCoup(Plateau plateau); // Demande un coup au joueur
void afficherPlateau(Plateau plateau); // Affiche le plateau actuel
void afficherMessage(String message); // Affiche un message (texte)
void setDernierCoup(Coup coup); // Met à jour le dernier coup joué
}
+7 -1
View File
@@ -71,5 +71,11 @@ public class VueConsole implements Vue {
int ligne = Character.getNumericValue(position.charAt(1)); // Convertit '0' à '7'
return new int[]{ligne, col};
}
@Override
public void setDernierCoup(Coup coup) {
// Implémentation pour mettre à jour le dernier coup joué
System.out.println("Dernier coup joué : " + coup);
}
}
+95 -8
View File
@@ -1,30 +1,98 @@
package vue;
import javax.swing.JFrame;
import java.awt.*;
import javax.swing.*;
import modele.Coup;
import modele.Partie;
import modele.Plateau;
public class VueGraphiqueSwing implements Vue {
private Coup c;
JFrame fen = new JFrame("CHESS GAME");
private final PlateauSwingUI plateauUI;
//private Coup dernierCoup;
public VueGraphiqueSwing(Plateau plateau) {
// Journal systeme
private final JTextArea zoneSystem = new JTextArea(10, 24);
private final JScrollPane scrollSystem = new JScrollPane(zoneSystem);
// zone de message for chat
private final JTextArea zoneChat = new JTextArea(10, 24);
private final JScrollPane scrollChat = new JScrollPane(zoneChat);
private final JTextField champChat = new JTextField();
private final JButton btnEnvoyer = new JButton("Envoyer");
public VueGraphiqueSwing(Partie partie) {
fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fen.setResizable(false);
fen.setLayout(new BorderLayout());
plateauUI = new PlateauSwingUI(plateau); // Passe le modèle
//Centre : Gestion du plateau
plateauUI = new PlateauSwingUI(partie.getPlateau(), partie, this); // Passe le modèle
fen.add(plateauUI, BorderLayout.CENTER);
fen.setSize(800, 800);
// Journal systeme (droite, haut)
zoneSystem.setEditable(false);
zoneSystem.setLineWrap(true);
zoneSystem.setWrapStyleWord(true);
zoneSystem.setBorder(BorderFactory.createTitledBorder("System"));
// chat
zoneChat.setEditable(false);
zoneChat.setLineWrap(true);
zoneChat.setWrapStyleWord(true);
zoneChat.setBorder(BorderFactory.createTitledBorder("Chat"));
JPanel chatBas = new JPanel(new BorderLayout(6,0));
chatBas.add(champChat, BorderLayout.CENTER);
chatBas.add(btnEnvoyer, BorderLayout.EAST);
JPanel chatPanel = new JPanel(new BorderLayout(0, 4));
chatPanel.add(scrollChat, BorderLayout.CENTER);
chatPanel.add(chatBas, BorderLayout.SOUTH);
// Colonne droite : systeme (en haut) et chat (en bas)
JPanel coloneDroite = new JPanel( new BorderLayout(0, 8));
coloneDroite.add(scrollSystem, BorderLayout.CENTER);
coloneDroite.add(chatPanel, BorderLayout.SOUTH);
fen.add(coloneDroite, BorderLayout.EAST);
// Ecouteur pour envoyer le chat
btnEnvoyer.addActionListener(e -> envoyerChat());
champChat.addActionListener(e -> envoyerChat());
fen.setSize(1000, 800);
//fen.pack(); // ajuste la taille selon le contenu
fen.setLocationRelativeTo(null); // centre la fenêtre à l'écran
fen.setVisible(true);
}
public void envoyerChat() {
String message = champChat.getText().trim();
if (!message.isEmpty()) {
zoneChat.append("Vous: " + message + "\n");
champChat.setText("");
}
}
// API de la Vue
public void afficherMessageSysteme(String msg) {
SwingUtilities.invokeLater(() -> {
zoneSystem.append(msg + "\n");
zoneSystem.setCaretPosition(zoneSystem.getDocument().getLength());
});
}
public void afficherMessageChat(String auteur, String msg) {
SwingUtilities.invokeLater(() -> {
zoneChat.append("[" + auteur + "]: " + msg + "\n");
zoneChat.setCaretPosition(zoneChat.getDocument().getLength());
});
}
@Override
public void afficherMessage(String message) {
// Affichage du message dans la fenêtre graphique
@@ -32,8 +100,17 @@ public class VueGraphiqueSwing implements Vue {
@Override
public Coup demanderCoup(Plateau plateau) {
// Demande un coup au joueur
return null;
while(this.c == null) {
try {
Thread.sleep(20); // Attendre un court instant avant de vérifier à nouveau
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
return null;
}
}
Coup r = c;
c = null; // pret pour le coup suivant
return r;
}
@Override
@@ -41,4 +118,14 @@ public class VueGraphiqueSwing implements Vue {
plateauUI.rafraichir();
}
public void recevoirCoup(Coup coup) {
this.c = coup;
System.out.println("Coup reçu : " + coup);
}
@Override
public void setDernierCoup(Coup coup) {
//this.dernierCoup = coup;
plateauUI.applyLastMove(coup);
}
}