* @param Piece
* piece: la piece à deplacer
* @return DeplacementEtat etat: l'état du déplacement
*/
public DeplacementEtat getDeplacementEtat(Position pi, Position pf) {
Piece pieceInit = getPieceAt(pi);
if (pieceInit == null) {
return DeplacementEtat.PASDEPIECE;
}
if (!Outils.isInTheTableau(pf)) {
return DeplacementEtat.HORSDUPLATEAU;
}
if (!pieceInit.deplacementCorrect(pi, pf, pieceInit.getCouleur())) {
return DeplacementEtat.INCORRECT;
}
if (this.estDeMemeCouleur(pf, pieceInit)) {
return DeplacementEtat.DEJAOCCUPE;
}
Position before = this.getPiecePosition(pieceInit);
while (!before.equals(pf)) {
Position nextPosition = pieceInit.next(before, pf,
pieceInit.getCouleur());
if (!nextPosition.equals(pf) && getPieceAt(nextPosition) != null) {
return DeplacementEtat.COLLISION;
}
before = pieceInit.next(before, pf, pieceInit.getCouleur());
}
/***********************
* Cas spécial du pion *
* *********************/
if (pieceInit instanceof Pion) {
if (Outils.isDeplacementDiagonal(pi, pf)) {
if (getPieceAt(pf) == null)
return DeplacementEtat.INCORRECT;
} else if (getPieceAt(pf) != null)
return DeplacementEtat.INCORRECT;
}
/***************************
* Test de l'échec au roi *
***************************/
// Enregistrement des positions
Piece pieceF = getPieceAt(pf);
// simulation du déplacement
Piece pieceATester = pieceInit;
plateau.put(pf, pieceATester);
plateau.remove(pi);
if (roiEstEnDanger(getRoiPosition(pieceInit.getCouleur()))) {
// On remet comme avant quelque soit le résultat car la fonction