From 02a7fe387b398fcaf08ff975435eda46f85b92af Mon Sep 17 00:00:00 2001 From: cleme Date: Fri, 23 May 2025 23:32:39 +0200 Subject: [PATCH] repair en passant --- OOP_1A2_Project/bin/backend/AutoPlayer.class | Bin 4554 -> 4554 bytes OOP_1A2_Project/bin/backend/Board.class | Bin 10804 -> 12490 bytes OOP_1A2_Project/bin/backend/Move.class | Bin 8939 -> 10551 bytes OOP_1A2_Project/src/backend/AutoPlayer.java | 1 - OOP_1A2_Project/src/backend/Board.java | 123 +++++++++---- OOP_1A2_Project/src/backend/Enpassant.java | 181 ++++++++++++++++++- OOP_1A2_Project/src/backend/Move.java | 112 +++++++++--- 7 files changed, 346 insertions(+), 71 deletions(-) diff --git a/OOP_1A2_Project/bin/backend/AutoPlayer.class b/OOP_1A2_Project/bin/backend/AutoPlayer.class index ecb0d55228ede6e3bc0fa649e1bef94e87b3876f..1087ea79f1748c4bed8d243e97101cc23c043f37 100644 GIT binary patch delta 65 zcmX@5d`fwP2p^;GW>LP4jJkmg91KAWybK`>stlnFdJJILP4jJiP#91Ot>ybPfXstjQadJN$VP7DzYQ4Em`6+p6sA(~+# RkUtwJzmy?y^Jo6+i~!yk4=w-z diff --git a/OOP_1A2_Project/bin/backend/Board.class b/OOP_1A2_Project/bin/backend/Board.class index 2120a5e94d13749efc59d37a07196dfcaca31a92..adae89b6e4ffff1e9c4089ff77c41eadbbcc5401 100644 GIT binary patch literal 12490 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 z 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 L$?RGVhi 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 pieces; - private List highlightedPositions = new ArrayList<>(); + private List highlightedPositions = new ArrayList<>(); - // Changed from Stack to ArrayList for undo functionality private ArrayList boardHistory = new ArrayList<>(); private Integer selectedX = null; private Integer selectedY = null; - // Add Sound instance private Sound sound; + private Move lastMove = null; + + private Enpassant enpassantHandler; + public Board(int colNum, int lineNum) { this.width = colNum; this.height = lineNum; @@ -28,7 +30,9 @@ public class Board { this.pieces = new ArrayList<>(); this.highlightedPositions = new ArrayList<>(); this.boardHistory = new ArrayList<>(); - this.sound = new Sound(); // Initialize Sound instance + this.sound = new Sound(); + this.lastMove = null; + this.enpassantHandler = new Enpassant(this); } public int getWidth() { @@ -42,16 +46,17 @@ public class Board { public int getTurnNumber() { return turnNumber; } + public void playMove(Move move) { if (move != null && move.isValid() && !move.putsOwnKingInCheck()) { move.execute(); + this.lastMove = move; System.out.println("AI plays: " + move.getFromX() + "," + move.getFromY() + " -> " + move.getToX() + "," + move.getToY()); } else { System.out.println("Invalid AI move."); } } - public boolean isTurnWhite() { return isWhiteTurn; } @@ -93,13 +98,11 @@ public class Board { PieceType queen = PieceType.Queen; PieceType king = PieceType.King; - // All the pawns for (int x = 0; x < 8; x++) { pieces.add(new Piece(x, 1, pawn, false)); pieces.add(new Piece(x, 6, pawn, true)); } - // Black pieces pieces.add(new Piece(0, 0, rook, false)); pieces.add(new Piece(1, 0, knight, false)); pieces.add(new Piece(2, 0, bishop, false)); @@ -109,7 +112,6 @@ public class Board { pieces.add(new Piece(6, 0, knight, false)); pieces.add(new Piece(7, 0, rook, false)); - // White pieces pieces.add(new Piece(0, 7, rook, true)); pieces.add(new Piece(1, 7, knight, true)); pieces.add(new Piece(2, 7, bishop, true)); @@ -122,6 +124,7 @@ public class Board { public void cleanBoard() { pieces.clear(); + lastMove = null; } public String toString() { @@ -181,14 +184,14 @@ public class Board { Piece selectedPiece = getPieceAt(selectedX, selectedY); if (selectedPiece != null) { if (isHighlighted(x, y)) { - // SAVE STATE BEFORE MOVE saveCurrentState(); Move move = new Move(selectedX, selectedY, x, y, this); if (move.isValid()) { move.execute(); + this.lastMove = move; - sound.playMoveSound(); // Use instance method + sound.playMoveSound(); if (move.putsOpponentInCheckmate()) { System.out.println("Checkmate! " + (isWhiteTurn ? "Black" : "White") + " wins!"); @@ -215,7 +218,6 @@ public class Board { } public boolean isSelected(int x, int y) { - // Check if the selected coordinates match the given x and y if (selectedX != null && selectedY != null) { return selectedX == x && selectedY == y; } @@ -247,7 +249,9 @@ public class Board { this.height = 8; this.pieces = new ArrayList<>(); this.boardHistory = new ArrayList<>(); - this.sound = new Sound(); // Initialize Sound instance + this.sound = new Sound(); + this.lastMove = null; + this.enpassantHandler = new Enpassant(this); for (int y = 0; y < height; y++) { if (y >= array.length) { @@ -298,7 +302,7 @@ public class Board { } public boolean isHighlighted(int x, int y) { - for (Move.Position pos : highlightedPositions) { + for (Position pos : highlightedPositions) { if (pos.x == x && pos.y == y) { return true; } @@ -312,25 +316,24 @@ public class Board { this.turnNumber = board.turnNumber; this.isWhiteTurn = board.isWhiteTurn; - // Deep copy pieces this.pieces = new ArrayList<>(); for (Piece p : board.pieces) { this.pieces.add(new Piece(p.getX(), p.getY(), p.getType(), p.isWhite())); } - // Copy selection this.selectedX = board.selectedX; this.selectedY = board.selectedY; - // Copy highlighted positions this.highlightedPositions = new ArrayList<>(); this.highlightedPositions.addAll(board.highlightedPositions); - // Initialize board history for copy constructor this.boardHistory = new ArrayList<>(); - // Initialize Sound instance (don't copy the sound instance) + this.lastMove = board.lastMove; + this.sound = new Sound(); + + this.enpassantHandler = new Enpassant(this); } private void clearHighlights() { @@ -347,42 +350,47 @@ public class Board { return; } - // Get valid moves for the selected piece using the Move class Move moveHelper = new Move(selectedX, selectedY, selectedX, selectedY, this); List validMoves = moveHelper.getValidMoves(selectedPiece, this); - // Update highlighted positions + List convertedMoves = new ArrayList<>(); + for (Move.Position movePos : validMoves) { + convertedMoves.add(new Position(movePos.x, movePos.y)); + } + + if (selectedPiece.getType() == PieceType.Pawn) { + List enPassantMoves = enpassantHandler.getPossibleEnPassantMoves(selectedX, selectedY); + for (Enpassant.Position enPos : enPassantMoves) { + if (!enpassantHandler.wouldPutOwnKingInCheck(selectedX, selectedY, enPos.x, enPos.y)) { + convertedMoves.add(new Position(enPos.x, enPos.y)); + } + } + } + highlightedPositions.clear(); - highlightedPositions.addAll(validMoves); + highlightedPositions.addAll(convertedMoves); } - - // UNDO METHODS USING ARRAYLIST private void saveCurrentState() { - // Use existing copy constructor to save current board state boardHistory.add(new Board(this)); } public void undoLastMove() { if (!boardHistory.isEmpty()) { - // Get the last saved state (most recent) Board previousBoard = boardHistory.get(boardHistory.size() - 1); - // Remove it from history boardHistory.remove(boardHistory.size() - 1); - // Use existing methods to restore state this.width = previousBoard.width; this.height = previousBoard.height; this.turnNumber = previousBoard.turnNumber; this.isWhiteTurn = previousBoard.isWhiteTurn; + this.lastMove = previousBoard.lastMove; - // Use existing getPieces() method to restore pieces this.pieces.clear(); for (Piece p : previousBoard.getPieces()) { this.pieces.add(new Piece(p.getX(), p.getY(), p.getType(), p.isWhite())); } - // Clear selection and highlights selectedX = null; selectedY = null; clearHighlights(); @@ -393,13 +401,66 @@ public class Board { return !boardHistory.isEmpty(); } - // Add cleanup method to properly dispose of sound resources public void cleanup() { if (sound != null) { sound.cleanup(); } } + public boolean canCaptureEnPassant(int x, int y) { - return false; + if (lastMove == null) { + return false; + } + + Piece lastMovedPiece = getPieceAt(lastMove.getToX(), lastMove.getToY()); + if (lastMovedPiece == null || lastMovedPiece.getType() != PieceType.Pawn) { + return false; + } + + int moveDistance = Math.abs(lastMove.getToY() - lastMove.getFromY()); + if (moveDistance != 2) { + return false; + } + + int passedOverY = (lastMove.getFromY() + lastMove.getToY()) / 2; + + return x == lastMove.getToX() && y == passedOverY; + } + + public Move getLastMove() { + return lastMove; + } + + public void setLastMove(Move move) { + this.lastMove = move; + } + + public Enpassant getEnpassantHandler() { + return enpassantHandler; + } + + public class Position { + public int x; + public int y; + + public Position(int x, int y) { + this.x = x; + this.y = y; + } + + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + Position position = (Position) obj; + return x == position.x && y == position.y; + } + + public int hashCode() { + return 31 * x + y; + } + + public String toString() { + return "(" + x + ", " + y + ")"; + } } } \ No newline at end of file diff --git a/OOP_1A2_Project/src/backend/Enpassant.java b/OOP_1A2_Project/src/backend/Enpassant.java index a4fce6c..d948636 100644 --- a/OOP_1A2_Project/src/backend/Enpassant.java +++ b/OOP_1A2_Project/src/backend/Enpassant.java @@ -1,12 +1,15 @@ package backend; +import java.util.ArrayList; +import java.util.List; + public class Enpassant { private Board board; public Enpassant(Board board) { this.board = board; } - + public boolean isEnPassantValid(int fromX, int fromY, int toX, int toY) { Piece movingPiece = board.getPieceAt(fromX, fromY); @@ -14,7 +17,6 @@ public class Enpassant { return false; } - // Must be a diagonal move if (Math.abs(toX - fromX) != 1 || Math.abs(toY - fromY) != 1) { return false; } @@ -23,37 +25,159 @@ public class Enpassant { return false; } - Piece targetPawn = board.getPieceAt(toX, fromY); // Same rank as moving pawn + Piece targetPawn = board.getPieceAt(toX, fromY); if (targetPawn == null || targetPawn.getType() != PieceType.Pawn) { return false; } - // Target pawn must be opposite color if (targetPawn.isWhite() == movingPiece.isWhite()) { return false; } - return board.canCaptureEnPassant(toX, fromY); + return isLastMoveTwoSquarePawnMove(toX, fromY); + } + + public boolean isLastMoveTwoSquarePawnMove(int pawnX, int pawnY) { + Move lastMove = board.getLastMove(); + if (lastMove == null) { + return false; + } + + if (lastMove.getToX() != pawnX || lastMove.getToY() != pawnY) { + return false; + } + + Piece movedPiece = board.getPieceAt(pawnX, pawnY); + if (movedPiece == null || movedPiece.getType() != PieceType.Pawn) { + return false; + } + + int moveDistance = Math.abs(lastMove.getToY() - lastMove.getFromY()); + return moveDistance == 2; } - public void executeEnPassant(int fromX, int fromY, int toX, int toY) { + if (!isEnPassantValid(fromX, fromY, toX, toY)) { + throw new IllegalArgumentException("Mouvement en passant invalide"); + } + Piece movingPawn = board.getPieceAt(fromX, fromY); board.removePiece(toX, fromY); + board.removePiece(fromX, fromY); board.setPiece(movingPawn.isWhite(), movingPawn.getType(), toX, toY); } - + public Position getCapturedPawnPosition(int toX, int toY) { - Piece targetPawn = board.getPieceAt(toX, toY - (board.isTurnWhite() ? -1 : 1)); + Move lastMove = board.getLastMove(); + if (lastMove == null) { + return null; + } + + Piece targetPawn = board.getPieceAt(lastMove.getToX(), lastMove.getToY()); if (targetPawn != null && targetPawn.getType() == PieceType.Pawn) { - return new Position(toX, toY - (board.isTurnWhite() ? -1 : 1)); + if (Math.abs(lastMove.getToX() - toX) == 0 && Math.abs(lastMove.getToY() - toY) == 1) { + return new Position(lastMove.getToX(), lastMove.getToY()); + } } return null; } - public static class Position { + public List getPossibleEnPassantMoves(int pawnX, int pawnY) { + List enPassantMoves = new ArrayList<>(); + + Piece pawn = board.getPieceAt(pawnX, pawnY); + if (pawn == null || pawn.getType() != PieceType.Pawn) { + return enPassantMoves; + } + + int direction = pawn.isWhite() ? -1 : 1; + + for (int dx = -1; dx <= 1; dx += 2) { + int newX = pawnX + dx; + int newY = pawnY + direction; + + if (newX >= 0 && newX < board.getWidth() && + newY >= 0 && newY < board.getHeight()) { + + if (isEnPassantValid(pawnX, pawnY, newX, newY)) { + enPassantMoves.add(new Position(newX, newY)); + } + } + } + + return enPassantMoves; + } + + public boolean isOnEnPassantRank(Piece pawn) { + if (pawn == null || pawn.getType() != PieceType.Pawn) { + return false; + } + + if (pawn.isWhite()) { + return pawn.getY() == 3; + } else { + return pawn.getY() == 4; + } + } + + public boolean wouldPutOwnKingInCheck(int fromX, int fromY, int toX, int toY) { + if (!isEnPassantValid(fromX, fromY, toX, toY)) { + return true; + } + + Board tempBoard = new Board(board); + + Piece movingPawn = tempBoard.getPieceAt(fromX, fromY); + if (movingPawn == null) { + return true; + } + + tempBoard.removePiece(toX, fromY); + tempBoard.removePiece(fromX, fromY); + tempBoard.setPiece(movingPawn.isWhite(), movingPawn.getType(), toX, toY); + + Move tempMove = new Move(fromX, fromY, toX, toY, tempBoard); + return tempMove.isKingInCheck(tempBoard, movingPawn.isWhite()); + } + + public boolean canCaptureEnPassantAt(int x, int y) { + Move lastMove = board.getLastMove(); + if (lastMove == null) { + return false; + } + + Piece lastMovedPiece = board.getPieceAt(lastMove.getToX(), lastMove.getToY()); + if (lastMovedPiece == null || lastMovedPiece.getType() != PieceType.Pawn) { + return false; + } + + int moveDistance = Math.abs(lastMove.getToY() - lastMove.getFromY()); + if (moveDistance != 2) { + return false; + } + + int passedOverY = (lastMove.getFromY() + lastMove.getToY()) / 2; + return x == lastMove.getToX() && y == passedOverY; + } + + public List getAllPossibleEnPassantCaptures(boolean isWhitePlayer) { + List captures = new ArrayList<>(); + + for (Piece piece : board.getPieces()) { + if (piece.getType() == PieceType.Pawn && piece.isWhite() == isWhitePlayer) { + List enPassantMoves = getPossibleEnPassantMoves(piece.getX(), piece.getY()); + for (Position move : enPassantMoves) { + captures.add(new EnPassantMove(piece.getX(), piece.getY(), move.x, move.y)); + } + } + } + + return captures; + } + + public class Position { public int x; public int y; @@ -68,5 +192,42 @@ public class Enpassant { Position position = (Position) obj; return x == position.x && y == position.y; } + + public int hashCode() { + return 31 * x + y; + } + + public String toString() { + return "(" + x + ", " + y + ")"; + } + } + + public class EnPassantMove { + public int fromX; + public int fromY; + public int toX; + public int toY; + + public EnPassantMove(int fromX, int fromY, int toX, int toY) { + this.fromX = fromX; + this.fromY = fromY; + this.toX = toX; + this.toY = toY; + } + + public String toString() { + return "En Passant: (" + fromX + "," + fromY + ") -> (" + toX + "," + toY + ")"; + } + + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + EnPassantMove that = (EnPassantMove) obj; + return fromX == that.fromX && fromY == that.fromY && toX == that.toX && toY == that.toY; + } + + public int hashCode() { + return 31 * (31 * (31 * fromX + fromY) + toX) + toY; + } } } \ No newline at end of file diff --git a/OOP_1A2_Project/src/backend/Move.java b/OOP_1A2_Project/src/backend/Move.java index 7af41bb..a13797e 100644 --- a/OOP_1A2_Project/src/backend/Move.java +++ b/OOP_1A2_Project/src/backend/Move.java @@ -11,7 +11,8 @@ public class Move { private Piece movingPiece; private Piece capturedPiece; private Board board; - + private boolean isEnPassant = false; + private Piece enPassantCapturedPiece = null; public Move(int fromX, int fromY, int toX, int toY, Board board) { this.fromX = fromX; @@ -21,6 +22,24 @@ public class Move { this.board = board; this.movingPiece = board.getPieceAt(fromX, fromY); this.capturedPiece = board.getPieceAt(toX, toY); + + // Check if this is an en passant move + checkEnPassant(); + } + + private void checkEnPassant() { + if (movingPiece != null && movingPiece.getType() == PieceType.Pawn) { + // Utiliser la classe Enpassant pour vérifier + Enpassant enpassantHandler = board.getEnpassantHandler(); + if (enpassantHandler.isEnPassantValid(fromX, fromY, toX, toY)) { + isEnPassant = true; + // Obtenir la position du pion capturé + Enpassant.Position capturedPos = enpassantHandler.getCapturedPawnPosition(toX, toY); + if (capturedPos != null) { + enPassantCapturedPiece = board.getPieceAt(capturedPos.x, capturedPos.y); + } + } + } } public boolean isValid() { @@ -35,15 +54,21 @@ public class Move { } public void execute() { - // Remove any piece at the destination (normal capture) - if (capturedPiece != null) { - board.removePiece(toX, toY); + if (isEnPassant) { + // Utiliser la classe Enpassant pour l'exécution + Enpassant enpassantHandler = board.getEnpassantHandler(); + enpassantHandler.executeEnPassant(fromX, fromY, toX, toY); + } else { + // Normal move or capture + if (capturedPiece != null) { + board.removePiece(toX, toY); + } + + // Move the piece + board.removePiece(fromX, fromY); + board.setPiece(movingPiece.isWhite(), movingPiece.getType(), toX, toY); } - // Move the piece (remove from original position, add to new position) - board.removePiece(fromX, fromY); - board.setPiece(movingPiece.isWhite(), movingPiece.getType(), toX, toY); - // Advance turn board.advanceTurn(); } @@ -56,12 +81,16 @@ public class Move { Piece tempPiece = tempBoard.getPieceAt(fromX, fromY); if (tempPiece == null) return true; // Safety check - // Remove any piece at destination (normal capture) - tempBoard.removePiece(toX, toY); - - // Move the piece - tempBoard.removePiece(fromX, fromY); - tempBoard.setPiece(tempPiece.isWhite(), tempPiece.getType(), toX, toY); + if (isEnPassant) { + // Simulate en passant on temp board + Enpassant tempEnpassantHandler = tempBoard.getEnpassantHandler(); + tempEnpassantHandler.executeEnPassant(fromX, fromY, toX, toY); + } else { + // Normal move simulation + tempBoard.removePiece(toX, toY); + tempBoard.removePiece(fromX, fromY); + tempBoard.setPiece(tempPiece.isWhite(), tempPiece.getType(), toX, toY); + } // Check if king is in check after move return isKingInCheck(tempBoard, tempPiece.isWhite()); @@ -75,12 +104,16 @@ public class Move { Piece tempPiece = tempBoard.getPieceAt(fromX, fromY); if (tempPiece == null) return false; // Safety check - // Remove any piece at destination (normal capture) - tempBoard.removePiece(toX, toY); - - // Move the piece - tempBoard.removePiece(fromX, fromY); - tempBoard.setPiece(tempPiece.isWhite(), tempPiece.getType(), toX, toY); + if (isEnPassant) { + // Simulate en passant on temp board + Enpassant tempEnpassantHandler = tempBoard.getEnpassantHandler(); + tempEnpassantHandler.executeEnPassant(fromX, fromY, toX, toY); + } else { + // Normal move simulation + tempBoard.removePiece(toX, toY); + tempBoard.removePiece(fromX, fromY); + tempBoard.setPiece(tempPiece.isWhite(), tempPiece.getType(), toX, toY); + } // Check if opponent's king is in check after move return isKingInCheck(tempBoard, !tempPiece.isWhite()); @@ -99,12 +132,16 @@ public class Move { Piece tempPiece = tempBoard.getPieceAt(fromX, fromY); if (tempPiece == null) return false; // Safety check - // Remove any piece at destination (normal capture) - tempBoard.removePiece(toX, toY); - - // Move the piece - tempBoard.removePiece(fromX, fromY); - tempBoard.setPiece(tempPiece.isWhite(), tempPiece.getType(), toX, toY); + if (isEnPassant) { + // Simulate en passant on temp board + Enpassant tempEnpassantHandler = tempBoard.getEnpassantHandler(); + tempEnpassantHandler.executeEnPassant(fromX, fromY, toX, toY); + } else { + // Normal move simulation + tempBoard.removePiece(toX, toY); + tempBoard.removePiece(fromX, fromY); + tempBoard.setPiece(tempPiece.isWhite(), tempPiece.getType(), toX, toY); + } boolean opponentColor = !tempPiece.isWhite(); @@ -226,7 +263,7 @@ public class Move { } } - // Diagonal captures + // Diagonal captures (normal) for (int dx = -1; dx <= 1; dx += 2) { int newX = x + dx; if (newX >= 0 && newX < board.getWidth()) { @@ -237,6 +274,13 @@ public class Move { } } } + + // EN PASSANT: Ajouter les mouvements en passant en utilisant la classe Enpassant + Enpassant enpassantHandler = board.getEnpassantHandler(); + List enPassantMoves = enpassantHandler.getPossibleEnPassantMoves(x, y); + for (Enpassant.Position enPos : enPassantMoves) { + validMoves.add(new Position(enPos.x, enPos.y)); + } } private void addRookMoves(List validMoves, Piece piece, Board board) { @@ -384,10 +428,20 @@ public class Move { Position position = (Position) obj; return x == position.x && y == position.y; } + + @Override + public int hashCode() { + return 31 * x + y; + } } + + // Getters public int getFromX() { return fromX; } public int getFromY() { return fromY; } public int getToX() { return toX; } public int getToY() { return toY; } - -} + public boolean isEnPassant() { return isEnPassant; } + public Piece getMovingPiece() { return movingPiece; } + public Piece getCapturedPiece() { return capturedPiece; } + public Piece getEnPassantCapturedPiece() { return enPassantCapturedPiece; } +} \ No newline at end of file