les modifications de ARNAUD
This commit is contained in:
parent
11b6995f1e
commit
16e53cc810
|
|
@ -66,7 +66,7 @@ public class AutoPlayer {
|
|||
for (Piece piece : board.getPieces()) {
|
||||
if (piece.isWhite() != isWhite) continue;
|
||||
|
||||
ArrayList<int[]> legalMoves = board.computeLegalMoves(piece);
|
||||
ArrayList<int[]> legalMoves = board.computeLegalMovesSafe(piece);
|
||||
for (int[] move : legalMoves) {
|
||||
Piece target = getPieceAt(board, move[0], move[1]);
|
||||
Move candidate = new Move(
|
||||
|
|
@ -101,4 +101,4 @@ public class AutoPlayer {
|
|||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -17,6 +17,32 @@ public class Board {
|
|||
private int[] enPassantTarget = null;
|
||||
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) {
|
||||
|
|
@ -134,7 +160,8 @@ public class Board {
|
|||
if (clickedPiece != null && clickedPiece.isWhite() == turnWhite) {
|
||||
selectedX = x;
|
||||
selectedY = y;
|
||||
highlightedSquares = computeLegalMoves(clickedPiece);
|
||||
highlightedSquares = computeLegalMovesSafe(clickedPiece);
|
||||
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
|
@ -694,6 +721,40 @@ private boolean canCastleQueenside(boolean isWhite) {
|
|||
}
|
||||
}
|
||||
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
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -62,6 +62,14 @@ public class Game extends Thread {
|
|||
}
|
||||
if(!isAITurn()) {
|
||||
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];
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue