Jouable
This commit is contained in:
+33
-29
@@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
import controleur.ControleurPartie;
|
import controleur.ControleurPartie;
|
||||||
import controleur.ControleurReseau;
|
import controleur.ControleurReseau;
|
||||||
import modele.Couleur;
|
import modele.Couleur;
|
||||||
@@ -9,7 +10,6 @@
|
|||||||
import vue.VueConsole;
|
import vue.VueConsole;
|
||||||
import vue.VueGraphiqueSwing;
|
import vue.VueGraphiqueSwing;
|
||||||
|
|
||||||
|
|
||||||
public class Main {
|
public class Main {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
// Déclaration des variables nécessaires
|
// Déclaration des variables nécessaires
|
||||||
@@ -21,51 +21,55 @@
|
|||||||
|
|
||||||
int choixMode = 1; // à remplacer par Scanner plus tard
|
int choixMode = 1; // à remplacer par Scanner plus tard
|
||||||
int choixAffichage = 3; // 1: Console, 2: JavaFX, 3: Swing
|
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) {
|
switch (choixMode) {
|
||||||
case 1 -> modeDeJeu = ModeDeJeu.HUMAIN_VS_HUMAIN;
|
case 1:
|
||||||
case 2 -> modeDeJeu = ModeDeJeu.HUMAIN_VS_IA;
|
modeDeJeu = ModeDeJeu.HUMAIN_VS_HUMAIN;
|
||||||
case 3 -> modeDeJeu = ModeDeJeu.IA_VS_IA;
|
break;
|
||||||
default -> {
|
case 2:
|
||||||
|
modeDeJeu = ModeDeJeu.HUMAIN_VS_IA;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
modeDeJeu = ModeDeJeu.IA_VS_IA;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
modeDeJeu = ModeDeJeu.HUMAIN_VS_HUMAIN;
|
modeDeJeu = ModeDeJeu.HUMAIN_VS_HUMAIN;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Initialisation des joueurs et du mode de jeu
|
// === Initialisation des joueurs ===
|
||||||
vue = new VueConsole();
|
vue = new VueConsole(); // Valeur par défaut
|
||||||
joueurBlanc = new JoueurHumain(Couleur.BLANC, vue, false, "Mathis");
|
joueurBlanc = new JoueurHumain(Couleur.BLANC, vue, false, "Mathis");
|
||||||
joueurNoir = new JoueurHumain(Couleur.NOIR, vue, false, "Pellel");
|
joueurNoir = new JoueurHumain(Couleur.NOIR, vue, false, "Pellel");
|
||||||
|
|
||||||
Partie partie = new Partie(joueurBlanc, joueurNoir, stylePlateau);
|
Partie partie = new Partie(joueurBlanc, joueurNoir, stylePlateau);
|
||||||
|
|
||||||
|
// === Choix du type d'affichage ===
|
||||||
switch (choixAffichage) {
|
switch (choixAffichage) {
|
||||||
case 1 -> vue = new VueConsole();
|
case 1:
|
||||||
case 2 -> {
|
vue = new VueConsole();
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
// vue = new VueGraphiqueJavaFX();
|
// vue = new VueGraphiqueJavaFX();
|
||||||
}
|
break;
|
||||||
case 3 -> vue = new VueGraphiqueSwing(partie);
|
case 3:
|
||||||
default -> {
|
vue = new VueGraphiqueSwing(partie);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
System.out.println("Type d'affichage non reconnu. Console par défaut utilisée.");
|
System.out.println("Type d'affichage non reconnu. Console par défaut utilisée.");
|
||||||
vue = new VueConsole();
|
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
|
// === Lancement de la partie ===
|
||||||
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);
|
var controleurPartie = new ControleurPartie(partie, vue, controleurReseau, modeDeJeu);
|
||||||
controleurPartie.lancerPartie();
|
controleurPartie.lancerPartie();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import modele.Coup;
|
|||||||
import modele.ModeDeJeu;
|
import modele.ModeDeJeu;
|
||||||
import modele.Partie;
|
import modele.Partie;
|
||||||
import modele.joueur.*;
|
import modele.joueur.*;
|
||||||
|
import reseau.TypeMessage;
|
||||||
import vue.Vue;
|
import vue.Vue;
|
||||||
|
|
||||||
|
|
||||||
@@ -25,17 +26,15 @@ public class ControleurPartie {
|
|||||||
System.out.println("BIENVENUE AU JEU D'ÉCHECS");
|
System.out.println("BIENVENUE AU JEU D'ÉCHECS");
|
||||||
System.out.println("===============================\n");
|
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(TypeMessage.SYSTEME,"------- La Partie commence ! -------");
|
||||||
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.afficherPlateau(partie.getPlateau());
|
vue.afficherPlateau(partie.getPlateau());
|
||||||
//System.out.print("\n");
|
//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();
|
boucleDeJeu();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,19 +49,20 @@ public class ControleurPartie {
|
|||||||
vue.afficherPlateau(partie.getPlateau());
|
vue.afficherPlateau(partie.getPlateau());
|
||||||
|
|
||||||
if(dernierCoup != null) {
|
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) {
|
} catch (IllegalArgumentException e) {
|
||||||
vue.afficherMessage("> Erreur : " + e.getMessage());
|
vue.afficherMessage(TypeMessage.SYSTEME,"> Erreur : " + e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vue.afficherMessage("La partie est terminée !");
|
vue.afficherMessage(TypeMessage.SYSTEME,"La partie est terminée !");
|
||||||
vue.afficherMessage("Si vous souhaitez rejouer, relancez le programme.");
|
vue.afficherMessage(TypeMessage.SYSTEME,"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(TypeMessage.SYSTEME,"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,"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;
|
package modele;
|
||||||
|
|
||||||
import java.awt.Point;
|
import java.awt.Point;
|
||||||
@@ -67,6 +28,6 @@ public class Coup {
|
|||||||
char colOrigineChar = (char) ('a' + colDepart);
|
char colOrigineChar = (char) ('a' + colDepart);
|
||||||
char colDestChar = (char) ('a' + colArrivee);
|
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.");
|
throw new IllegalArgumentException("Ce n'est pas votre pièce.");
|
||||||
}
|
}
|
||||||
if(!piece.estDeplacementValide(coup, plateau)) {
|
if(!piece.estDeplacementValide(coup, plateau)) {
|
||||||
System.out.println("ICI");
|
//System.out.println("ICI");
|
||||||
throw new IllegalArgumentException("Déplacement invalide.");
|
throw new IllegalArgumentException("Déplacement invalide.");
|
||||||
}
|
}
|
||||||
// System.out.println("sortie dans partie");
|
// System.out.println("sortie dans partie");
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
package modele.joueur;
|
package modele.joueur;
|
||||||
|
|
||||||
import vue.Vue;
|
|
||||||
import modele.Couleur;
|
import modele.Couleur;
|
||||||
import modele.Coup;
|
import modele.Coup;
|
||||||
import modele.Plateau;
|
import modele.Plateau;
|
||||||
|
import vue.Vue;
|
||||||
|
|
||||||
public class JoueurHumain extends Joueur {
|
public class JoueurHumain extends Joueur {
|
||||||
private Vue vue;
|
private Vue vue;
|
||||||
private boolean reseau;
|
private final boolean reseau;
|
||||||
|
|
||||||
public JoueurHumain(Couleur couleur, Vue vue, boolean reseau, String nom) {
|
public JoueurHumain(Couleur couleur, Vue vue, boolean reseau, String nom) {
|
||||||
super(couleur, nom);
|
super(couleur, nom);
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
package modele.piece;
|
package modele.piece;
|
||||||
|
import java.awt.Point;
|
||||||
|
import modele.Case;
|
||||||
import modele.Couleur;
|
import modele.Couleur;
|
||||||
import modele.Coup;
|
import modele.Coup;
|
||||||
import modele.Plateau;
|
import modele.Plateau;
|
||||||
@@ -15,7 +17,42 @@ public class Fou extends Piece{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean estDeplacementValide(Coup coup, Plateau plateau) {
|
public boolean estDeplacementValide(Coup coup, Plateau plateau) {
|
||||||
// Implémentation de la validation du déplacement pour le fou
|
Point origine = coup.getOrigine();
|
||||||
return false;
|
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;
|
package modele.piece;
|
||||||
|
import java.awt.Point;
|
||||||
|
import modele.Case;
|
||||||
import modele.Couleur;
|
import modele.Couleur;
|
||||||
import modele.Coup;
|
import modele.Coup;
|
||||||
import modele.Plateau;
|
import modele.Plateau;
|
||||||
@@ -16,7 +18,50 @@ public class Reine extends Piece{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean estDeplacementValide(Coup coup, Plateau plateau) {
|
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;
|
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;
|
package modele.piece;
|
||||||
|
|
||||||
import modele.Couleur;
|
import modele.Couleur;
|
||||||
import modele.Coup;
|
import modele.Coup;
|
||||||
import modele.Plateau;
|
import modele.Plateau;
|
||||||
|
import java.awt.Point;
|
||||||
|
import modele.Case;
|
||||||
|
|
||||||
public class Roi extends Piece {
|
public class Roi extends Piece {
|
||||||
public Roi(Couleur couleur) {
|
public Roi(Couleur couleur) {
|
||||||
super(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
|
@Override
|
||||||
public boolean estDeplacementValide(Coup coup, Plateau plateau) {
|
public boolean estDeplacementValide(Coup coup, Plateau plateau) {
|
||||||
// Implémentation de la validation du déplacement pour le roi
|
Point origine = coup.getOrigine();
|
||||||
return false;
|
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.Couleur;
|
||||||
import modele.Coup;
|
import modele.Coup;
|
||||||
import modele.Plateau;
|
import modele.Plateau;
|
||||||
|
import java.awt.Point;
|
||||||
|
import modele.Case;
|
||||||
|
|
||||||
public class Tour extends Piece{
|
public class Tour extends Piece{
|
||||||
public Tour(Couleur couleur) {
|
public Tour(Couleur couleur) {
|
||||||
@@ -15,7 +17,50 @@ public class Tour extends Piece{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean estDeplacementValide(Coup coup, Plateau plateau) {
|
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;
|
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;
|
package reseau;
|
||||||
|
|
||||||
public enum TypeMessage {
|
public enum TypeMessage {
|
||||||
DEMANDE_DE_PARTIE,
|
DEMANDE_DE_PARTIE, // Un joueur veut lancer une partie
|
||||||
MOUVEMENT,
|
MOUVEMENT, // Transmission d'un coup
|
||||||
FIN_DE_PARTIE
|
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
|
// Conversion du symbole en caractère Unicode
|
||||||
if (piece == null) return "";
|
if (piece == null) return "";
|
||||||
String symbole = piece.getSymbole();
|
String symbole = piece.getSymbole();
|
||||||
return switch (symbole) {
|
switch (symbole) {
|
||||||
case "BP" -> "♟";
|
case "BP": return "♟";
|
||||||
case "BC" -> "♞";
|
case "BC": return "♞";
|
||||||
case "BF" -> "♝";
|
case "BF": return "♝";
|
||||||
case "BT" -> "♜";
|
case "BT": return "♜";
|
||||||
case "BR" -> "♛";
|
case "BR": return "♛";
|
||||||
case "BO" -> "♚";
|
case "BO": return "♚";
|
||||||
case "NP" -> "♟";
|
case "NP": return "♟";
|
||||||
case "NC" -> "♞";
|
case "NC": return "♞";
|
||||||
case "NF" -> "♝";
|
case "NF": return "♝";
|
||||||
case "NT" -> "♜";
|
case "NT": return "♜";
|
||||||
case "NR" -> "♛";
|
case "NR": return "♛";
|
||||||
case "NO" -> "♚";
|
case "NO": return "♚";
|
||||||
default -> symbole;
|
default: return symbole;
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+4
-1
@@ -2,10 +2,13 @@ package vue;
|
|||||||
|
|
||||||
import modele.Coup;
|
import modele.Coup;
|
||||||
import modele.Plateau;
|
import modele.Plateau;
|
||||||
|
import reseau.TypeMessage;
|
||||||
|
|
||||||
public interface Vue {
|
public interface Vue {
|
||||||
Coup demanderCoup(Plateau plateau); // Demande un coup au joueur
|
Coup demanderCoup(Plateau plateau); // Demande un coup au joueur
|
||||||
void afficherPlateau(Plateau plateau); // Affiche le plateau actuel
|
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 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.Coup;
|
||||||
import modele.Plateau;
|
import modele.Plateau;
|
||||||
import modele.piece.Piece;
|
import modele.piece.Piece;
|
||||||
|
import reseau.TypeMessage;
|
||||||
public class VueConsole implements Vue {
|
public class VueConsole implements Vue {
|
||||||
|
|
||||||
|
|
||||||
@@ -62,7 +63,7 @@ public class VueConsole implements Vue {
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void afficherMessage(String message) {
|
public void afficherMessage(TypeMessage type, String message) {
|
||||||
System.out.println(message); // Affiche le message dans la console
|
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);
|
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
@@ -2,114 +2,160 @@ package vue;
|
|||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
|
import jdk.jfr.Percentage;
|
||||||
import modele.Coup;
|
import modele.Coup;
|
||||||
import modele.Partie;
|
import modele.Partie;
|
||||||
import modele.Plateau;
|
import modele.Plateau;
|
||||||
|
import reseau.TypeMessage;
|
||||||
|
|
||||||
public class VueGraphiqueSwing implements Vue {
|
public class VueGraphiqueSwing implements Vue {
|
||||||
private Coup c;
|
private Coup c;
|
||||||
JFrame fen = new JFrame("CHESS GAME");
|
private final JFrame fen;
|
||||||
private final PlateauSwingUI plateauUI;
|
private final PlateauSwingUI plateauUI;
|
||||||
//private Coup dernierCoup;
|
|
||||||
|
|
||||||
// Journal systeme
|
// Colonne gauche (messages dynamiques)
|
||||||
private final JTextArea zoneSystem = new JTextArea(10, 24);
|
private final JPanel panelMessages = new JPanel();
|
||||||
private final JScrollPane scrollSystem = new JScrollPane(zoneSystem);
|
|
||||||
|
// 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) {
|
public VueGraphiqueSwing(Partie partie) {
|
||||||
|
fen = new JFrame("CHESS GAME");
|
||||||
fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||||
fen.setResizable(false);
|
fen.setResizable(true);
|
||||||
fen.setLayout(new BorderLayout());
|
fen.setLayout(new BorderLayout());
|
||||||
|
|
||||||
//Centre : Gestion du plateau
|
// Plateau
|
||||||
plateauUI = new PlateauSwingUI(partie.getPlateau(), partie, this); // Passe le modèle
|
plateauUI = new PlateauSwingUI(partie.getPlateau(), partie, this);
|
||||||
fen.add(plateauUI, BorderLayout.CENTER);
|
plateauUI.setPreferredSize(new Dimension(500, 600));
|
||||||
|
|
||||||
|
// Colonne droite (infos + messages système)
|
||||||
|
JPanel droite = new JPanel(new BorderLayout());
|
||||||
|
|
||||||
// Journal systeme (droite, haut)
|
// Haut -> infos
|
||||||
zoneSystem.setEditable(false);
|
JPanel panelInfos = new JPanel();
|
||||||
zoneSystem.setLineWrap(true);
|
panelInfos.setLayout(new BoxLayout(panelInfos, BoxLayout.Y_AXIS));
|
||||||
zoneSystem.setWrapStyleWord(true);
|
panelInfos.setBorder(BorderFactory.createTitledBorder("Infos"));
|
||||||
zoneSystem.setBorder(BorderFactory.createTitledBorder("System"));
|
panelInfos.add(lblDernierCoup);
|
||||||
|
panelInfos.add(Box.createVerticalStrut(10));
|
||||||
|
panelInfos.add(lblTour);
|
||||||
|
panelInfos.add(Box.createVerticalStrut(10));
|
||||||
|
panelInfos.add(lblScore);
|
||||||
|
|
||||||
// chat
|
droite.add(panelInfos, BorderLayout.NORTH);
|
||||||
zoneChat.setEditable(false);
|
|
||||||
zoneChat.setLineWrap(true);
|
|
||||||
zoneChat.setWrapStyleWord(true);
|
|
||||||
zoneChat.setBorder(BorderFactory.createTitledBorder("Chat"));
|
|
||||||
|
|
||||||
JPanel chatBas = new JPanel(new BorderLayout(6,0));
|
// Bas -> messages système
|
||||||
chatBas.add(champChat, BorderLayout.CENTER);
|
panelSysteme.setLayout(new BoxLayout(panelSysteme, BoxLayout.Y_AXIS));
|
||||||
chatBas.add(btnEnvoyer, BorderLayout.EAST);
|
JScrollPane scrollSysteme = new JScrollPane(panelSysteme);
|
||||||
|
scrollSysteme.setBorder(BorderFactory.createTitledBorder("Système"));
|
||||||
|
droite.add(scrollSysteme, BorderLayout.CENTER);
|
||||||
|
|
||||||
JPanel chatPanel = new JPanel(new BorderLayout(0, 4));
|
// === Colonne gauche (messages serveur) ===
|
||||||
chatPanel.add(scrollChat, BorderLayout.CENTER);
|
panelMessages.setLayout(new BoxLayout(panelMessages, BoxLayout.Y_AXIS));
|
||||||
chatPanel.add(chatBas, BorderLayout.SOUTH);
|
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)
|
// === JSplitPane centre (plateau + droite) ===
|
||||||
JPanel coloneDroite = new JPanel( new BorderLayout(0, 8));
|
JSplitPane splitCentre = new JSplitPane(
|
||||||
coloneDroite.add(scrollSystem, BorderLayout.CENTER);
|
JSplitPane.HORIZONTAL_SPLIT,
|
||||||
coloneDroite.add(chatPanel, BorderLayout.SOUTH);
|
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
|
// Ajout final
|
||||||
btnEnvoyer.addActionListener(e -> envoyerChat());
|
fen.add(splitGlobal, BorderLayout.CENTER);
|
||||||
champChat.addActionListener(e -> envoyerChat());
|
|
||||||
|
|
||||||
fen.setSize(1000, 800);
|
fen.setSize(1400, 800);
|
||||||
//fen.pack(); // ajuste la taille selon le contenu
|
fen.setLocationRelativeTo(null);
|
||||||
fen.setLocationRelativeTo(null); // centre la fenêtre à l'écran
|
|
||||||
fen.setVisible(true);
|
fen.setVisible(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void envoyerChat() {
|
private JPanel createMessageBlock(String text, Color bg, Color fg) {
|
||||||
String message = champChat.getText().trim();
|
JLabel lbl = new JLabel(text);
|
||||||
if (!message.isEmpty()) {
|
lbl.setForeground(fg);
|
||||||
zoneChat.append("Vous: " + message + "\n");
|
|
||||||
champChat.setText("");
|
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
|
// 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
|
@Override
|
||||||
public void afficherMessage(String message) {
|
public void afficherMessage(TypeMessage type, String message) {
|
||||||
// Affichage du message dans la fenêtre graphique
|
switch (type) {
|
||||||
|
case CHAT : ajouterMessageChat(message);
|
||||||
|
case SYSTEME : ajouterMessageSysteme(message);
|
||||||
|
default : System.out.println("[INFO] " + message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Coup demanderCoup(Plateau plateau) {
|
public Coup demanderCoup(Plateau plateau) {
|
||||||
while(this.c == null) {
|
while(this.c == null) {
|
||||||
try {
|
try {
|
||||||
Thread.sleep(20); // Attendre un court instant avant de vérifier à nouveau
|
Thread.sleep(20);
|
||||||
} catch (InterruptedException ex) {
|
} catch (InterruptedException ex) {
|
||||||
Thread.currentThread().interrupt();
|
Thread.currentThread().interrupt();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Coup r = c;
|
Coup r = c;
|
||||||
c = null; // pret pour le coup suivant
|
c = null; // prêt pour le coup suivant
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,7 +171,17 @@ public class VueGraphiqueSwing implements Vue {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setDernierCoup(Coup coup) {
|
public void setDernierCoup(Coup coup) {
|
||||||
//this.dernierCoup = coup;
|
lblDernierCoup.setText("Dernier coup : " + coup);
|
||||||
plateauUI.applyLastMove(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