From b08bd6477fd4be8e4eed9301c7d1067e9def4f72 Mon Sep 17 00:00:00 2001 From: cleme Date: Fri, 23 May 2025 17:05:06 +0200 Subject: [PATCH] castling --- OOP_1A2_Project/bin/.gitignore | 1 + OOP_1A2_Project/bin/backend/Move.class | Bin 8655 -> 9960 bytes OOP_1A2_Project/src/backend/Move.java | 166 +++++++++++++++---------- 3 files changed, 104 insertions(+), 63 deletions(-) diff --git a/OOP_1A2_Project/bin/.gitignore b/OOP_1A2_Project/bin/.gitignore index 6d0c385..5c7ebe3 100644 --- a/OOP_1A2_Project/bin/.gitignore +++ b/OOP_1A2_Project/bin/.gitignore @@ -1 +1,2 @@ /backend/ +/windowInterface/ diff --git a/OOP_1A2_Project/bin/backend/Move.class b/OOP_1A2_Project/bin/backend/Move.class index c8b4a21354c194dae7aecb6272d110b3b7043b2b..27a31809618ff4d9126fef1cf09dacbe2f634904 100644 GIT binary patch literal 9960 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 G+5au&^U!|) diff --git a/OOP_1A2_Project/src/backend/Move.java b/OOP_1A2_Project/src/backend/Move.java index c5cb3f9..b636b15 100644 --- a/OOP_1A2_Project/src/backend/Move.java +++ b/OOP_1A2_Project/src/backend/Move.java @@ -12,6 +12,11 @@ public class Move { private Piece capturedPiece; private Board board; + // Castling-related fields + private CastlingHandler castlingHandler; + private CastlingHandler.CastlingMove castlingMove; + private boolean isCastling; + public Move(int fromX, int fromY, int toX, int toY, Board board) { this.fromX = fromX; this.fromY = fromY; @@ -20,6 +25,11 @@ public class Move { this.board = board; this.movingPiece = board.getPieceAt(fromX, fromY); this.capturedPiece = board.getPieceAt(toX, toY); + + // Initialize castling handler and check if this is a castling move + this.castlingHandler = new CastlingHandler(board); + this.castlingMove = castlingHandler.getCastlingMove(fromX, fromY, toX, toY); + this.isCastling = (castlingMove != null); } public boolean isValid() { @@ -28,21 +38,31 @@ public class Move { return false; } + // Handle castling validation + if (isCastling) { + return castlingHandler.isCastlingValid(castlingMove); + } + // Check if the move is in the list of valid moves for this piece List validMoves = getValidDestinations(movingPiece, board); - return validMoves.contains(new Position(toX, toY)); + return containsPosition(validMoves, new Position(toX, toY)); } public void execute() { - // Remove any piece at the destination (normal capture) - if (capturedPiece != null) { - board.removePiece(toX, toY); + if (isCastling) { + // Execute castling move + castlingHandler.executeCastling(castlingMove); + } else { + // Remove any piece at the destination (normal capture) + if (capturedPiece != null) { + board.removePiece(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); } - // 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(); } @@ -55,15 +75,25 @@ 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 (isCastling) { + // For castling, we need to check the castling move specifically + CastlingHandler tempHandler = new CastlingHandler(tempBoard); + CastlingHandler.CastlingMove tempCastling = tempHandler.getCastlingMove(fromX, fromY, toX, toY); + if (tempCastling != null) { + tempHandler.executeCastling(tempCastling); + } + } else { + // 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); + } // Check if king is in check after move - return isKingInCheck(tempBoard, tempPiece.isWhite()); + CastlingHandler tempHandler = new CastlingHandler(tempBoard); + return tempHandler.isKingInCheck(tempPiece.isWhite()); } public boolean putsOpponentInCheck() { @@ -74,15 +104,25 @@ 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 (isCastling) { + // For castling, execute the castling move + CastlingHandler tempHandler = new CastlingHandler(tempBoard); + CastlingHandler.CastlingMove tempCastling = tempHandler.getCastlingMove(fromX, fromY, toX, toY); + if (tempCastling != null) { + tempHandler.executeCastling(tempCastling); + } + } else { + // 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); + } // Check if opponent's king is in check after move - return isKingInCheck(tempBoard, !tempPiece.isWhite()); + CastlingHandler tempHandler = new CastlingHandler(tempBoard); + return tempHandler.isKingInCheck(!tempPiece.isWhite()); } public boolean putsOpponentInCheckmate() { @@ -98,12 +138,21 @@ 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 (isCastling) { + // For castling, execute the castling move + CastlingHandler tempHandler = new CastlingHandler(tempBoard); + CastlingHandler.CastlingMove tempCastling = tempHandler.getCastlingMove(fromX, fromY, toX, toY); + if (tempCastling != null) { + tempHandler.executeCastling(tempCastling); + } + } else { + // 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); + } boolean opponentColor = !tempPiece.isWhite(); @@ -133,23 +182,23 @@ public class Move { switch (piece.getType()) { case Pawn: addPawnMoves(moves, piece, board); - return moves; + break; case Rook: addRookMoves(moves, piece, board); - return moves; + break; case Knight: addKnightMoves(moves, piece, board); - return moves; + break; case Bishop: addBishopMoves(moves, piece, board); - return moves; + break; case Queen: addRookMoves(moves, piece, board); addBishopMoves(moves, piece, board); - return moves; + break; case King: addKingMoves(moves, piece, board); - return moves; + break; } return moves; @@ -172,33 +221,8 @@ public class Move { } public boolean isKingInCheck(Board board, boolean isWhiteKing) { - // Find the king's position - Piece king = null; - for (Piece p : board.getPieces()) { - if (p.getType() == PieceType.King && p.isWhite() == isWhiteKing) { - king = p; - return checkIfKingUnderAttack(board, isWhiteKing, king); - } - } - - return false; - } - - private boolean checkIfKingUnderAttack(Board board, boolean isWhiteKing, Piece king) { - // Check if any opponent piece can attack the king - for (Piece p : board.getPieces()) { - if (p.isWhite() == isWhiteKing) continue; // Skip pieces of same color - - // Get raw moves without check validation - List attackMoves = getValidDestinations(p, board); - - // If any piece can move to king's position, king is in check - if (attackMoves.contains(new Position(king.getX(), king.getY()))) { - return true; - } - } - - return false; + CastlingHandler handler = new CastlingHandler(board); + return handler.isKingInCheck(isWhiteKing); } private void addPawnMoves(List validMoves, Piece piece, Board board) { @@ -347,7 +371,7 @@ public class Move { int y = piece.getY(); boolean isWhite = piece.isWhite(); - // All adjacent squares + // All adjacent squares (normal king moves) for (int dx = -1; dx <= 1; dx++) { for (int dy = -1; dy <= 1; dy++) { if (dx == 0 && dy == 0) continue; // Skip the current position @@ -365,6 +389,23 @@ public class Move { } } } + + // Add castling moves + CastlingHandler handler = new CastlingHandler(board); + List castlingPositions = handler.getCastlingPositions(piece); + for (CastlingHandler.Position castlingPos : castlingPositions) { + validMoves.add(new Position(castlingPos.x, castlingPos.y)); + } + } + + // Helper method to check if a list contains a position + private boolean containsPosition(List positions, Position target) { + for (Position pos : positions) { + if (pos.x == target.x && pos.y == target.y) { + return true; + } + } + return false; } public class Position { @@ -376,7 +417,6 @@ public class Move { this.y = y; } - @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false;