c'est bon!!! Libération

This commit is contained in:
thibaud 2025-05-13 15:06:09 +02:00
parent 1d66174191
commit 6b3740960c
2 changed files with 98 additions and 0 deletions

View File

@ -310,4 +310,42 @@ public class Board {
return null;
}
public Move getLastMove() {
if (moveHistory.isEmpty()) return null;
return moveHistory.get(moveHistory.size() - 1);
}
/**
* Returns true if the given sides king is under attack.
*/
public boolean isInCheck(boolean white) {
// 1) find that king
Piece king = null;
for (Piece p : pieces) {
if (p.getType() == PieceType.King && p.isWhite() == white) {
king = p;
break;
}
}
if (king == null) return false; // no king on board?
int kx = king.getX(), ky = king.getY();
// 2) see if any *enemy* piece has a legal move onto the king
for (Piece p : pieces) {
if (p.isWhite() != white) {
// we use Move.getPossibleMoves(...) which now *filters* out moves that leave
// that pieces own king in checkso we need a raw unfiltered list instead.
ArrayList<int[]> attacks = Move.getAllPseudoLegalMoves(this, p);
for (int[] m : attacks) {
if (m[0] == kx && m[1] == ky) {
return true;
}
}
}
}
return false;
}
}

View File

@ -180,4 +180,64 @@ public class Move {
private static boolean isInsideBoard(Board b,int x,int y){
return x>=0 && x<b.getWidth() && y>=0 && y<b.getHeight();
}
/**
* Returns all pseudo-legal moves for this piece,
* i.e. exactly the same code you had in your original
* getPossibleMoves before you added the check-filter.
*/
public static ArrayList<int[]> getAllPseudoLegalMoves(Board board, Piece piece) {
ArrayList<int[]> moves = new ArrayList<>();
int x = piece.getX(), y = piece.getY();
switch (piece.getType()) {
case Pawn:
// EXACTLY the same pawn logic you already had (including *NOT* flagging hasMoved,
// but you can include en passant here if you like)
addPawnMoves(board, piece, moves);
break;
case Rook:
addLinearMoves(board, piece, moves, new int[][]{{1,0},{-1,0},{0,1},{0,-1}});
break;
case Bishop:
addLinearMoves(board, piece, moves, new int[][]{{1,1},{1,-1},{-1,1},{-1,-1}});
break;
case Queen:
addLinearMoves(board, piece, moves, new int[][]{
{1,0},{-1,0},{0,1},{0,-1},
{1,1},{1,-1},{-1,1},{-1,-1}
});
break;
case King:
// **RAW** king moves: only onesquare steps, no castling
for (int dx = -1; dx <= 1; dx++) {
for (int dy = -1; dy <= 1; dy++) {
if (dx == 0 && dy == 0) continue;
int nx = x + dx, ny = y + dy;
if (isInsideBoard(board, nx, ny)) {
Piece p = board.getPieceAt(nx, ny);
if (p == null || p.isWhite() != piece.isWhite()) {
moves.add(new int[]{nx, ny});
}
}
}
}
break;
case Knight:
// same as before
int[][] d = {{1,2},{2,1},{-1,2},{-2,1},{1,-2},{2,-1},{-1,-2},{-2,-1}};
for (int[] dd : d) {
int nx = x + dd[0], ny = y + dd[1];
if (isInsideBoard(board, nx, ny)) {
Piece p = board.getPieceAt(nx, ny);
if (p == null || p.isWhite() != piece.isWhite()) {
moves.add(new int[]{nx, ny});
}
}
}
break;
}
return moves;
}
}