@@ -0,0 +1,1107 @@
+package li.seiji.minichess.player;%0A%0Aimport li.seiji.minichess.InvalidMoveException;%0Aimport li.seiji.minichess.Player;%0Aimport li.seiji.minichess.board.Board;%0Aimport li.seiji.minichess.board.State;%0Aimport li.seiji.minichess.move.Move;%0A%0Aimport java.util.List;%0Aimport java.util.concurrent.ThreadLocalRandom;%0A%0Apublic class HeuristicPlayer implements IPlayer %7B%0A%0A    @Override%0A    public void start(Player color) %7B%7D%0A%0A    @Override%0A    public Move getMove(Board board) throws InvalidMoveException %7B%0A        List%3CMove%3E possibleMoves = board.getPossibleMoves();%0A        Move bestMove = null;%0A        float bestScore = -Float.MAX_VALUE;%0A        for(Move possibleMove : possibleMoves) %7B%0A%0A            State moveResult = board.state.move(possibleMove);%0A            float score = -moveResult.calculateScore();%0A%0A            if(score %3E bestScore %7C%7C (score == bestScore && ThreadLocalRandom.current().nextBoolean())) %7B%0A                bestMove = possibleMove;%0A                bestScore = score;%0A            %7D%0A        %7D%0A%0A        return bestMove;%0A    %7D%0A%0A    @Override%0A    public void setMove(Board state, Move move) %7B%0A    %7D%0A%0A%7D%0A

Add HeuristicPlayer