diff --git a/src/backend/GameResult.java b/src/backend/GameResult.java index 4347ff8..5a2e069 100644 --- a/src/backend/GameResult.java +++ b/src/backend/GameResult.java @@ -6,6 +6,7 @@ public class GameResult { private boolean whiteWon = false; private boolean blackWon = false; private String message = ""; + private VictoryChecker victoryChecker = new VictoryChecker(); // Checks for game victory after a move is made public GameResult checkForVictory(Board board) { @@ -13,22 +14,22 @@ public class GameResult { if (gameOver) { return this; } - + // Check if White has won - if (VictoryChecker.checkVictory(board, true)) { + if (victoryChecker.checkVictory(board, true)) { gameOver = true; whiteWon = true; message = "White wins by checkmate!"; System.out.println(message); } // Check if Black has won - else if (VictoryChecker.checkVictory(board, false)) { + else if (victoryChecker.checkVictory(board, false)) { gameOver = true; blackWon = true; message = "Black wins by checkmate!"; System.out.println(message); } - + return this; } @@ -47,8 +48,8 @@ public class GameResult { public String getMessage() { return message; } - - // Reset the game result to start a new game + + // Reset the game result to start a new game public void reset() { gameOver = false; whiteWon = false; diff --git a/src/backend/VictoryChecker.java b/src/backend/VictoryChecker.java index c649af6..20e9cb6 100644 --- a/src/backend/VictoryChecker.java +++ b/src/backend/VictoryChecker.java @@ -4,26 +4,14 @@ import java.util.ArrayList; public class VictoryChecker { - // For debugging - private static final boolean DEBUG = true; - // Check if a player has won the chess game via checkmate - - public static boolean checkVictory(Board board, boolean isWhitePlayer) { + public boolean checkVictory(Board board, boolean isWhitePlayer) { // The opponent is the one who would be checkmated so opposite color boolean opponentColor = !isWhitePlayer; - // Debug info - if (DEBUG) { - System.out.println("Checking if " + (isWhitePlayer ? "White" : "Black") + " has won..."); - } - // Find the opponent's king int[] kingPosition = findKingPosition(board, opponentColor); if (kingPosition == null) { - if (DEBUG) { - System.err.println((opponentColor ? "White" : "Black") + " king not found on the board!"); - } // If opponent's king is not on board, the player has won return true; } @@ -31,43 +19,24 @@ public class VictoryChecker { // Check if opponent's king is in check boolean kingInCheck = isKingInCheck(board, opponentColor, kingPosition); if (!kingInCheck) { - if (DEBUG) { - System.out.println((opponentColor ? "White" : "Black") + " king is not in check, no checkmate."); - } return false; } - if (DEBUG) { - System.out.println((opponentColor ? "White" : "Black") + " king is in check."); - } - // Check if opponent has any legal moves left boolean hasLegalMoves = hasLegalMoves(board, opponentColor); if (hasLegalMoves) { - if (DEBUG) { - System.out.println((opponentColor ? "White" : "Black") + " has legal moves available, no checkmate."); - } return false; } // If the king is in check and there are no legal moves, it's checkmate - if (DEBUG) { - System.out.println("CHECKMATE! " + (isWhitePlayer ? "White" : "Black") + " wins!"); - } return true; } - //Determine if a player's king is in check - - private static boolean isKingInCheck(Board board, boolean isWhite, int[] kingPosition) { + // Determine if a player's king is in check + private boolean isKingInCheck(Board board, boolean isWhite, int[] kingPosition) { // Get all opponent pieces boolean opponentColor = !isWhite; - if (DEBUG) { - System.out.println("Checking if " + (isWhite ? "White" : "Black") + - " king at [" + kingPosition[0] + "," + kingPosition[1] + "] is in check"); - } - for (Piece piece : board.getPieces()) { if (piece.isWhite() == opponentColor) { // Get valid moves for this opponent piece @@ -76,10 +45,6 @@ public class VictoryChecker { for (int[] move : validMoves) { // If the move targets the king's position, the king is in check if (move[0] == kingPosition[0] && move[1] == kingPosition[1]) { - if (DEBUG) { - System.out.println("King is attacked by " + piece.getType() + - " at [" + piece.getX() + "," + piece.getY() + "]"); - } return true; } } @@ -89,35 +54,19 @@ public class VictoryChecker { return false; } - //Find the position of a player's king on the board - private static int[] findKingPosition(Board board, boolean isWhite) { - if (DEBUG) { - System.out.println("Looking for " + (isWhite ? "White" : "Black") + " king"); - } - + // Find the position of a player's king on the board + private int[] findKingPosition(Board board, boolean isWhite) { for (Piece piece : board.getPieces()) { if (piece.getType() == PieceType.King && piece.isWhite() == isWhite) { - if (DEBUG) { - System.out.println("Found king at [" + piece.getX() + "," + piece.getY() + "]"); - } return new int[] {piece.getX(), piece.getY()}; } } - if (DEBUG) { - System.err.println((isWhite ? "White" : "Black") + " king not found!"); - } return null; } // Check if a player has any legal moves available - private static boolean hasLegalMoves(Board board, boolean isWhite) { - if (DEBUG) { - System.out.println("Checking if " + (isWhite ? "White" : "Black") + " has any legal moves"); - } - - int legalMovesCount = 0; - + private boolean hasLegalMoves(Board board, boolean isWhite) { // For each piece of the player for (Piece piece : board.getPieces()) { if (piece.isWhite() == isWhite) { @@ -127,36 +76,21 @@ public class VictoryChecker { for (int[] move : validMoves) { // Check if this move would still leave the king in check if (isLegalMoveWithoutCheck(board, piece, move[0], move[1], isWhite)) { - legalMovesCount++; - if (DEBUG) { - System.out.println("Legal move found: " + piece.getType() + - " from [" + piece.getX() + "," + piece.getY() + "] to [" + - move[0] + "," + move[1] + "]"); - // We found at least one legal move, can return early - return true; - } + // We found at least one legal move, can return early + return true; } } } } - if (DEBUG) { - System.out.println("Total legal moves found: " + legalMovesCount); - } - - return legalMovesCount > 0; + return false; } // Check if a move is legal considering check rules - private static boolean isLegalMoveWithoutCheck(Board board, Piece piece, int toX, int toY, boolean isWhite) { + private boolean isLegalMoveWithoutCheck(Board board, Piece piece, int toX, int toY, boolean isWhite) { int fromX = piece.getX(); int fromY = piece.getY(); - if (DEBUG) { - System.out.println("Testing move: " + piece.getType() + - " from [" + fromX + "," + fromY + "] to [" + toX + "," + toY + "]"); - } - // Create a copy of the board to simulate the move Board simulatedBoard = new Board(board); @@ -167,20 +101,12 @@ public class VictoryChecker { int[] kingPos = findKingPosition(simulatedBoard, isWhite); if (kingPos == null) { // This shouldn't happen unless the moved piece was the king and it was captured somehow - if (DEBUG) { - System.err.println("King disappeared after simulated move!"); - } return false; } // Check if the king is in check after the move boolean kingInCheck = isKingInCheck(simulatedBoard, isWhite, kingPos); - if (DEBUG && !kingInCheck) { - System.out.println("Move is legal (doesn't leave king in check)"); - } - return !kingInCheck; } - } \ No newline at end of file