diff --git a/OOP_2B1_Project/src/backend/KingCheck.java b/OOP_2B1_Project/src/backend/KingCheck.java new file mode 100644 index 0000000..a42fe70 --- /dev/null +++ b/OOP_2B1_Project/src/backend/KingCheck.java @@ -0,0 +1,97 @@ +package backend; + +import java.util.ArrayList; + +public class KingCheck { + public ArrayList> getLegalMoves(Piece piece, ArrayList> board) { + ArrayList> rawMoves = piece.getPossibleMoves(board); + + ArrayList> legalMoves = new ArrayList<>(); + for (int y = 0; y < 8; y++) { + ArrayList row = new ArrayList<>(); + for (int x = 0; x < 8; x++) { + row.add(false); + } + legalMoves.add(row); + } + + for (int y = 0; y < 8; y++) { + for (int x = 0; x < 8; x++) { + if (rawMoves.get(y).get(x)) { + Move move = new Move(piece.getX(), piece.getY(), x, y); + if (isMoveSafe(board, move, piece.isWhite())) { + legalMoves.get(y).set(x, true); + } + } + } + } + + return legalMoves; + } + + private boolean isKingInCheck(ArrayList> board, boolean isWhiteTurn) { + int kingX = -1, kingY = -1; + + // Find the king + for (ArrayList row : board) { + for (Piece p : row) { + if (p != null && p.isWhite() == isWhiteTurn && p.getType() == PieceType.King) { + kingX = p.getX(); + kingY = p.getY(); + break; + } + } + } + + if (kingX == -1 || kingY == -1) { + return true; // King not found, technically in check + } + + // Check if any enemy piece can capture the king + for (ArrayList row : board) { + for (Piece p : row) { + if (p != null && p.isWhite() != isWhiteTurn) { + ArrayList> moves = p.getPossibleMoves(board); + if (moves.get(kingY).get(kingX)) { + return true; // King can be captured + } + } + } + } + + return false; // King is safe + } + + private boolean isMoveSafe(ArrayList> board, Move move, boolean isWhiteTurn) { + ArrayList> simulatedBoard = simulateMove(board, move); + return !isKingInCheck(simulatedBoard, isWhiteTurn); + } + + private ArrayList> simulateMove(ArrayList> board, Move move) { + ArrayList> newBoard = deepCopyBoard(board); + + Piece piece = newBoard.get(move.fromY).get(move.fromX); + newBoard.get(move.fromY).set(move.fromX, null); + piece.x = move.toX; + piece.y = move.toY; + newBoard.get(move.toY).set(move.toX, piece); + + return newBoard; + } + + private ArrayList> deepCopyBoard(ArrayList> original) { + ArrayList> copy = new ArrayList<>(); + for (ArrayList row : original) { + ArrayList newRow = new ArrayList<>(); + for (Piece p : row) { + if (p != null) { + newRow.add(PieceCreation.createPiece(p.getX(), p.getY(), p.getType(), p.isWhite())); + } else { + newRow.add(null); + } + } + copy.add(newRow); + } + return copy; + } +}