From f28e0e3af9943ab852cb05449749a5f5813c0eed Mon Sep 17 00:00:00 2001 From: clara Date: Tue, 13 May 2025 15:36:51 +0200 Subject: [PATCH] Merge branch 'master' of https://gitarero.ecam.fr/louise.berteloot/OOP_2A5_Project --- clara.txt | 10 ++--- src/backend/Board.java | 92 +++++++++++++----------------------------- 2 files changed, 33 insertions(+), 69 deletions(-) diff --git a/clara.txt b/clara.txt index 1c220f7..a1a3838 100644 --- a/clara.txt +++ b/clara.txt @@ -1,5 +1,5 @@ -2 -true +1 +false Rook,0,0,false Knight,1,0,false Bishop,2,0,false @@ -13,14 +13,14 @@ Pawn,1,1,false Pawn,2,1,false Pawn,3,1,false Pawn,4,1,false -Pawn,5,2,false +Pawn,5,1,false Pawn,6,1,false Pawn,7,1,false Pawn,0,6,true Pawn,1,6,true -Pawn,2,6,true +Pawn,2,4,true Pawn,3,6,true -Pawn,4,4,true +Pawn,4,6,true Pawn,5,6,true Pawn,6,6,true Pawn,7,6,true diff --git a/src/backend/Board.java b/src/backend/Board.java index d6c1148..373adbe 100644 --- a/src/backend/Board.java +++ b/src/backend/Board.java @@ -2,6 +2,7 @@ package backend; import java.util.ArrayList; + public class Board { private int colNum; private int lineNum; @@ -12,11 +13,14 @@ public class Board { private int selectedY = -1; ArrayList highlightedSquares = new ArrayList<>(); + private ArrayList previousStates; + public Board(int colNum, int lineNum) { this.colNum = colNum; this.lineNum = lineNum; this.turnNumber = 0; this.isWhiteTurn = true; // White starts first + this.previousStates = new ArrayList<>(); // Initialize the ArrayList } public int getWidth() { @@ -140,7 +144,7 @@ public class Board { System.out.println("Selecting piece at: " + x + ", " + y); selectedX = x; selectedY = y; - highlightedSquares = getValidMoves(clickedPiece, true); + highlightedSquares = getValidMoves(clickedPiece); System.out.println("Valid moves highlighted for selected piece."); } else { System.out.println("No valid piece to select at: " + x + ", " + y); @@ -259,7 +263,7 @@ public class Board { } public void undoLastMove() { - //TODO + } @@ -286,67 +290,25 @@ public class Board { } - public ArrayList getValidMoves(Piece piece, boolean filterKingCheck) { - MoveConditions moveHelper = new MoveConditions(piece, this); - ArrayList rawMoves = new ArrayList<>(); - - if (piece.getType() == PieceType.Pawn) { - rawMoves = moveHelper.getPawnMoves(); - } else if (piece.getType() == PieceType.Knight) { - rawMoves = moveHelper.getKnightMoves(); - } else if (piece.getType() == PieceType.Rook) { - rawMoves = moveHelper.getRookMoves(); - } else if (piece.getType() == PieceType.Bishop) { - rawMoves = moveHelper.getBishopMoves(); - } else if (piece.getType() == PieceType.Queen) { - rawMoves = moveHelper.getQueenMoves(); - } else if (piece.getType() == PieceType.King) { - return moveHelper.getKingMoves(); // Already safe-filtered - } - - if (!filterKingCheck) { - return rawMoves; // No filtering if we're in a check-check - } - - ArrayList legalMoves = new ArrayList<>(); - - for (int i = 0; i < rawMoves.size(); i++) { - int[] move = rawMoves.get(i); - int newX = move[0]; - int newY = move[1]; - - Board simBoard = new Board(this); - Piece simPiece = null; - - for (int j = 0; j < simBoard.getPieces().size(); j++) { - Piece p = simBoard.getPieces().get(j); - if (p.getX() == piece.getX() && p.getY() == piece.getY() - && p.getType() == piece.getType() - && p.isWhite() == piece.isWhite()) { - simPiece = p; - } - } - - if (simPiece != null) { - Piece captured = simBoard.getPieceAt(newX, newY); - if (captured != null) { - simBoard.getPieces().remove(captured); - } - - simPiece.setX(newX); - simPiece.setY(newY); - - if (!simBoard.isKingInCheck(piece.isWhite())) { - legalMoves.add(new int[]{newX, newY}); - } - } - } - - return legalMoves; - } - public ArrayList getValidMoves(Piece piece) { - return getValidMoves(piece, true); // Default to safe mode + MoveConditions moveHelper = new MoveConditions(piece, this); + + switch (piece.getType()) { + case Pawn: + return moveHelper.getPawnMoves(); + case Knight: + return moveHelper.getKnightMoves(); + case Rook: + return moveHelper.getRookMoves(); + case Bishop: + return moveHelper.getBishopMoves(); + case Queen: + return moveHelper.getQueenMoves(); + case King: + return moveHelper.getKingMoves(); + default: + return new ArrayList<>(); + } } public boolean isKingInCheck(boolean whiteKing) { @@ -368,7 +330,7 @@ public class Board { for (int i = 0; i < pieces.size(); i++) { Piece p = pieces.get(i); if (p.isWhite() != whiteKing && p.getType() != PieceType.King) { - ArrayList moves = getValidMoves(p, false); + ArrayList moves = getValidMoves(p); for (int j = 0; j < moves.size(); j++) { int[] move = moves.get(j); @@ -387,15 +349,17 @@ public class Board { boolean kingInCheck = isKingInCheck(whiteKing); boolean hasEscape = false; + // 1. If the king is not in check, it's never checkmate if (!kingInCheck) { return false; } + // 2. Try every possible move of every piece belonging to the checked side for (int i = 0; i < pieces.size(); i++) { Piece piece = pieces.get(i); if (piece.isWhite() == whiteKing) { - ArrayList rawMoves = getValidMoves(piece, false); + ArrayList rawMoves = getValidMoves(piece); for (int j = 0; j < rawMoves.size(); j++) { int[] move = rawMoves.get(j);