Jouable
This commit is contained in:
+64
-60
@@ -1,72 +1,76 @@
|
||||
import controleur.ControleurPartie;
|
||||
import controleur.ControleurReseau;
|
||||
import modele.Couleur;
|
||||
import modele.ModeDeJeu;
|
||||
import modele.Partie;
|
||||
import modele.joueur.Joueur;
|
||||
import modele.joueur.JoueurHumain;
|
||||
import vue.Vue;
|
||||
import vue.VueConsole;
|
||||
import vue.VueGraphiqueSwing;
|
||||
|
||||
import controleur.ControleurPartie;
|
||||
import controleur.ControleurReseau;
|
||||
import modele.Couleur;
|
||||
import modele.ModeDeJeu;
|
||||
import modele.Partie;
|
||||
import modele.joueur.Joueur;
|
||||
import modele.joueur.JoueurHumain;
|
||||
import vue.Vue;
|
||||
import vue.VueConsole;
|
||||
import vue.VueGraphiqueSwing;
|
||||
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
// Déclaration des variables nécessaires
|
||||
Vue vue;
|
||||
Joueur joueurBlanc;
|
||||
Joueur joueurNoir;
|
||||
ModeDeJeu modeDeJeu;
|
||||
ControleurReseau controleurReseau = null; // À initialiser si tu utilises le réseau
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
// Déclaration des variables nécessaires
|
||||
Vue vue;
|
||||
Joueur joueurBlanc;
|
||||
Joueur joueurNoir;
|
||||
ModeDeJeu modeDeJeu;
|
||||
ControleurReseau controleurReseau = null; // À initialiser si tu utilises le réseau
|
||||
|
||||
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
|
||||
int choixMode = 1; // à remplacer par Scanner plus tard
|
||||
int choixAffichage = 3; // 1: Console, 2: JavaFX, 3: Swing
|
||||
String stylePlateau = "BOIS_CLAIR"; // Style du plateau, à remplacer par une entrée utilisateur
|
||||
|
||||
switch (choixMode) {
|
||||
case 1 -> modeDeJeu = ModeDeJeu.HUMAIN_VS_HUMAIN;
|
||||
case 2 -> modeDeJeu = ModeDeJeu.HUMAIN_VS_IA;
|
||||
case 3 -> modeDeJeu = ModeDeJeu.IA_VS_IA;
|
||||
default -> {
|
||||
modeDeJeu = ModeDeJeu.HUMAIN_VS_HUMAIN;
|
||||
}
|
||||
}
|
||||
// === Choix du mode de jeu ===
|
||||
switch (choixMode) {
|
||||
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();
|
||||
joueurBlanc = new JoueurHumain(Couleur.BLANC, vue, false, "Mathis");
|
||||
joueurNoir = new JoueurHumain(Couleur.NOIR, vue, false, "Pellel");
|
||||
// === 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);
|
||||
Partie partie = new Partie(joueurBlanc, joueurNoir, stylePlateau);
|
||||
|
||||
switch (choixAffichage) {
|
||||
case 1 -> vue = new VueConsole();
|
||||
case 2 -> {
|
||||
// === Choix du type d'affichage ===
|
||||
switch (choixAffichage) {
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
// 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
|
||||
var controleurPartie = new ControleurPartie(partie, vue, controleurReseau, modeDeJeu);
|
||||
controleurPartie.lancerPartie();
|
||||
}
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
// === Lancement de la partie ===
|
||||
var controleurPartie = new ControleurPartie(partie, vue, controleurReseau, modeDeJeu);
|
||||
controleurPartie.lancerPartie();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
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);
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
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);
|
||||
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.
@@ -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
@@ -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
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+123
-67
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user