From 5dd5ac50ee49b200ff58379cb5bbd38c538ce4e5 Mon Sep 17 00:00:00 2001 From: romca Date: Fri, 23 May 2025 20:41:52 +0200 Subject: [PATCH] en-passant --- OOP_1A2_Project/bin/backend/Board.class | Bin 10494 -> 12153 bytes OOP_1A2_Project/bin/backend/Move.class | Bin 9924 -> 10871 bytes OOP_1A2_Project/src/backend/Board.java | 88 ++++++++++++++++++++- OOP_1A2_Project/src/backend/Enpassant.java | 69 +++++++++++++++- OOP_1A2_Project/src/backend/Move.java | 63 ++++++++++++++- OOP_1A2_Project/src/backend/Sound.java | 1 - 6 files changed, 214 insertions(+), 7 deletions(-) diff --git a/OOP_1A2_Project/bin/backend/Board.class b/OOP_1A2_Project/bin/backend/Board.class index afa6e690ecc82d0a4697c73e9fd72b6f8685c779..bdc69a0e45995001fd2885ba9788d7e85b9c26c0 100644 GIT binary patch literal 12153 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

^*Ks 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 literal 9924 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 diff --git a/OOP_1A2_Project/src/backend/Board.java b/OOP_1A2_Project/src/backend/Board.java index 000669f..328735f 100644 --- a/OOP_1A2_Project/src/backend/Board.java +++ b/OOP_1A2_Project/src/backend/Board.java @@ -20,6 +20,11 @@ public class Board { // Add Sound instance private Sound sound; + // En passant tracking + private Integer enPassantX = null; // File where en passant capture is possible + private Integer enPassantY = null; // Rank where the pawn that can be captured is located + private int enPassantTurn = -1; // Turn number when en passant became possible + public Board(int colNum, int lineNum) { this.width = colNum; this.height = lineNum; @@ -113,6 +118,7 @@ public class Board { public void cleanBoard() { pieces.clear(); + clearEnPassant(); } public String toString() { @@ -228,7 +234,13 @@ public class Board { fileRep[y] = line; } - fileRep[height] = (isWhiteTurn ? "W" : "B") + "," + turnNumber; + // Include en passant information in the file representation + String enPassantInfo = ""; + if (enPassantX != null && enPassantY != null) { + enPassantInfo = "," + enPassantX + "," + enPassantY + "," + enPassantTurn; + } + + fileRep[height] = (isWhiteTurn ? "W" : "B") + "," + turnNumber + enPassantInfo; return fileRep; } @@ -282,9 +294,23 @@ public class Board { } else { this.turnNumber = 0; } + + // Parse en passant information + if (turnData.length >= 5) { + try { + this.enPassantX = Integer.parseInt(turnData[2].trim()); + this.enPassantY = Integer.parseInt(turnData[3].trim()); + this.enPassantTurn = Integer.parseInt(turnData[4].trim()); + } catch (NumberFormatException e) { + clearEnPassant(); + } + } else { + clearEnPassant(); + } } else { this.turnNumber = 0; this.isWhiteTurn = true; + clearEnPassant(); } } @@ -317,6 +343,11 @@ public class Board { this.highlightedPositions = new ArrayList<>(); this.highlightedPositions.addAll(board.highlightedPositions); + // Copy en passant state + this.enPassantX = board.enPassantX; + this.enPassantY = board.enPassantY; + this.enPassantTurn = board.enPassantTurn; + // Initialize board history for copy constructor this.boardHistory = new ArrayList<>(); @@ -372,12 +403,15 @@ public class Board { // 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.enPassantX = previousBoard.enPassantX; + this.enPassantY = previousBoard.enPassantY; + this.enPassantTurn = previousBoard.enPassantTurn; + // Use existing getPieces() method to restore pieces this.pieces.clear(); for (Piece p : previousBoard.getPieces()) { @@ -395,10 +429,58 @@ public class Board { return !boardHistory.isEmpty(); } - // Add cleanup method to properly dispose of sound resources public void cleanup() { if (sound != null) { sound.cleanup(); } } + + public void setEnPassant(int x, int y) { + this.enPassantX = x; + this.enPassantY = y; + this.enPassantTurn = this.turnNumber; + } + + + public void clearEnPassant() { + this.enPassantX = null; + this.enPassantY = null; + this.enPassantTurn = -1; + } + + public boolean canCaptureEnPassant(int x, int y) { + // En passant is only valid for one turn after the double pawn move + if (enPassantX == null || enPassantY == null) { + return false; + } + + // Check if this is the immediate next turn + if (turnNumber != enPassantTurn + 1) { + return false; + } + + // Check if the position matches + return enPassantX == x && enPassantY == y; + } + + public void handlePawnDoubleMove(int fromX, int fromY, int toX, int toY) { + Piece pawn = getPieceAt(toX, toY); + if (pawn != null && pawn.getType() == PieceType.Pawn) { + if (Math.abs(toY - fromY) == 2) { + setEnPassant(toX, toY); + } else { + clearEnPassant(); + } + } else { + clearEnPassant(); + } + } + + + public Enpassant.Position getEnPassantTarget() { + if (enPassantX != null && enPassantY != null && canCaptureEnPassant(enPassantX, enPassantY)) { + return new Enpassant.Position(enPassantX, enPassantY); + } + return null; + } } \ 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 0de279d..a4fce6c 100644 --- a/OOP_1A2_Project/src/backend/Enpassant.java +++ b/OOP_1A2_Project/src/backend/Enpassant.java @@ -1,5 +1,72 @@ package backend; 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); + + if (movingPiece == null || movingPiece.getType() != PieceType.Pawn) { + return false; + } + + // Must be a diagonal move + if (Math.abs(toX - fromX) != 1 || Math.abs(toY - fromY) != 1) { + return false; + } + + if (board.getPieceAt(toX, toY) != null) { + return false; + } + + Piece targetPawn = board.getPieceAt(toX, fromY); // Same rank as moving pawn + 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); + } + + + public void executeEnPassant(int fromX, int fromY, int toX, int toY) { + 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)); + if (targetPawn != null && targetPawn.getType() == PieceType.Pawn) { + return new Position(toX, toY - (board.isTurnWhite() ? -1 : 1)); + } + return null; + } + + public static 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; + } + } +} \ 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 27a85cd..ada3231 100644 --- a/OOP_1A2_Project/src/backend/Move.java +++ b/OOP_1A2_Project/src/backend/Move.java @@ -17,6 +17,10 @@ public class Move { private CastlingHandler.CastlingMove castlingMove; private boolean isCastling; + // En passant-related fields + private Enpassant enpassantHandler; + private boolean isEnPassant; + public Move(int fromX, int fromY, int toX, int toY, Board board) { this.fromX = fromX; this.fromY = fromY; @@ -30,6 +34,10 @@ public class Move { this.castlingHandler = new CastlingHandler(board); this.castlingMove = castlingHandler.getCastlingMove(fromX, fromY, toX, toY); this.isCastling = (castlingMove != null); + + // Initialize en passant handler and check if this is an en passant move + this.enpassantHandler = new Enpassant(board); + this.isEnPassant = enpassantHandler.isEnPassantValid(fromX, fromY, toX, toY); } public boolean isValid() { @@ -43,6 +51,11 @@ public class Move { return castlingHandler.isCastlingValid(castlingMove); } + // Handle en passant validation + if (isEnPassant) { + return enpassantHandler.isEnPassantValid(fromX, fromY, toX, toY); + } + // Check if the move is in the list of valid moves for this piece List validMoves = getValidDestinations(movingPiece, board); return containsPosition(validMoves, new Position(toX, toY)); @@ -52,6 +65,9 @@ public class Move { if (isCastling) { // Execute castling move castlingHandler.executeCastling(castlingMove); + } else if (isEnPassant) { + // Execute en passant capture + enpassantHandler.executeEnPassant(fromX, fromY, toX, toY); } else { // Remove any piece at the destination (normal capture) if (capturedPiece != null) { @@ -63,6 +79,14 @@ public class Move { board.setPiece(movingPiece.isWhite(), movingPiece.getType(), toX, toY); } + // Handle en passant state updates for pawn moves + if (movingPiece.getType() == PieceType.Pawn && !isEnPassant) { + board.handlePawnDoubleMove(fromX, fromY, toX, toY); + } else { + // Clear en passant for non-pawn moves + board.clearEnPassant(); + } + // Advance turn board.advanceTurn(); } @@ -82,6 +106,10 @@ public class Move { if (tempCastling != null) { tempHandler.executeCastling(tempCastling); } + } else if (isEnPassant) { + // For en passant, execute the en passant capture + Enpassant tempEnpassant = new Enpassant(tempBoard); + tempEnpassant.executeEnPassant(fromX, fromY, toX, toY); } else { // Remove any piece at destination (normal capture) tempBoard.removePiece(toX, toY); @@ -111,6 +139,10 @@ public class Move { if (tempCastling != null) { tempHandler.executeCastling(tempCastling); } + } else if (isEnPassant) { + // For en passant, execute the en passant capture + Enpassant tempEnpassant = new Enpassant(tempBoard); + tempEnpassant.executeEnPassant(fromX, fromY, toX, toY); } else { // Remove any piece at destination (normal capture) tempBoard.removePiece(toX, toY); @@ -145,6 +177,10 @@ public class Move { if (tempCastling != null) { tempHandler.executeCastling(tempCastling); } + } else if (isEnPassant) { + // For en passant, execute the en passant capture + Enpassant tempEnpassant = new Enpassant(tempBoard); + tempEnpassant.executeEnPassant(fromX, fromY, toX, toY); } else { // Remove any piece at destination (normal capture) tempBoard.removePiece(toX, toY); @@ -230,7 +266,7 @@ public class Move { int y = piece.getY(); boolean isWhite = piece.isWhite(); - int direction = isWhite ? -1 : 1; // White pawns move up, black pawns move down + int direction = isWhite ? -1 : 1; // White pawns move up (decreasing y), black pawns move down (increasing y) // Forward movement int newY = y + direction; @@ -249,7 +285,7 @@ public class Move { } } - // Diagonal captures + // Diagonal captures (regular captures) for (int dx = -1; dx <= 1; dx += 2) { int newX = x + dx; if (newX >= 0 && newX < board.getWidth()) { @@ -260,6 +296,29 @@ public class Move { } } } + + // En passant captures + // Check if there's an opponent pawn adjacent to this pawn that can be captured via en passant + for (int dx = -1; dx <= 1; dx += 2) { // Check left and right + int adjacentX = x + dx; + if (adjacentX >= 0 && adjacentX < board.getWidth()) { + // Check if there's an opponent pawn at the same rank + Piece adjacentPiece = board.getPieceAt(adjacentX, y); + if (adjacentPiece != null && + adjacentPiece.getType() == PieceType.Pawn && + adjacentPiece.isWhite() != isWhite) { + + // Check if this pawn can be captured via en passant + if (board.canCaptureEnPassant(adjacentX, y)) { + // The capture square is diagonally forward from the capturing pawn + int captureY = y + direction; + if (captureY >= 0 && captureY < board.getHeight()) { + validMoves.add(new Position(adjacentX, captureY)); + } + } + } + } + } } private void addRookMoves(List validMoves, Piece piece, Board board) { diff --git a/OOP_1A2_Project/src/backend/Sound.java b/OOP_1A2_Project/src/backend/Sound.java index 641017d..a3d34ec 100644 --- a/OOP_1A2_Project/src/backend/Sound.java +++ b/OOP_1A2_Project/src/backend/Sound.java @@ -29,7 +29,6 @@ public class Sound { public void playMoveSound() { if (moveSound != null) { - // Stop the clip if it's already playing if (moveSound.isRunning()) { moveSound.stop(); }