en passant c'est good

This commit is contained in:
thibaud 2025-05-21 19:15:44 +02:00
parent 2b3ebc3ef1
commit d818b7d313
2 changed files with 86 additions and 55 deletions

View File

@ -15,7 +15,6 @@ public class Board {
private boolean isCheck = false; private boolean isCheck = false;
private boolean isWhiteInCheck = false; private boolean isWhiteInCheck = false;
public Board(int colNum, int lineNum) { public Board(int colNum, int lineNum) {
this.width = colNum; this.width = colNum;
this.height = lineNum; this.height = lineNum;
@ -103,66 +102,80 @@ public class Board {
public void userTouch(int x, int y) { public void userTouch(int x, int y) {
Piece clickedPiece = getPieceAt(x, y); Piece clickedPiece = getPieceAt(x, y);
// Aucune sélection active // Step 1: No selection active select a piece
if (selectedX == -1 && selectedY == -1) { if (selectedX == -1 && selectedY == -1) {
if (clickedPiece != null && clickedPiece.isWhite() == isTurnWhite()) { if (clickedPiece != null && clickedPiece.isWhite() == isTurnWhite()) {
// Sélection de la pièce
selectedX = x; selectedX = x;
selectedY = y; selectedY = y;
// Calcul des déplacements valides
highlightedSquares = Move.getPossibleMoves(this, clickedPiece); highlightedSquares = Move.getPossibleMoves(this, clickedPiece);
} }
return;
} }
// Une pièce est déjà sélectionnée // Step 2: Clicking again on selected square cancel selection
else { if (x == selectedX && y == selectedY) {
// Si on clique à nouveau sur la case sélectionnée => on annule selectedX = -1;
if (x == selectedX && y == selectedY) { selectedY = -1;
selectedX = -1; highlightedSquares.clear();
selectedY = -1; return;
highlightedSquares.clear(); }
}
// Sinon on tente de bouger la pièce sélectionnée vers (x, y) // Step 3: Try to move selected piece to (x, y)
else { Piece selectedPiece = getPieceAt(selectedX, selectedY);
Piece selectedPiece = getPieceAt(selectedX, selectedY); if (selectedPiece != null && selectedPiece.isWhite() == isTurnWhite()) {
if (selectedPiece != null && selectedPiece.isWhite() == isTurnWhite()) { // Check if destination is valid
// Est-ce une destination valide ? boolean valid = false;
boolean valid = false; for (int[] move : highlightedSquares) {
for (int[] move : highlightedSquares) { if (move[0] == x && move[1] == y) {
if (move[0] == x && move[1] == y) { valid = true;
valid = true; break;
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();
} }
} }
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) { public void playMove(Move move) {
if (move == null) return; 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()); Piece pieceToMove = getPieceAt(move.getFromX(), move.getFromY());
if (pieceToMove == null) return; if (pieceToMove == null) return;
// Supprimer la pièce d'origine // Supprimer la pi<EFBFBD>ce d'origine
pieces.remove(pieceToMove); 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()); Piece captured = getPieceAt(move.getToX(), move.getToY());
if (captured != null) { if (captured != null) {
pieces.remove(captured); pieces.remove(captured);
@ -309,14 +330,15 @@ public class Board {
// Fin de tour // Fin de tour
turnNumber++; turnNumber++;
// Désélection et surlignage off // D<EFBFBD>s<EFBFBD>lection et surlignage off
selectedX = -1; selectedX = -1;
selectedY = -1; selectedY = -1;
highlightedSquares.clear(); 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()); isWhiteInCheck = isInCheck(isTurnWhite());
isCheck = isWhiteInCheck; isCheck = isWhiteInCheck;
} }
@ -375,11 +397,11 @@ public class Board {
if (p.isWhite() == whiteToPlay) { if (p.isWhite() == whiteToPlay) {
ArrayList<int[]> legalMoves = Move.getPossibleMoves(this, p); ArrayList<int[]> legalMoves = Move.getPossibleMoves(this, p);
if (!legalMoves.isEmpty()) { 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
} }

View File

@ -7,6 +7,7 @@ public class Move {
private int fromX, fromY; private int fromX, fromY;
private int toX, toY; private int toX, toY;
private Piece capturedPiece; private Piece capturedPiece;
private boolean enPassant;
public Move(Piece movedPiece, int fromX, int fromY, int toX, int toY, Piece capturedPiece) { public Move(Piece movedPiece, int fromX, int fromY, int toX, int toY, Piece capturedPiece) {
this.movedPiece = movedPiece; this.movedPiece = movedPiece;
@ -15,6 +16,14 @@ public class Move {
this.toX = toX; this.toX = toX;
this.toY = toY; this.toY = toY;
this.capturedPiece = capturedPiece; 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; } public Piece getMovedPiece() { return movedPiece; }