diff --git a/OOP_2B6_PROJECT/src/backend/Board.java b/OOP_2B6_PROJECT/src/backend/Board.java index 0ebe564..7c4c66f 100644 --- a/OOP_2B6_PROJECT/src/backend/Board.java +++ b/OOP_2B6_PROJECT/src/backend/Board.java @@ -89,6 +89,7 @@ public class Board { if (gameOver) return; Piece clickedPiece = getPieceAt(x, y); + if (selectedX == null || selectedY == null) { if (clickedPiece != null && clickedPiece.isWhite() == turnIsWhite) { selectedX = x; @@ -98,31 +99,50 @@ public class Board { } else { Piece selectedPiece = getPieceAt(selectedX, selectedY); if (selectedPiece != null && selectedPiece.isWhite() == turnIsWhite) { - Piece captured = getPieceAt(x, y); - pieces.removeIf(p -> p.getX() == x && p.getY() == y); - pieces.removeIf(p -> p.getX() == selectedX && p.getY() == selectedY); - Piece moved = new Piece( + + // simulate move + Board simulation = new Board(this); + simulation.pieces.removeIf(p -> p.getX() == selectedX && p.getY() == selectedY); + simulation.pieces.removeIf(p -> p.getX() == x && p.getY() == y); + simulation.pieces.add(new Piece( selectedPiece.isWhite(), selectedPiece.getType(), x, y - ); - pieces.add(moved); - Move move = new Move(selectedPiece, selectedX, selectedY, x, y, captured); - moveHistory.push(move); - turnNumber++; - turnIsWhite = !turnIsWhite; + )); - if (isCheckmate(!turnIsWhite)) { - gameOver = true; + // check if move is legal (king remains safe) + if (!simulation.isKingInCheck(turnIsWhite)) { + Piece captured = getPieceAt(x, y); + pieces.removeIf(p -> p.getX() == x && p.getY() == y); + pieces.removeIf(p -> p.getX() == selectedX && p.getY() == selectedY); + pieces.add(new Piece( + selectedPiece.isWhite(), + selectedPiece.getType(), + x, + y + )); + + Move move = new Move(selectedPiece, selectedX, selectedY, x, y, captured); + moveHistory.push(move); + turnNumber++; + turnIsWhite = !turnIsWhite; + + // check for checkmate on the opponent + if (isCheckmate(!turnIsWhite)) { + gameOver = true; + } } } + + // deselect in all cases selectedX = null; selectedY = null; highlightedPositions.clear(); } } + public void undoLastMove() { if (!moveHistory.isEmpty()) { Move lastMove = moveHistory.pop();