From 387a9c50b7af2edf790f264a06459f9f365972c9 Mon Sep 17 00:00:00 2001 From: manon Date: Wed, 7 May 2025 15:57:58 +0200 Subject: [PATCH] check and checkmate dynamics, first steps --- src/backend/Board.java | 98 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 86 insertions(+), 12 deletions(-) diff --git a/src/backend/Board.java b/src/backend/Board.java index 5430348..ff524e9 100644 --- a/src/backend/Board.java +++ b/src/backend/Board.java @@ -186,6 +186,13 @@ public class Board { if (isKingInCheck(false)) { System.out.println("Black is in check!"); } + + if (isCheckmate(true)) { + System.out.println("White is in checkmate!"); + } + if (isCheckmate(false)) { + System.out.println("Black is in checkmate!"); + } } public boolean isSelected(int x, int y) { @@ -239,8 +246,21 @@ public class Board { } public Board(Board board) { - //TODO + this.colNum = board.colNum; + this.lineNum = board.lineNum; + this.turnNumber = board.turnNumber; + this.isWhiteTurn = board.isWhiteTurn; + this.pieces = new ArrayList<>(); + for (int i = 0; i < board.pieces.size(); i++) { + Piece original = board.pieces.get(i); + Piece copy = new Piece(original.getX(), original.getY(), original.isWhite(), original.getType()); + this.pieces.add(copy); + } + + this.selectedX = -1; + this.selectedY = -1; + this.highlightedSquares = new ArrayList<>(); } public void playMove(Move move) { @@ -271,28 +291,82 @@ public class Board { public boolean isKingInCheck(boolean whiteKing) { Piece king = null; - for (Piece p : pieces) { + + for (int i = 0; i < pieces.size(); i++) { + Piece p = pieces.get(i); if (p.getType() == PieceType.King && p.isWhite() == whiteKing) { king = p; } } - - int kingX = king.getX(); - int kingY = king.getY(); - for (Piece p : pieces) { - if (p.isWhite() != whiteKing) { - ArrayList enemyMoves = getValidMoves(p); + boolean inCheck = false; - for (int[] move : enemyMoves) { - if (move[0] == kingX && move[1] == kingY) { - return true; + if (king != null) { + int kingX = king.getX(); + int kingY = king.getY(); + for (int i = 0; i < pieces.size(); i++) { + Piece p = pieces.get(i); + if (p.isWhite() != whiteKing) { + ArrayList moves = getValidMoves(p); + + for (int j = 0; j < moves.size(); j++) { + int[] move = moves.get(j); + if (move[0] == kingX && move[1] == kingY) { + inCheck = true; + } } } } } - return false; + return inCheck; + } + + public boolean isCheckmate(boolean whiteKing) { + boolean kingInCheck = isKingInCheck(whiteKing); + boolean hasEscape = false; + + if (kingInCheck) { + for (int i = 0; i < pieces.size(); i++) { + Piece piece = pieces.get(i); + + if (piece.isWhite() == whiteKing) { + ArrayList moves = getValidMoves(piece); + + for (int j = 0; j < moves.size(); j++) { + int[] move = moves.get(j); + int newX = move[0]; + int newY = move[1]; + + // Simulate the board + Board simBoard = new Board(this); + Piece simPiece = simBoard.getPieceAt(piece.getX(), piece.getY()); + Piece captured = simBoard.getPieceAt(newX, newY); + + if (captured != null) { + simBoard.getPieces().remove(captured); + } + + simPiece.setX(newX); + simPiece.setY(newY); + + boolean stillInCheck = simBoard.isKingInCheck(whiteKing); + + if (!stillInCheck) { + hasEscape = true; + } + } + } + } + } + + boolean checkmate = false; + + if (kingInCheck && !hasEscape) { + checkmate = true; + } + + return checkmate; } }