This commit is contained in:
HP_pellel
2025-09-13 23:27:56 +02:00
parent e42364b2e2
commit 802c85adfb
29 changed files with 409 additions and 222 deletions
+33 -29
View File
@@ -1,3 +1,4 @@
import controleur.ControleurPartie;
import controleur.ControleurReseau;
import modele.Couleur;
@@ -9,7 +10,6 @@
import vue.VueConsole;
import vue.VueGraphiqueSwing;
public class Main {
public static void main(String[] args) {
// Déclaration des variables nécessaires
@@ -21,51 +21,55 @@
int choixMode = 1; // à remplacer par Scanner plus tard
int choixAffichage = 3; // 1: Console, 2: JavaFX, 3: Swing
String stylePlateau = "BOIS_CLAIR"; // Style de plateau, à remplacer par une entrée utilisateur
String stylePlateau = "BOIS_CLAIR"; // Style du plateau, à remplacer par une entrée utilisateur
// === Choix du mode de jeu ===
switch (choixMode) {
case 1 -> modeDeJeu = ModeDeJeu.HUMAIN_VS_HUMAIN;
case 2 -> modeDeJeu = ModeDeJeu.HUMAIN_VS_IA;
case 3 -> modeDeJeu = ModeDeJeu.IA_VS_IA;
default -> {
case 1:
modeDeJeu = ModeDeJeu.HUMAIN_VS_HUMAIN;
break;
case 2:
modeDeJeu = ModeDeJeu.HUMAIN_VS_IA;
break;
case 3:
modeDeJeu = ModeDeJeu.IA_VS_IA;
break;
default:
modeDeJeu = ModeDeJeu.HUMAIN_VS_HUMAIN;
}
}
// Initialisation des joueurs et du mode de jeu
vue = new VueConsole();
// === Initialisation des joueurs ===
vue = new VueConsole(); // Valeur par défaut
joueurBlanc = new JoueurHumain(Couleur.BLANC, vue, false, "Mathis");
joueurNoir = new JoueurHumain(Couleur.NOIR, vue, false, "Pellel");
Partie partie = new Partie(joueurBlanc, joueurNoir, stylePlateau);
// === Choix du type d'affichage ===
switch (choixAffichage) {
case 1 -> vue = new VueConsole();
case 2 -> {
case 1:
vue = new VueConsole();
break;
case 2:
// vue = new VueGraphiqueJavaFX();
}
case 3 -> vue = new VueGraphiqueSwing(partie);
default -> {
break;
case 3:
vue = new VueGraphiqueSwing(partie);
break;
default:
System.out.println("Type d'affichage non reconnu. Console par défaut utilisée.");
vue = new VueConsole();
}
// Réaffecter la vue si les joueurs sont humains
if (joueurBlanc instanceof JoueurHumain jb) {
jb.setVue(vue);
}
if (joueurNoir instanceof JoueurHumain jn) {
jn.setVue(vue);
}
// Recalification de la vue pour chaque joueur humain
if(joueurBlanc instanceof JoueurHumain jb) jb.setVue(vue);
if(joueurNoir instanceof JoueurHumain jb) jb.setVue(vue);
// if (joueurNoir instanceof JoueurHumain) {
// JoueurHumain jb = (JoueurHumain) joueurBlanc;
// jb.setVue(vue);
// }
// if (joueurNoir instanceof JoueurHumain) {
// JoueurHumain jn = (JoueurHumain) joueurNoir;
// jn.setVue(vue);
// }
// lancement de la partie
// === Lancement de la partie ===
var controleurPartie = new ControleurPartie(partie, vue, controleurReseau, modeDeJeu);
controleurPartie.lancerPartie();
}
+14 -14
View File
@@ -4,6 +4,7 @@ import modele.Coup;
import modele.ModeDeJeu;
import modele.Partie;
import modele.joueur.*;
import reseau.TypeMessage;
import vue.Vue;
@@ -25,17 +26,15 @@ public class ControleurPartie {
System.out.println("BIENVENUE AU JEU D'ÉCHECS");
System.out.println("===============================\n");
System.out.println("DEbug");
vue.afficherMessage(TypeMessage.SYSTEME,"Mode de jeu : " + modeDeJeu);
vue.afficherMessage(TypeMessage.SYSTEME,"Joueurs : " + partie.getJoueurBlanc().getNom() + " (Blancs) vs " + partie.getJoueurNoir().getNom() + " (Noirs)");
vue.afficherMessage(TypeMessage.SYSTEME,"Les pions Noirs sont en bas. Les pions Blancs sont en haut. \n");
vue.afficherMessage("Mode de jeu : " + modeDeJeu);
vue.afficherMessage("Joueurs : " + partie.getJoueurBlanc().getNom() + " (Blancs) vs " + partie.getJoueurNoir().getNom() + " (Noirs)");
vue.afficherMessage("Les pions Noirs sont en bas. Les pions Blancs sont en haut. \n");
vue.afficherMessage("------- La Partie commence ! -------");
vue.afficherMessage(TypeMessage.SYSTEME,"------- La Partie commence ! -------");
vue.afficherPlateau(partie.getPlateau());
//System.out.print("\n");
vue.afficherMessage("C'est au tour de " + partie.getJoueurActif().getNom() + " de jouer.");
vue.afficherMessage(TypeMessage.SYSTEME,"C'est au tour de " + partie.getJoueurActif().getNom() + " de jouer.");
boucleDeJeu();
}
@@ -50,19 +49,20 @@ public class ControleurPartie {
vue.afficherPlateau(partie.getPlateau());
if(dernierCoup != null) {
vue.afficherMessage("Dernier coup : " + joueurPrecedent.getNom() + " a joué " + dernierCoup);
vue.afficherMessage(TypeMessage.SYSTEME,"Dernier coup : " + joueurPrecedent.getNom() + " a joué " + dernierCoup);
}
vue.afficherMessage("\nC'est au tour de " + partie.getJoueurActif().getNom() + " de jouer.");
vue.afficherMessage(TypeMessage.SYSTEME,"\nC'est au tour de " + partie.getJoueurActif().getNom() + " de jouer.");
vue.setTour(partie.getJoueurActif().getNom());
} catch (IllegalArgumentException e) {
vue.afficherMessage("> Erreur : " + e.getMessage());
vue.afficherMessage(TypeMessage.SYSTEME,"> Erreur : " + e.getMessage());
}
}
vue.afficherMessage("La partie est terminée !");
vue.afficherMessage("Si vous souhaitez rejouer, relancez le programme.");
vue.afficherMessage("Si vous souhaitez voir l'historique des coups taper 1. Si vous souhaitez voir les captures taper 2.");
vue.afficherMessage("Merci d'avoir joué !");
vue.afficherMessage(TypeMessage.SYSTEME,"La partie est terminée !");
vue.afficherMessage(TypeMessage.SYSTEME,"Si vous souhaitez rejouer, relancez le programme.");
vue.afficherMessage(TypeMessage.SYSTEME,"Si vous souhaitez voir l'historique des coups taper 1. Si vous souhaitez voir les captures taper 2.");
vue.afficherMessage(TypeMessage.SYSTEME,"Merci d'avoir joué !");
}
}
+1 -40
View File
@@ -1,42 +1,3 @@
// package modele;
// import java.awt.Point;
// public class Coup {
// private int xDepart;
// private int xArrivee;
// private int yDepart;
// private int yArrivee;
// public Coup(int xDepart, int yDepart, int xArrivee, int yArrivee) {
// this.colDepart = colDepart;
// this.yDepart = yDepart;
// this.xArrivee = xArrivee;
// this.yArrivee = yArrivee;
// }
// public Point getOrigine(){
// return new Point(xDepart, yDepart);
// }
// public Point getDestination(){
// return new Point(xArrivee, yArrivee);
// }
// @Override
// public String toString() {
// Point origine = getOrigine();
// Point destination = getDestination();
// char colOrigine = (char) ('a' + origine.y); // y = colonne
// int ligneOrigine = 8 - origine.x; // x = ligne
// char colDest = (char) ('a' + destination.y); // y = colonne
// int ligneDest = 8 - destination.x; // x = ligne
// return " " + colOrigine + ligneOrigine + " -> " + colDest + ligneDest;
// }
// }
package modele;
import java.awt.Point;
@@ -67,6 +28,6 @@ public class Coup {
char colOrigineChar = (char) ('a' + colDepart);
char colDestChar = (char) ('a' + colArrivee);
return " " + colOrigineChar + ligneDepart + " -> " + colDestChar + ligneArrivee;
return " " + colOrigineChar + ligneDepart + " -- " + colDestChar + ligneArrivee;
}
}
+1 -1
View File
@@ -49,7 +49,7 @@ public class Partie{
throw new IllegalArgumentException("Ce n'est pas votre pièce.");
}
if(!piece.estDeplacementValide(coup, plateau)) {
System.out.println("ICI");
//System.out.println("ICI");
throw new IllegalArgumentException("Déplacement invalide.");
}
// System.out.println("sortie dans partie");
+2 -2
View File
@@ -1,13 +1,13 @@
package modele.joueur;
import vue.Vue;
import modele.Couleur;
import modele.Coup;
import modele.Plateau;
import vue.Vue;
public class JoueurHumain extends Joueur {
private Vue vue;
private boolean reseau;
private final boolean reseau;
public JoueurHumain(Couleur couleur, Vue vue, boolean reseau, String nom) {
super(couleur, nom);
+39 -2
View File
@@ -1,4 +1,6 @@
package modele.piece;
import java.awt.Point;
import modele.Case;
import modele.Couleur;
import modele.Coup;
import modele.Plateau;
@@ -15,7 +17,42 @@ public class Fou extends Piece{
@Override
public boolean estDeplacementValide(Coup coup, Plateau plateau) {
// Implémentation de la validation du déplacement pour le fou
return false;
Point origine = coup.getOrigine();
Point destination = coup.getDestination();
// Conventions : Point.x = ligne, Point.y = colonne
int ligneOrigine = origine.x;
int colOrigine = origine.y;
int ligneDest = destination.x;
int colDest = destination.y;
// bornes de plateau
if (ligneDest < 0 || ligneDest > 7 || colDest < 0 || colDest > 7) return false;
int deltaLigne = Math.abs(ligneDest - ligneOrigine); // c'est le k
int deltaCol = Math.abs(colDest - colOrigine); // c'est le k
//Vérifie que le déplacement est bien en diagonale, mouvement en "L" aussi pour un deplacement à droite (x,y)= (x0 + k, y0 + k) et a gauche (x0 + k, y0 - k) vers bas c'est positif +k et le haut c'est negatif -k
if (deltaLigne != deltaCol) return false;
// Verification si le chemin est libre pour ne pas que le fou saute par dessus une piece
// Direction du mouvement
int pasligne = (ligneDest - ligneOrigine) / deltaLigne; // +1 ou -1
int pascol = (colDest - colOrigine) / deltaCol; // +1 ou -1
// Vérification des cases intermédiaires
for (int i = 1; i < deltaLigne; i++) {
Case caseInter = plateau.getCase(ligneOrigine + i * pasligne, colOrigine + i * pascol);
if (!caseInter.estVide()){
System.out.println("Le chemin est bloqué par une pièce en (" + (ligneOrigine + i * pasligne) + ", " + (colOrigine + i * pascol) + ")");
return false; // une pièce bloque le passage
}
}
// Etat de la case de destination
Case caseDest = plateau.getCase(ligneDest, colDest);
if (caseDest.estVide()) return true;
// si la case est occupée
return caseDest.getPiece().getCouleur() != this.getCouleur();
}
}
+46 -1
View File
@@ -1,4 +1,6 @@
package modele.piece;
import java.awt.Point;
import modele.Case;
import modele.Couleur;
import modele.Coup;
import modele.Plateau;
@@ -16,7 +18,50 @@ public class Reine extends Piece{
@Override
public boolean estDeplacementValide(Coup coup, Plateau plateau) {
// Implémentation de la validation du déplacement pour la reine
Point origine = coup.getOrigine();
Point destination = coup.getDestination();
// Conventions : Point.x = ligne, Point.y = colonne
int ligneOrigine = origine.x;
int colOrigine = origine.y;
int ligneDest = destination.x;
int colDest = destination.y;
// bornes de plateau
if (ligneDest < 0 || ligneDest > 7 || colDest < 0 || colDest > 7) return false;
int deltaLigne = Math.abs(ligneDest - ligneOrigine);
int deltaCol = Math.abs(colDest - colOrigine);
//Vérifie que le déplacement est bien en diagonale ou en ligne droite
if (!(deltaLigne == 0 || deltaCol == 0 || deltaLigne == deltaCol)) return false; //
// Verification si le chemin est libre pour ne pas que la reine saute par dessus une piece
// Direction du mouvement et le pas
int pasLigne = 0;
if (ligneDest > ligneOrigine) pasLigne = 1;
else if (ligneDest < ligneOrigine) pasLigne = -1;
int pasCol = 0;
if (colDest > colOrigine) pasCol = 1;
else if (colDest < colOrigine) pasCol = -1;
// Vérification des cases intermédiaires
int nbPas = Math.max(deltaLigne, deltaCol);
for (int i = 1; i < nbPas; i++) {
int l = ligneOrigine + i * pasLigne;
int c = colOrigine + i * pasCol;
Case caseInter = plateau.getCase(l, c);
if (!caseInter.estVide()) {
System.out.println("Le chemin est bloqué par une pièce en (" + l + ", " + c + ")");
return false;
}
}
// Etat de la case de destination
Case caseDest = plateau.getCase(ligneDest, colDest);
if (caseDest.estVide()) return true;
// si la case est occupée
return caseDest.getPiece().getCouleur() != this.getCouleur();
}
}
+24 -3
View File
@@ -1,17 +1,38 @@
package modele.piece;
import modele.Couleur;
import modele.Coup;
import modele.Plateau;
import java.awt.Point;
import modele.Case;
public class Roi extends Piece {
public Roi(Couleur couleur) {
super(couleur);
this.symbole = (couleur == Couleur.BLANC) ? "BO" : "NO"; // Symbole pour le roi blanc et noir
this.symbole = (couleur == Couleur.BLANC) ? "BO" : "NO";
}
@Override
public boolean estDeplacementValide(Coup coup, Plateau plateau) {
// Implémentation de la validation du déplacement pour le roi
return false;
Point origine = coup.getOrigine();
Point destination = coup.getDestination();
int ligneOrigine = origine.x;
int colOrigine = origine.y;
int ligneDest = destination.x;
int colDest = destination.y;
// bornes de plateau
if (ligneDest < 0 || ligneDest > 7 || colDest < 0 || colDest > 7) return false;
int deltaLigne = Math.abs(ligneDest - ligneOrigine);
int deltaCol = Math.abs(colDest - colOrigine);
// Le roi se déplace d'une seule case (horizontale, verticale ou diagonale)
if (deltaLigne > 1 || deltaCol > 1) return false;
// Vérifie la case de destination
Case caseDest = plateau.getCase(ligneDest, colDest);
return caseDest.estVide() || caseDest.getPiece().getCouleur() != this.getCouleur();
}
}
+46 -1
View File
@@ -2,6 +2,8 @@ package modele.piece;
import modele.Couleur;
import modele.Coup;
import modele.Plateau;
import java.awt.Point;
import modele.Case;
public class Tour extends Piece{
public Tour(Couleur couleur) {
@@ -15,7 +17,50 @@ public class Tour extends Piece{
@Override
public boolean estDeplacementValide(Coup coup, Plateau plateau) {
// Implémentation de la validation du déplacement pour la tour
Point origine = coup.getOrigine();
Point destination = coup.getDestination();
// Conventions : Point.x = ligne, Point.y = colonne
int ligneOrigine = origine.x;
int colOrigine = origine.y;
int ligneDest = destination.x;
int colDest = destination.y;
// bornes de plateau
if (ligneDest < 0 || ligneDest > 7 || colDest < 0 || colDest > 7) return false;
int deltaLigne = Math.abs(ligneDest - ligneOrigine);
int deltaCol = Math.abs(colDest - colOrigine);
//Vérifie que le déplacement est bien en diagonale ou en ligne droite
if (!(deltaLigne == 0 || deltaCol == 0)) return false;
// Verification si le chemin est libre pour ne pas que la tour saute par dessus une piece
// Direction du mouvement et le pas
int pasLigne = 0;
if (ligneDest > ligneOrigine) pasLigne = 1;
else if (ligneDest < ligneOrigine) pasLigne = -1;
int pasCol = 0;
if (colDest > colOrigine) pasCol = 1;
else if (colDest < colOrigine) pasCol = -1;
// Vérification des cases intermédiaires
int nbPas = Math.max(deltaLigne, deltaCol);
for (int i = 1; i < nbPas; i++) {
int l = ligneOrigine + i * pasLigne;
int c = colOrigine + i * pasCol;
Case caseInter = plateau.getCase(l, c);
if (!caseInter.estVide()) {
System.out.println("Le chemin est bloqué par une pièce en (" + l + ", " + c + ")");
return false;
}
}
// Etat de la case de destination
Case caseDest = plateau.getCase(ligneDest, colDest);
if (caseDest.estVide()) return true;
// si la case est occupée
return caseDest.getPiece().getCouleur() != this.getCouleur();
}
}
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.
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.
+7 -3
View File
@@ -1,7 +1,11 @@
package reseau;
public enum TypeMessage {
DEMANDE_DE_PARTIE,
MOUVEMENT,
FIN_DE_PARTIE
DEMANDE_DE_PARTIE, // Un joueur veut lancer une partie
MOUVEMENT, // Transmission d'un coup
FIN_DE_PARTIE, // Signal de fin
SYSTEME, // Message système (erreur, info serveur, etc.)
CHAT // Message chat entre joueurs
}
+15 -15
View File
@@ -209,21 +209,21 @@ public class CaseSwingUI extends JPanel implements MouseListener{
// Conversion du symbole en caractère Unicode
if (piece == null) return "";
String symbole = piece.getSymbole();
return switch (symbole) {
case "BP" -> "";
case "BC" -> "";
case "BF" -> "";
case "BT" -> "";
case "BR" -> "";
case "BO" -> "";
case "NP" -> "";
case "NC" -> "";
case "NF" -> "";
case "NT" -> "";
case "NR" -> "";
case "NO" -> "";
default -> symbole;
};
switch (symbole) {
case "BP": return "";
case "BC": return "";
case "BF": return "";
case "BT": return "";
case "BR": return "";
case "BO": return "";
case "NP": return "";
case "NC": return "";
case "NF": return "";
case "NT": return "";
case "NR": return "";
case "NO": return "";
default: return symbole;
}
}
+4 -1
View File
@@ -2,10 +2,13 @@ package vue;
import modele.Coup;
import modele.Plateau;
import reseau.TypeMessage;
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 afficherMessage(TypeMessage type, String message); // Affiche un message (texte)
void setDernierCoup(Coup coup); // Met à jour le dernier coup joué
void setTour(String tour);
void setScore(String score);
}
+12 -1
View File
@@ -5,6 +5,7 @@ import modele.Case;
import modele.Coup;
import modele.Plateau;
import modele.piece.Piece;
import reseau.TypeMessage;
public class VueConsole implements Vue {
@@ -62,7 +63,7 @@ public class VueConsole implements Vue {
@Override
public void afficherMessage(String message) {
public void afficherMessage(TypeMessage type, String message) {
System.out.println(message); // Affiche le message dans la console
}
@@ -78,4 +79,14 @@ public class VueConsole implements Vue {
System.out.println("Dernier coup joué : " + coup);
}
@Override
public void setTour(String tour) {
System.out.println("Tour : " + tour);
}
@Override
public void setScore(String score) {
System.out.println("Score : " + score);
}
}
+122 -66
View File
@@ -2,114 +2,160 @@ package vue;
import java.awt.*;
import javax.swing.*;
import jdk.jfr.Percentage;
import modele.Coup;
import modele.Partie;
import modele.Plateau;
import reseau.TypeMessage;
public class VueGraphiqueSwing implements Vue {
private Coup c;
JFrame fen = new JFrame("CHESS GAME");
private final JFrame fen;
private final PlateauSwingUI plateauUI;
//private Coup dernierCoup;
// Journal systeme
private final JTextArea zoneSystem = new JTextArea(10, 24);
private final JScrollPane scrollSystem = new JScrollPane(zoneSystem);
// Colonne gauche (messages dynamiques)
private final JPanel panelMessages = new JPanel();
// Colonne droite (infos dynamiques)
private final JLabel lblDernierCoup = new JLabel("Dernier coup : ");
private final JLabel lblTour = new JLabel("Tour : ");
private final JLabel lblScore = new JLabel("Score : ");
private final JPanel panelSysteme = new JPanel();
// 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 = new JFrame("CHESS GAME");
fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fen.setResizable(false);
fen.setResizable(true);
fen.setLayout(new BorderLayout());
//Centre : Gestion du plateau
plateauUI = new PlateauSwingUI(partie.getPlateau(), partie, this); // Passe le modèle
fen.add(plateauUI, BorderLayout.CENTER);
// Plateau
plateauUI = new PlateauSwingUI(partie.getPlateau(), partie, this);
plateauUI.setPreferredSize(new Dimension(500, 600));
// Colonne droite (infos + messages système)
JPanel droite = new JPanel(new BorderLayout());
// Journal systeme (droite, haut)
zoneSystem.setEditable(false);
zoneSystem.setLineWrap(true);
zoneSystem.setWrapStyleWord(true);
zoneSystem.setBorder(BorderFactory.createTitledBorder("System"));
// Haut -> infos
JPanel panelInfos = new JPanel();
panelInfos.setLayout(new BoxLayout(panelInfos, BoxLayout.Y_AXIS));
panelInfos.setBorder(BorderFactory.createTitledBorder("Infos"));
panelInfos.add(lblDernierCoup);
panelInfos.add(Box.createVerticalStrut(10));
panelInfos.add(lblTour);
panelInfos.add(Box.createVerticalStrut(10));
panelInfos.add(lblScore);
// chat
zoneChat.setEditable(false);
zoneChat.setLineWrap(true);
zoneChat.setWrapStyleWord(true);
zoneChat.setBorder(BorderFactory.createTitledBorder("Chat"));
droite.add(panelInfos, BorderLayout.NORTH);
JPanel chatBas = new JPanel(new BorderLayout(6,0));
chatBas.add(champChat, BorderLayout.CENTER);
chatBas.add(btnEnvoyer, BorderLayout.EAST);
// Bas -> messages système
panelSysteme.setLayout(new BoxLayout(panelSysteme, BoxLayout.Y_AXIS));
JScrollPane scrollSysteme = new JScrollPane(panelSysteme);
scrollSysteme.setBorder(BorderFactory.createTitledBorder("Système"));
droite.add(scrollSysteme, BorderLayout.CENTER);
JPanel chatPanel = new JPanel(new BorderLayout(0, 4));
chatPanel.add(scrollChat, BorderLayout.CENTER);
chatPanel.add(chatBas, BorderLayout.SOUTH);
// === Colonne gauche (messages serveur) ===
panelMessages.setLayout(new BoxLayout(panelMessages, BoxLayout.Y_AXIS));
panelMessages.setPreferredSize(new Dimension(200, 0));
panelMessages.setMinimumSize(new Dimension(200, 0));
JScrollPane scrollMessages = new JScrollPane(panelMessages);
scrollMessages.setBorder(BorderFactory.createTitledBorder("Messages (serveur)"));
// 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);
// === JSplitPane centre (plateau + droite) ===
JSplitPane splitCentre = new JSplitPane(
JSplitPane.HORIZONTAL_SPLIT,
plateauUI,
droite
);
splitCentre.setDividerLocation(800);
splitCentre.setResizeWeight(0.7);
splitCentre.setOneTouchExpandable(true);
fen.add(coloneDroite, BorderLayout.EAST);
// === JSplitPane global (gauche + centre) ===
JSplitPane splitGlobal = new JSplitPane(
JSplitPane.HORIZONTAL_SPLIT,
scrollMessages,
splitCentre
);
splitGlobal.setDividerLocation(200);
splitGlobal.setResizeWeight(0.0); // tout l'espace supplémentaire va à droite
splitGlobal.setOneTouchExpandable(true);
// Ecouteur pour envoyer le chat
btnEnvoyer.addActionListener(e -> envoyerChat());
champChat.addActionListener(e -> envoyerChat());
// Ajout final
fen.add(splitGlobal, BorderLayout.CENTER);
fen.setSize(1000, 800);
//fen.pack(); // ajuste la taille selon le contenu
fen.setLocationRelativeTo(null); // centre la fenêtre à l'écran
fen.setSize(1400, 800);
fen.setLocationRelativeTo(null);
fen.setVisible(true);
}
public void envoyerChat() {
String message = champChat.getText().trim();
if (!message.isEmpty()) {
zoneChat.append("Vous: " + message + "\n");
champChat.setText("");
private JPanel createMessageBlock(String text, Color bg, Color fg) {
JLabel lbl = new JLabel(text);
lbl.setForeground(fg);
JPanel block = new JPanel(new BorderLayout());
block.add(lbl, BorderLayout.CENTER);
// Style
block.setBackground(bg);
block.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(5, 10, 5, 10), // marges internes
BorderFactory.createLineBorder(Color.GRAY, 1) // bordure
));
// Taille fixe : largeur dynamique, hauteur compacte
block.setPreferredSize(new Dimension(0, 35)); // hauteur 35 px
block.setMaximumSize(new Dimension(Integer.MAX_VALUE, 35)); // largeur étirable, hauteur fixée
block.setMinimumSize(new Dimension(100, 35));
return block;
}
// Ajouter message serveur (colonne gauche)
public void ajouterMessageChat(String message) {
SwingUtilities.invokeLater(() -> { // assure que c'est dans le thread Swing
JPanel block = createMessageBlock(message, Color.WHITE, Color.BLACK);
panelMessages.add(block);
panelSysteme.add(Box.createVerticalStrut(8));
panelMessages.revalidate();
panelMessages.repaint();
});
}
// Ajouter message système (colonne droite bas)
public void ajouterMessageSysteme(String message) {
SwingUtilities.invokeLater(() -> {
JPanel block = createMessageBlock(message, new Color(255,220,220), Color.RED);
panelSysteme.add(block);
panelSysteme.add(Box.createVerticalStrut(15));
panelSysteme.revalidate();
panelSysteme.repaint();
});
}
// 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
public void afficherMessage(TypeMessage type, String message) {
switch (type) {
case CHAT : ajouterMessageChat(message);
case SYSTEME : ajouterMessageSysteme(message);
default : System.out.println("[INFO] " + message);
}
}
@Override
public Coup demanderCoup(Plateau plateau) {
while(this.c == null) {
try {
Thread.sleep(20); // Attendre un court instant avant de vérifier à nouveau
Thread.sleep(20);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
return null;
}
}
Coup r = c;
c = null; // pret pour le coup suivant
c = null; // prêt pour le coup suivant
return r;
}
@@ -125,7 +171,17 @@ public class VueGraphiqueSwing implements Vue {
@Override
public void setDernierCoup(Coup coup) {
//this.dernierCoup = coup;
lblDernierCoup.setText("Dernier coup : " + coup);
plateauUI.applyLastMove(coup);
}
@Override
public void setTour(String tour) {
lblTour.setText("Tour : " + tour);
}
@Override
public void setScore(String score) {
lblScore.setText("Score : " + score);
}
}