diff --git a/OOP_2B1_Project/src/backend/AutoPlayer.java b/OOP_2B1_Project/src/backend/AutoPlayer.java index a0c2857..97dd4dc 100644 --- a/OOP_2B1_Project/src/backend/AutoPlayer.java +++ b/OOP_2B1_Project/src/backend/AutoPlayer.java @@ -10,29 +10,25 @@ public class AutoPlayer { * @return */ public Move computeBestMove(Board board) { - - List moves = board.getAllLegalMoves(board.isTurnWhite()); - Move bestMove = null; - int bestScore = Integer.MIN_VALUE; + List moves = board.getAllLegalMoves(board.isTurnWhite()); + Move bestMove = null; + int bestScore = Integer.MIN_VALUE; - for (Move move : moves) { - //Board simulated = board.clone(); // or a light way to "undo" after move - //TODO : FIX THE CLONING!!!!! - Board simulated = board; - simulated.playMove(move); + for (Move move : moves) { + Board simulated = board.clone(); // Clone the board + simulated.playMove(move); - int score = evaluate(simulated, board.isTurnWhite()); + int score = evaluate(simulated, board.isTurnWhite()); - if (score > bestScore) { - bestScore = score; - bestMove = move; - } - } + if (score > bestScore) { + bestScore = score; + bestMove = move; + } + } - return bestMove; + return bestMove; } - private int evaluate(Board board, boolean forWhite) { int score = 0; for (Piece piece : board.getAllPieces()) { diff --git a/OOP_2B1_Project/src/backend/Board.java b/OOP_2B1_Project/src/backend/Board.java index 72f0298..4220868 100644 --- a/OOP_2B1_Project/src/backend/Board.java +++ b/OOP_2B1_Project/src/backend/Board.java @@ -2,7 +2,7 @@ package backend; import java.util.ArrayList; -public class Board { +public class Board implements Cloneable { @@ -292,10 +292,45 @@ private ArrayList highlightedPositions = new ArrayList<>(); } public void playMove(Move move) { - //TODO + Piece pieceToMove = getPieceAt(move.getFromCol(), move.getFromRow()); + if (pieceToMove != null) { + Piece pieceAtDestination = getPieceAt(move.getToCol(), move.getToRow()); + if (pieceAtDestination != null) { + pieces.remove(pieceAtDestination); + } + pieces.remove(pieceToMove); + // Create a new instance of the specific piece type + Piece newPiece; + switch (pieceToMove.getType()) { + case Pawn: + newPiece = new Pawn(pieceToMove.isWhite(), move.getToCol(), move.getToRow()); + break; + case King: + newPiece = new King(pieceToMove.isWhite(), move.getToCol(), move.getToRow()); + break; + case Queen: + newPiece = new Queen(pieceToMove.isWhite(), move.getToCol(), move.getToRow()); + break; + case Rook: + newPiece = new Rook(pieceToMove.isWhite(), move.getToCol(), move.getToRow()); + break; + case Bishop: + newPiece = new Bishop(pieceToMove.isWhite(), move.getToCol(), move.getToRow()); + break; + case Knight: + newPiece = new Knight(pieceToMove.isWhite(), move.getToCol(), move.getToRow()); + break; + default: + throw new IllegalArgumentException("Unknown piece type"); + } + pieces.add(newPiece); + + turnNumber++; + turnIsWhite = !turnIsWhite; + } } - + public ArrayList getAllLegalMoves(boolean isWhite) { ArrayList moves = new ArrayList<>(); @@ -329,4 +364,29 @@ public ArrayList getAllPieces() { public boolean isInBounds(int row, int col) { return row >= 0 && row < 8 && col >= 0 && col < 8; } + + +@Override +public Board clone() { + try { + Board clonedBoard = (Board) super.clone(); + + // Deep copy the pieces list + clonedBoard.pieces = new ArrayList<>(); + for (Piece piece : this.pieces) { + clonedBoard.pieces.add(piece.clone()); + } + + // Copy other fields as necessary + clonedBoard.selectedX = this.selectedX; + clonedBoard.selectedY = this.selectedY; + clonedBoard.turnNumber = this.turnNumber; + clonedBoard.turnIsWhite = this.turnIsWhite; + + return clonedBoard; + } catch (CloneNotSupportedException e) { + throw new AssertionError(); // Should never happen + } + } +} \ No newline at end of file