// AllPossibleMovesPlayer.java /** * * @author Sean Bridges * @version 1.0 * * The AllPossibleMovesPlayer tries every possible move, or a fraction * of the possible moves. * It makes the move that gives it the best strength. * * You can give the allPossibleMoves a number from 0 to 1, which represents * the proportion of the moves that it tries. The default is 1, try all moves. * The player will always return a move if their are moves to be made. */ public class AllPossibleMovesPlayer extends DefaultPlayer { //----------------------------------------- //instance variables private double fractionOfMovesTried = 1.0; //----------------------------------------- //constructors /** * Creates new AllPossibleMovesPlayer * * Equivalent to AllPossibleMovesPlayer(name, number, 1.0) */ public AllPossibleMovesPlayer(String name, int number) { super(name,number); } /** Creates new AllPossibleMovesPlayer * * fractionOfMovesTried represents the fraction of moves that * the player will try. Should be a double from 0 to 1. * If 0 the player will return a move at random from the * possible moves. */ public AllPossibleMovesPlayer(String name, int number, double fractionOfMovesTried) { super(name,number); this.fractionOfMovesTried = fractionOfMovesTried; } //----------------------------------------- //instance methods public void setFractionOfMovesTried(double f) { fractionOfMovesTried = f; } public double getFractionOfMovesTried() { return fractionOfMovesTried; } /** * Tries fractionOfMovesTried moves. * Throws an ArrayIndexOutOfBoundsException if the board returns * no possible moves. */ public Move getMove(Board b) { Move[] moves = b.getPossibleMoves(this); if(moves.length == 0) { System.err.println("All possibleMovesPlayer queried board, but board says no moves possible"); throw new ArrayIndexOutOfBoundsException("0 moves possible"); } int maxScore = b.getBoardStats().getMinStrength(); int maxIndex = 0; int currentScore; boolean triedOne = false; for(int i = 0; i < moves.length; i++) { if( Math.random() < fractionOfMovesTried ) { triedOne = true; if(b.move(moves[i])) { currentScore = b.getBoardStats().getStrength(this); if(currentScore > maxScore) { maxScore = currentScore; maxIndex = i; } b.undoLastMove(); } }//end if }//end for //if we havent tried any of the moves, return one at random. if(!triedOne) { return moves[ (int) (moves.length * Math.random())]; } else { return moves[maxIndex]; } }//end getMove }// end class AllPossibleMovesPlayer