diff --git a/src/backend/AutoPlayer.java b/src/backend/AutoPlayer.java index ffb0a19..e7a3779 100644 --- a/src/backend/AutoPlayer.java +++ b/src/backend/AutoPlayer.java @@ -1,6 +1,8 @@ package backend; + import java.util.ArrayList; import java.util.Random; + public class AutoPlayer { private Random rand = new Random(); @@ -12,26 +14,74 @@ public class AutoPlayer { */ public Move computeBestMove(Board board) { ArrayList allMoves = new ArrayList<>(); + Move bestMove = null; + int bestScore = Integer.MIN_VALUE; + + //Detect Ai's color + boolean aiIsWhite = board.isTurnWhite(); + //Go through all pieces on the board for(Piece piece : board.getPieces()) { //only choose the active color's piece if(piece.isWhite() == board.isTurnWhite()) { //Get valid moves for this piece ArrayList validMoves = board.getValidMoves(piece); + //convert each position into a move object for (int[] dest : validMoves) { + Board simulatedBoard = new Board(board);//copy the board first + Piece simpiece = simulatedBoard.board[piece.getY()][piece.getX()]; //get matching piece in the copied board Move move = new Move(piece, dest[0], dest[1]); - allMoves.add(move); + simulatedBoard.playMove(move); + + int score = evaluate(simulatedBoard, aiIsWhite); + + if (score > bestScore) { + bestScore = score; + bestMove = new Move(piece, dest[0], dest[1]);//use original piece for + } } } } - //Pick a random move from the list - if (!allMoves.isEmpty()) { - return allMoves.get(rand.nextInt(allMoves.size())); - - } - return null; + return bestMove; } - - + //Helper method to score a board state + private int evaluate(Board board, boolean aiIsWhite) { + int score = 0; + + for (Piece p : board.getPieces()) { + int value = 0; + + switch (p.getType()) { + case Pawn: + value = 1; + break; + case Knight: + case Bishop: + value = 3; + break; + case Rook: + value = 5; + break; + case Queen: + value = 9; + break; + case King: + value = 1000; + break; + } + + //Add value if iit's current turnn's color, subtract if opponent + if (p.isWhite() == aiIsWhite) { + score += value; + } + else { + score -= value; + } + } + return score; } +} + + +