en passant c'est good
This commit is contained in:
parent
2b3ebc3ef1
commit
d818b7d313
|
|
@ -15,7 +15,6 @@ public class Board {
|
|||
private boolean isCheck = false;
|
||||
private boolean isWhiteInCheck = false;
|
||||
|
||||
|
||||
public Board(int colNum, int lineNum) {
|
||||
this.width = colNum;
|
||||
this.height = lineNum;
|
||||
|
|
@ -103,66 +102,80 @@ public class Board {
|
|||
public void userTouch(int x, int y) {
|
||||
Piece clickedPiece = getPieceAt(x, y);
|
||||
|
||||
// Aucune sélection active
|
||||
// Step 1: No selection active → select a piece
|
||||
if (selectedX == -1 && selectedY == -1) {
|
||||
if (clickedPiece != null && clickedPiece.isWhite() == isTurnWhite()) {
|
||||
// Sélection de la pièce
|
||||
selectedX = x;
|
||||
selectedY = y;
|
||||
|
||||
// Calcul des déplacements valides
|
||||
highlightedSquares = Move.getPossibleMoves(this, clickedPiece);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Une pièce est déjà sélectionnée
|
||||
else {
|
||||
// Si on clique à nouveau sur la case sélectionnée => on annule
|
||||
if (x == selectedX && y == selectedY) {
|
||||
selectedX = -1;
|
||||
selectedY = -1;
|
||||
highlightedSquares.clear();
|
||||
}
|
||||
// Step 2: Clicking again on selected square → cancel selection
|
||||
if (x == selectedX && y == selectedY) {
|
||||
selectedX = -1;
|
||||
selectedY = -1;
|
||||
highlightedSquares.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
// Sinon on tente de bouger la pièce sélectionnée vers (x, y)
|
||||
else {
|
||||
Piece selectedPiece = getPieceAt(selectedX, selectedY);
|
||||
// Step 3: Try to move selected piece to (x, y)
|
||||
Piece selectedPiece = getPieceAt(selectedX, selectedY);
|
||||
if (selectedPiece != null && selectedPiece.isWhite() == isTurnWhite()) {
|
||||
|
||||
if (selectedPiece != null && selectedPiece.isWhite() == isTurnWhite()) {
|
||||
// Est-ce une destination valide ?
|
||||
boolean valid = false;
|
||||
for (int[] move : highlightedSquares) {
|
||||
if (move[0] == x && move[1] == y) {
|
||||
valid = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (valid) {
|
||||
Piece destPiece = getPieceAt(x, y);
|
||||
|
||||
// Enregistrer le coup dans l'historique
|
||||
Move move = new Move(selectedPiece, selectedX, selectedY, x, y, destPiece);
|
||||
moveHistory.add(move);
|
||||
|
||||
// Appliquer le déplacement
|
||||
pieces.remove(selectedPiece);
|
||||
if (destPiece != null) pieces.remove(destPiece);
|
||||
pieces.add(new Piece(selectedPiece.getType(), selectedPiece.isWhite(), x, y));
|
||||
|
||||
turnNumber++;
|
||||
|
||||
//Mise à jour du statut d’échec après le coup
|
||||
isWhiteInCheck = isInCheck(isTurnWhite());
|
||||
isCheck = isWhiteInCheck;
|
||||
}
|
||||
|
||||
// Dans tous les cas, on désélectionne
|
||||
selectedX = -1;
|
||||
selectedY = -1;
|
||||
highlightedSquares.clear();
|
||||
// Check if destination is valid
|
||||
boolean valid = false;
|
||||
for (int[] move : highlightedSquares) {
|
||||
if (move[0] == x && move[1] == y) {
|
||||
valid = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (valid) {
|
||||
Piece destPiece = getPieceAt(x, y);
|
||||
Move move = new Move(selectedPiece, selectedX, selectedY, x, y, destPiece);
|
||||
|
||||
// 🔍 En Passant Detection
|
||||
if (selectedPiece.getType() == PieceType.Pawn && destPiece == null) {
|
||||
if (selectedX != x && selectedY != y) {
|
||||
Move last = getLastMove();
|
||||
if (last != null && last.getMovedPiece().getType() == PieceType.Pawn
|
||||
&& Math.abs(last.getFromY() - last.getToY()) == 2
|
||||
&& last.getToX() == x && last.getToY() == selectedY) {
|
||||
move.setEnPassant(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Record move
|
||||
moveHistory.add(move);
|
||||
|
||||
// Apply move
|
||||
pieces.remove(selectedPiece);
|
||||
if (move.isEnPassant()) {
|
||||
int dir = selectedPiece.isWhite() ? 1 : -1;
|
||||
Piece capturedPawn = getPieceAt(x, y + dir);
|
||||
if (capturedPawn != null) {
|
||||
pieces.remove(capturedPawn);
|
||||
}
|
||||
} else if (destPiece != null) {
|
||||
pieces.remove(destPiece);
|
||||
}
|
||||
pieces.add(new Piece(selectedPiece.getType(), selectedPiece.isWhite(), x, y));
|
||||
|
||||
turnNumber++;
|
||||
|
||||
// Update check status
|
||||
isWhiteInCheck = isInCheck(isTurnWhite());
|
||||
isCheck = isWhiteInCheck;
|
||||
}
|
||||
|
||||
// Deselect in all cases
|
||||
selectedX = -1;
|
||||
selectedY = -1;
|
||||
highlightedSquares.clear();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -281,14 +294,22 @@ public class Board {
|
|||
|
||||
public void playMove(Move move) {
|
||||
if (move == null) return;
|
||||
|
||||
if (move.isEnPassant()) {
|
||||
int direction = move.getMovedPiece().isWhite() ? 1 : -1;
|
||||
Piece capturedPawn = getPieceAt(move.getToX(), move.getToY() + direction);
|
||||
if (capturedPawn != null) {
|
||||
pieces.remove(capturedPawn);
|
||||
}
|
||||
}
|
||||
|
||||
Piece pieceToMove = getPieceAt(move.getFromX(), move.getFromY());
|
||||
if (pieceToMove == null) return;
|
||||
|
||||
// Supprimer la pièce d'origine
|
||||
// Supprimer la pi<EFBFBD>ce d'origine
|
||||
pieces.remove(pieceToMove);
|
||||
|
||||
// Supprimer la pièce capturée (si elle existe)
|
||||
// Supprimer la pi<EFBFBD>ce captur<EFBFBD>e (si elle existe)
|
||||
Piece captured = getPieceAt(move.getToX(), move.getToY());
|
||||
if (captured != null) {
|
||||
pieces.remove(captured);
|
||||
|
|
@ -309,14 +330,15 @@ public class Board {
|
|||
// Fin de tour
|
||||
turnNumber++;
|
||||
|
||||
// Désélection et surlignage off
|
||||
// D<EFBFBD>s<EFBFBD>lection et surlignage off
|
||||
selectedX = -1;
|
||||
selectedY = -1;
|
||||
highlightedSquares.clear();
|
||||
|
||||
//Mise à jour du statut d’échec après le coup
|
||||
//Mise <EFBFBD> jour du statut d<EFBFBD><EFBFBD>chec apr<EFBFBD>s le coup
|
||||
isWhiteInCheck = isInCheck(isTurnWhite());
|
||||
isCheck = isWhiteInCheck;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -375,11 +397,11 @@ public class Board {
|
|||
if (p.isWhite() == whiteToPlay) {
|
||||
ArrayList<int[]> legalMoves = Move.getPossibleMoves(this, p);
|
||||
if (!legalMoves.isEmpty()) {
|
||||
return false; // Au moins un coup légal = pas mat
|
||||
return false; // Au moins un coup l<EFBFBD>gal = pas mat
|
||||
}
|
||||
}
|
||||
}
|
||||
return true; // Roi en échec et aucun coup possible
|
||||
return true; // Roi en <EFBFBD>chec et aucun coup possible
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ public class Move {
|
|||
private int fromX, fromY;
|
||||
private int toX, toY;
|
||||
private Piece capturedPiece;
|
||||
private boolean enPassant;
|
||||
|
||||
public Move(Piece movedPiece, int fromX, int fromY, int toX, int toY, Piece capturedPiece) {
|
||||
this.movedPiece = movedPiece;
|
||||
|
|
@ -15,6 +16,14 @@ public class Move {
|
|||
this.toX = toX;
|
||||
this.toY = toY;
|
||||
this.capturedPiece = capturedPiece;
|
||||
this.enPassant = false; // default
|
||||
}
|
||||
|
||||
public boolean isEnPassant() {
|
||||
return enPassant;
|
||||
}
|
||||
public void setEnPassant(boolean enPassant) {
|
||||
this.enPassant = enPassant;
|
||||
}
|
||||
|
||||
public Piece getMovedPiece() { return movedPiece; }
|
||||
|
|
|
|||
Loading…
Reference in New Issue