Modification AutoPlayer and Board(PlayMove)

This commit is contained in:
Tilman Crosetti 2025-05-13 15:36:02 +02:00
parent c666978058
commit d72eaae67a
2 changed files with 76 additions and 20 deletions

View File

@ -10,29 +10,25 @@ public class AutoPlayer {
* @return
*/
public Move computeBestMove(Board board) {
List<Move> moves = board.getAllLegalMoves(board.isTurnWhite());
Move bestMove = null;
int bestScore = Integer.MIN_VALUE;
List<Move> 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()) {

View File

@ -2,7 +2,7 @@ package backend;
import java.util.ArrayList;
public class Board {
public class Board implements Cloneable {
@ -292,10 +292,45 @@ private ArrayList<int[]> 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<Move> getAllLegalMoves(boolean isWhite) {
ArrayList<Move> moves = new ArrayList<>();
@ -329,4 +364,29 @@ public ArrayList<Piece> 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
}
}
}