check and checkmate dynamics, first steps

This commit is contained in:
manon 2025-05-07 15:57:58 +02:00
parent a3662f4561
commit 387a9c50b7
1 changed files with 86 additions and 12 deletions

View File

@ -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();
boolean inCheck = false;
for (Piece p : pieces) {
if (p.isWhite() != whiteKing) {
ArrayList<int[]> enemyMoves = getValidMoves(p);
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<int[]> moves = getValidMoves(p);
for (int[] move : enemyMoves) {
if (move[0] == kingX && move[1] == kingY) {
return true;
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<int[]> 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;
}
}