From d818b7d313206ddebd755ea7bf8f6bb54c98a342 Mon Sep 17 00:00:00 2001 From: thibaud Date: Wed, 21 May 2025 19:15:44 +0200 Subject: [PATCH] en passant c'est good --- src/backend/Board.java | 132 ++++++++++++++++++++++++----------------- src/backend/Move.java | 9 +++ 2 files changed, 86 insertions(+), 55 deletions(-) diff --git a/src/backend/Board.java b/src/backend/Board.java index c86a893..e54069d 100644 --- a/src/backend/Board.java +++ b/src/backend/Board.java @@ -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�ce d'origine pieces.remove(pieceToMove); - // Supprimer la pièce capturée (si elle existe) + // Supprimer la pi�ce captur�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�s�lection et surlignage off selectedX = -1; selectedY = -1; highlightedSquares.clear(); - //Mise à jour du statut d’échec après le coup + //Mise � jour du statut d��chec apr�s le coup isWhiteInCheck = isInCheck(isTurnWhite()); isCheck = isWhiteInCheck; + } @@ -375,11 +397,11 @@ public class Board { if (p.isWhite() == whiteToPlay) { ArrayList 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�gal = pas mat } } } - return true; // Roi en échec et aucun coup possible + return true; // Roi en �chec et aucun coup possible } diff --git a/src/backend/Move.java b/src/backend/Move.java index 05b6647..e7134b3 100644 --- a/src/backend/Move.java +++ b/src/backend/Move.java @@ -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; }