les modifications de ARNAUD

This commit is contained in:
HP 2025-05-23 00:15:40 +02:00
parent 11b6995f1e
commit 16e53cc810
3 changed files with 74 additions and 5 deletions

View File

@ -66,7 +66,7 @@ public class AutoPlayer {
for (Piece piece : board.getPieces()) { for (Piece piece : board.getPieces()) {
if (piece.isWhite() != isWhite) continue; if (piece.isWhite() != isWhite) continue;
ArrayList<int[]> legalMoves = board.computeLegalMoves(piece); ArrayList<int[]> legalMoves = board.computeLegalMovesSafe(piece);
for (int[] move : legalMoves) { for (int[] move : legalMoves) {
Piece target = getPieceAt(board, move[0], move[1]); Piece target = getPieceAt(board, move[0], move[1]);
Move candidate = new Move( Move candidate = new Move(
@ -101,4 +101,4 @@ public class AutoPlayer {
} }
return null; return null;
} }
} }

View File

@ -17,6 +17,32 @@ public class Board {
private int[] enPassantTarget = null; private int[] enPassantTarget = null;
private GameSoundManager soundManager; private GameSoundManager soundManager;
public ArrayList<int[]> computeLegalMovesSafe(Piece piece) {
ArrayList<int[]> rawMoves = computeLegalMoves(piece); // All pseudo-legal moves
ArrayList<int[]> safeMoves = new ArrayList<>();
for (int[] move : rawMoves) {
Board copy = new Board(this); // Deep copy the board
Piece simulatedPiece = copy.getPieceAt(piece.getX(), piece.getY());
if (simulatedPiece != null) {
copy.playMove(new Move(
simulatedPiece.getType(),
simulatedPiece.isWhite(),
simulatedPiece.getX(), simulatedPiece.getY(),
move[0], move[1],
copy.getPieceAt(move[0], move[1])
));
if (!copy.isKingInCheck(piece.isWhite())) {
safeMoves.add(move); // Keep only if king is safe
}
}
}
return safeMoves;
}
public Board(int colNum, int lineNum) { public Board(int colNum, int lineNum) {
@ -134,7 +160,8 @@ public class Board {
if (clickedPiece != null && clickedPiece.isWhite() == turnWhite) { if (clickedPiece != null && clickedPiece.isWhite() == turnWhite) {
selectedX = x; selectedX = x;
selectedY = y; selectedY = y;
highlightedSquares = computeLegalMoves(clickedPiece); highlightedSquares = computeLegalMovesSafe(clickedPiece);
} }
return; return;
} }
@ -694,6 +721,40 @@ private boolean canCastleQueenside(boolean isWhite) {
} }
} }
return moves; return moves;
} }
} public boolean isCheckmate(boolean isWhite) {
if (!isKingInCheck(isWhite)) {
return false; // King is not in check not checkmate
}
for (Piece p : pieces) {
if (p.isWhite() == isWhite) {
ArrayList<int[]> moves = computeLegalMoves(p);
if (!moves.isEmpty()) {
return false; // At least one legal move available not checkmate
}
}
}
return true; // King is in check AND no legal moves checkmate
}
public boolean isStalemate(boolean isWhite) {
if (isKingInCheck(isWhite)) {
return false; // Still in danger not stalemate
}
for (Piece p : pieces) {
if (p.isWhite() == isWhite) {
ArrayList<int[]> moves = computeLegalMoves(p);
if (!moves.isEmpty()) {
return false;
}
}
}
return true; // King not in check but has no legal moves stalemate
}
}

View File

@ -62,6 +62,14 @@ public class Game extends Thread {
} }
if(!isAITurn()) { if(!isAITurn()) {
board.userTouch(x, y); board.userTouch(x, y);
if (board.isCheckmate(!board.isTurnWhite())) {
System.out.println((!board.isTurnWhite() ? "White" : "Black") + " is checkmated. Game over!");
} else if (board.isStalemate(!board.isTurnWhite())) {
System.out.println("Stalemate! It's a draw.");
}
} }
} }
@ -107,4 +115,4 @@ public class Game extends Thread {
this.activationAIFlags[isWhite?1:0] = !this.activationAIFlags[isWhite?1:0]; this.activationAIFlags[isWhite?1:0] = !this.activationAIFlags[isWhite?1:0];
} }
} }