check mate
This commit is contained in:
parent
cd24b5d2e9
commit
6d2b83ec21
|
|
@ -353,3 +353,187 @@ public class Board {
|
|||
}
|
||||
|
||||
|
||||
//Add these methods to your Board class
|
||||
|
||||
/**
|
||||
* Checks if the king of the specified color is in check
|
||||
* @param isWhiteKing true if checking for white king, false for black king
|
||||
* @return true if the king is in check, false otherwise
|
||||
*/
|
||||
public boolean isKingInCheck(boolean isWhiteKing) {
|
||||
// First, find the king
|
||||
Piece king = null;
|
||||
for (Piece p : pieces) {
|
||||
if (p.getType() == PieceType.King && p.isWhite() == isWhiteKing) {
|
||||
king = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (king == null) {
|
||||
return false; // No king found (shouldn't happen in a valid game)
|
||||
}
|
||||
|
||||
// Check if any opponent piece can capture the king
|
||||
for (Piece p : pieces) {
|
||||
if (p.isWhite() != isWhiteKing) { // Opponent's piece
|
||||
ArrayList<int[]> moves = computeLegalMoves(p);
|
||||
for (int[] move : moves) {
|
||||
if (move[0] == king.getX() && move[1] == king.getY()) {
|
||||
return true; // King is in check
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isCheckmate() {
|
||||
boolean currentPlayerIsWhite = isTurnWhite();
|
||||
|
||||
// First, check if the king is in check
|
||||
if (!isKingInCheck(currentPlayerIsWhite)) {
|
||||
return false; // Not in check, so definitely not in checkmate
|
||||
}
|
||||
|
||||
// Try every possible move for the current player
|
||||
for (Piece p : pieces) {
|
||||
if (p.isWhite() == currentPlayerIsWhite) {
|
||||
ArrayList<int[]> moves = computeLegalMoves(p);
|
||||
for (int[] move : moves) {
|
||||
// Create a copy of the board and try the move
|
||||
Board tempBoard = new Board(this);
|
||||
|
||||
// Create and play the move
|
||||
Piece capturedPiece = null;
|
||||
for (Piece target : tempBoard.getPieces()) {
|
||||
if (target.getX() == move[0] && target.getY() == move[1]) {
|
||||
capturedPiece = target;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Move testMove = new Move(
|
||||
p.getX(), p.getY(),
|
||||
move[0], move[1],
|
||||
p.isWhite(), p.getType(),
|
||||
capturedPiece
|
||||
);
|
||||
|
||||
tempBoard.playMove(testMove);
|
||||
|
||||
// Check if the king is still in check after the move
|
||||
if (!tempBoard.isKingInCheck(currentPlayerIsWhite)) {
|
||||
return false; // Found a move that escapes check
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If we've tried all moves and none escape check, it's checkmate
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Modified userTouch method to check for checkmate after each move
|
||||
*/
|
||||
public void userTouch(int x, int y) {
|
||||
Piece clickedPiece = getPieceAt(x, y);
|
||||
// No selection yet
|
||||
if (selectedX == null || selectedY == null) {
|
||||
if (clickedPiece != null && clickedPiece.isWhite() == isWhiteTurn) {
|
||||
selectedX = x;
|
||||
selectedY = y;
|
||||
highlightedSquares = computeLegalMoves(clickedPiece);
|
||||
}
|
||||
return;
|
||||
}
|
||||
// Click again to unselect
|
||||
if (selectedX == x && selectedY == y) {
|
||||
selectedX = null;
|
||||
selectedY = null;
|
||||
highlightedSquares.clear();
|
||||
return;
|
||||
}
|
||||
// Try to move
|
||||
for (int[] move : highlightedSquares) {
|
||||
if (move[0] == x && move[1] == y) {
|
||||
Piece selectedPiece = getPieceAt(selectedX, selectedY);
|
||||
Piece captured = getPieceAt(x, y);
|
||||
// Store move for undo
|
||||
Move m = new Move(
|
||||
selectedX, selectedY, x, y,
|
||||
selectedPiece.isWhite(), selectedPiece.getType(), captured
|
||||
);
|
||||
moveHistory.push(m);
|
||||
removePieceAt(x, y); // capture
|
||||
removePieceAt(selectedX, selectedY);
|
||||
pieces.add(new Piece(x, y, selectedPiece.isWhite(), selectedPiece.getType()));
|
||||
turnNumber++;
|
||||
isWhiteTurn = !isWhiteTurn;
|
||||
|
||||
// Check for checkmate after the move
|
||||
if (isCheckmate()) {
|
||||
// Use a JOptionPane to show a popup message
|
||||
javax.swing.JOptionPane.showMessageDialog(
|
||||
null,
|
||||
(isWhiteTurn ? "Black" : "White") + " wins by checkmate!",
|
||||
"Checkmate",
|
||||
javax.swing.JOptionPane.INFORMATION_MESSAGE
|
||||
);
|
||||
}
|
||||
// Also check if the opponent's king is in check (but not checkmate)
|
||||
else if (isKingInCheck(isWhiteTurn)) {
|
||||
javax.swing.JOptionPane.showMessageDialog(
|
||||
null,
|
||||
"Check!",
|
||||
"Check",
|
||||
javax.swing.JOptionPane.INFORMATION_MESSAGE
|
||||
);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
selectedX = null;
|
||||
selectedY = null;
|
||||
highlightedSquares.clear();
|
||||
}
|
||||
|
||||
public void playMove(Move move) {
|
||||
if (move == null) return;
|
||||
// Store move for undo
|
||||
moveHistory.push(move);
|
||||
// Remove captured piece if any
|
||||
if (move.getCapturedPiece() != null) {
|
||||
removePieceAt(move.getToX(), move.getToY());
|
||||
}
|
||||
// Remove piece from original position
|
||||
removePieceAt(move.getFromX(), move.getFromY());
|
||||
// Add piece to new position
|
||||
pieces.add(new Piece(move.getToX(), move.getToY(), move.isWhite(), move.getType()));
|
||||
// Update turn
|
||||
turnNumber++;
|
||||
isWhiteTurn = !isWhiteTurn;
|
||||
|
||||
// Check for checkmate after the move
|
||||
if (isCheckmate()) {
|
||||
// Use a JOptionPane to show a popup message
|
||||
javax.swing.JOptionPane.showMessageDialog(
|
||||
null,
|
||||
(isWhiteTurn ? "Black" : "White") + " wins by checkmate!",
|
||||
"Checkmate",
|
||||
javax.swing.JOptionPane.INFORMATION_MESSAGE
|
||||
);
|
||||
}
|
||||
// Also check if the opponent's king is in check (but not checkmate)
|
||||
else if (isKingInCheck(isWhiteTurn)) {
|
||||
javax.swing.JOptionPane.showMessageDialog(
|
||||
null,
|
||||
"Check!",
|
||||
"Check",
|
||||
javax.swing.JOptionPane.INFORMATION_MESSAGE
|
||||
);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue