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()) {
|
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(
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
@ -695,5 +722,39 @@ 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
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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.");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue