1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| public boolean marqueRoiEchec() {
boolean mat=false;
Couleur couleurAdverse=couleurControle.couleurAdverse();
Position positionRoiJoue = e.getPosition(Roi.class, couleurControle);
List<Deplacement> menaceechec=chercheEchec(positionRoiJoue, couleurAdverse);
if ( !menaceechec.isEmpty() ) {
// le roi est en echec
// il est possiblement mat
mat=true;
Roi roi=(Roi) e.getCase(positionRoiJoue).getPiece();
// si le roi peut bouger vers une case non menacée, il n'est pas mat
for(int dx=-1; dx<=1; dx++) {
for(int dy=-1; dy<=1; dy++) {
if ( dx==0 && dy==0 ) continue; // le roi ne bouge pas
Position nouvellePositionRoi=positionRoiJoue.position(dx, dy);
if (nouvellePositionRoi.getColonne()<0 || nouvellePositionRoi.getColonne()>7
|| nouvellePositionRoi.getLigne()<0 || nouvellePositionRoi.getLigne()>7 ) {
// on est en dehors de l'echiquier, on ignore
continue;
}
Deplacement simuleDeplacementRoi=new Deplacement(positionRoiJoue, nouvellePositionRoi);
if ( roi.estValide(simuleDeplacementRoi) && e.cheminPossible(simuleDeplacementRoi) && !e.captureParUnPionPossible(simuleDeplacementRoi)) {
List<Deplacement> menaceechecnouvelleposition=chercheEchec(nouvellePositionRoi, couleurAdverse);
if ( menaceechecnouvelleposition.isEmpty() ) {
// il y a au moins une case vers laquelle le roi peut se déplacer
// il n'y a pas mat
mat=false;
break; // c'est pas la peine de continuer à chercher
}
}
}
}
if ( mat && menaceechec.size()==1 ) {
// une seule pièce menace le roi
// si cette pièce peut être mangé par une pièce du joueur courant, alors il n'y a pas echec et mat
// on cherche si une pièce peut prendre la pièce
if ( peutEtrePrise(menaceechec.get(0).getDepart())) {
// la pièce qui menace le roi peut être prise
mat=false;
}
else {
// sinon si une pièce du joueur en echec peut bloquer la pièce qui menace le roi n'est pas amt
// ... faire ce test (moins facile)
}
}
else {
// si une pièce du joueur en echec peut se placer (ou prendre une pièce adverse) de manière à ce que le roi
// ne soit plus en echec, il n'a pas mat
// ... faire ce test (le plus complexe des tests à faire)
}
}
return mat;
}
private boolean peutEtrePrise(Position positionPiece) {
Piece piece=e.getCase(positionPiece).getPiece();
if (piece==null) return false;// pas de pièce sur la position
Couleur couleurAdverse=piece.getCouleur().couleurAdverse();
for(int colonne=0; colonne<8;colonne++) {
for(int ligne=0; ligne<8;ligne++) {
if (e.getCase(colonne,ligne).estOccupe(couleurAdverse)){
Deplacement simuleDeplacement=new Deplacement(new Position(colonne, ligne),positionPiece);
if ((e.getCase(colonne,ligne).getPiece().estValide(simuleDeplacement) && e.cheminPossible(simuleDeplacement)) || e.captureParUnPionPossible(simuleDeplacement)){
return true;
}
}
}
}
return false;
}
private List<Deplacement> chercheEchec(Position positionRoiJoue, Couleur couleurAdverse) {
List<Deplacement> menaceechec=new ArrayList<Deplacement>();
for(int colonne=0; colonne<8;colonne++) {
for(int ligne=0; ligne<8;ligne++) {
if (e.getCase(colonne,ligne).estOccupe(couleurAdverse)){
Deplacement simuleDeplacementEchec=new Deplacement(new Position(colonne, ligne),positionRoiJoue);
if ((e.getCase(colonne,ligne).getPiece().estValide(simuleDeplacementEchec) && e.cheminPossible(simuleDeplacementEchec)) || e.captureParUnPionPossible(simuleDeplacementEchec)){
tab[positionRoiJoue.getColonne()][positionRoiJoue.getLigne()].setCoupPossible(CoupPossible.echec);
menaceechec.add(simuleDeplacementEchec);
}
}
}
}
return menaceechec;
} |