import java.io.*; import java.util.*; class HardPlayer extends AbstractPlayer { private FitnessFunction ff; HardPlayer(String name, FitnessFunction ff) { super(name); this.ff = ff; } HardPlayer(String name, Game game, double exponent, int maxLevel, double aggressiveness) { this(name, null); this.ff = new ExponentialFitnessFunction(game,exponent,maxLevel, aggressiveness); } public int nextMove(final Game g) { double max = -10000000; long totalTime = 0; int move = 0; for (int i=0; i max) { max = fitness; move = i; } } g.note("Move: " + move); g.note("Time: " + Util.formatTime(totalTime)); return move; } interface FitnessFunction { double decide(int move, Board b); } class ExponentialFitnessFunction implements FitnessFunction { private final double exponent; private final int maxLevel; private final double aggressiveness; private final Game game; ExponentialFitnessFunction(Game game, double exponent, int maxLevel, double aggressiveness) { this.game = game; this.exponent = exponent; this.maxLevel = maxLevel; this.aggressiveness = aggressiveness; } public double decide(int move, Board b) { if (!b.isValidMove(move)) return Double.MIN_VALUE; Board newBoard = b.clone(); newBoard.placeMove(move,HardPlayer.this); return decide(newBoard,1,game.nextPlayer(HardPlayer.this)); } private double decide(Board b, int level, Player p) { double sum = 0; if (level > maxLevel) return sum; for (int i=0; i