From b076a378718dfa517b354b37bc4491a2ac72f966 Mon Sep 17 00:00:00 2001 From: Marleen Peterson Date: Fri, 9 May 2025 10:10:20 +0200 Subject: [PATCH] adding castling --- src/backend/Board.java | 47 ++++++++++++++++++++++------ src/backend/Castling.java | 65 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 9 deletions(-) create mode 100644 src/backend/Castling.java diff --git a/src/backend/Board.java b/src/backend/Board.java index 029276c..a728040 100644 --- a/src/backend/Board.java +++ b/src/backend/Board.java @@ -23,6 +23,16 @@ public class Board { this.lineNum = lineNum; this.board = new Piece[lineNum][colNum]; } + + public Set getAllMoves(boolean isWhite) { + Set allMoves = new HashSet<>(); + for (Piece piece : getPieces()) { + if (piece.isWhite() == isWhite) { + allMoves.addAll(getValidMoves(piece, true)); + } + } + return allMoves; + } public int getWidth() { return colNum; @@ -119,15 +129,25 @@ public class Board { selectedPiece = p; highlightedPositions = getValidMoves(p); } - } else { - if (highlightedPositions.contains(x + "," + y)) { - movePiece(selectedPiece.getX(), selectedPiece.getY(), x, y); - isWhiteTurn = !isWhiteTurn; - turnNumber++; - } - selectedPiece = null; - highlightedPositions.clear(); - } + } + else { + String targetPos = x + "," + y; + if (highlightedPositions.contains(targetPos)) { + if (selectedPiece.getType() == PieceType.King && Math.abs(x - selectedPiece.getX()) == 2) { + // Castling move + Castling castlingHandler = new Castling(this); + int rookX = (x > selectedPiece.getX()) ? 7 : 0; + castlingHandler.performCastle(selectedPiece, rookX, y); + } else { + // Normal move + movePiece(selectedPiece.getX(), selectedPiece.getY(), x, y); + } + isWhiteTurn = !isWhiteTurn; + turnNumber++; + } + selectedPiece = null; + highlightedPositions.clear(); + } } public boolean isSelected(int x, int y) { @@ -264,6 +284,15 @@ public class Board { } } } + + Castling castlingHandler = new Castling(this); + for (int rookX : new int[]{0, 7}) { + if (castlingHandler.canCastle(piece, rookX, y)) { + int newKingX = (rookX > x) ? x + 2 : x - 2; + validMoves.add(newKingX + "," + y); + } + } + break; } diff --git a/src/backend/Castling.java b/src/backend/Castling.java new file mode 100644 index 0000000..cf09d80 --- /dev/null +++ b/src/backend/Castling.java @@ -0,0 +1,65 @@ +package backend; + +import java.util.Set; + +public class Castling { + + private Board board; + + public Castling(Board board) { + this.board = board; + } + + public boolean canCastle(Piece king, int rookX, int rookY) { + if (king.getType() != PieceType.King) return false; + if (king.isWhite() != board.isTurnWhite()) return false; + + int kingY = king.getY(); + int kingX = king.getX(); + + Piece rook = board.getBoardMatrix()[rookY][rookX]; + if (rook == null || rook.getType() != PieceType.Rook) return false; + if (rook.isWhite() != king.isWhite()) return false; + + if (isPathClear(kingX, rookX, kingY) && !isInCheck(king)) { + int direction = (rookX > kingX) ? 1 : -1; + for (int i = 1; i <= 2; i++) { + int x = kingX + (i * direction); + Piece tempKing = new Piece(x, kingY, PieceType.King, king.isWhite()); + if (isInCheck(tempKing)) { + return false; + } + } + return true; + } + return false; + } + + private boolean isPathClear(int startX, int endX, int y) { + int step = (endX > startX) ? 1 : -1; + for (int x = startX + step; x != endX; x += step) { + if (board.getBoardMatrix()[y][x] != null) return false; + } + return true; + } + + private boolean isInCheck(Piece king) { + Set opponentMoves = board.getAllMoves(!king.isWhite()); + String kingPos = king.getX() + "," + king.getY(); + return opponentMoves.contains(kingPos); + } + + public void performCastle(Piece king, int rookX, int rookY) { + if (!canCastle(king, rookX, rookY)) return; + + int kingY = king.getY(); + int kingX = king.getX(); + int direction = (rookX > kingX) ? 1 : -1; + + int newKingX = kingX + (2 * direction); + int newRookX = kingX + direction; + + board.movePiece(kingX, kingY, newKingX, kingY); + board.movePiece(rookX, rookY, newRookX, kingY); + } +} \ No newline at end of file