From eb254801185067fbed40eff016503987c9ce74ef Mon Sep 17 00:00:00 2001 From: "g.levassor--gentil" Date: Tue, 6 May 2025 16:30:32 +0200 Subject: [PATCH] AI autoplayer --- src/backend/AutoPlayer.java | 81 +++++++++++++++++++++++++++++++------ src/backend/Board.java | 2 +- 2 files changed, 69 insertions(+), 14 deletions(-) diff --git a/src/backend/AutoPlayer.java b/src/backend/AutoPlayer.java index a988a22..1d15d8e 100644 --- a/src/backend/AutoPlayer.java +++ b/src/backend/AutoPlayer.java @@ -1,17 +1,72 @@ package backend; +import java.util.ArrayList; + public class AutoPlayer { - - - /** - * returns the best Move to try on provided board for active player - * @param board - * @return - */ - public Move computeBestMove(Board board) { - - return null; - } - - + + public Move computeBestMove(Board board) { + ArrayList allMoves = new ArrayList<>(); + boolean isWhite = board.isTurnWhite(); + + for (Piece piece : board.getPieces()) { + if (piece.isWhite() != isWhite) continue; + ArrayList legalMoves = getLegalMoves(board, piece); + for (int[] move : legalMoves) { + Piece target = getPieceAt(board, move[0], move[1]); + Move candidate = new Move( + piece.getType(), piece.isWhite(), + piece.getX(), piece.getY(), + move[0], move[1], + target + ); + allMoves.add(candidate); + } + } + + // Evaluate moves + Move bestMove = null; + int bestScore = Integer.MIN_VALUE; + + for (Move move : allMoves) { + int score = evaluateMove(move); + if (score > bestScore) { + bestScore = score; + bestMove = move; + } + } + + return bestMove; + } + + private int evaluateMove(Move move) { + if (move.getCapturedPiece() != null) { + return pieceValue(move.getCapturedPiece().getType()); + } + return 0; + } + + private int pieceValue(PieceType type) { + switch (type) { + case Pawn: return 1; + case Knight: return 3; + case Bishop: return 3; + case Rook: return 5; + case Queen: return 9; + case King: return 100; // just in case + default: return 0; + } + } + + private ArrayList getLegalMoves(Board board, Piece piece) { + // Reuse board's internal method + // But we must simulate access: simulate selection, compute, and reset + return board.computeLegalMoves(piece); + } + + private Piece getPieceAt(Board board, int x, int y) { + for (Piece p : board.getPieces()) { + if (p.getX() == x && p.getY() == y) return p; + } + return null; + } } diff --git a/src/backend/Board.java b/src/backend/Board.java index 8c4130b..2731596 100644 --- a/src/backend/Board.java +++ b/src/backend/Board.java @@ -410,7 +410,7 @@ private boolean isEnemy(int x, int y, boolean isWhite) { return p != null && p.isWhite() != isWhite; } -private ArrayList computeLegalMoves(Piece piece) { +public ArrayList computeLegalMoves(Piece piece) { ArrayList moves = new ArrayList<>(); int x = piece.getX(); int y = piece.getY();