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 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();
}
}
@ -282,13 +295,21 @@ 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
}

View File

@ -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; }