package de.tu_dresden.inf.ggp06_2.strategies; import java.util.ArrayList; import java.util.List; import de.tu_dresden.inf.ggp06_2.resolver.Atom; import de.tu_dresden.inf.ggp06_2.resolver.Const; import de.tu_dresden.inf.ggp06_2.resolver.Expression; import de.tu_dresden.inf.ggp06_2.resolver.ExpressionList; import de.tu_dresden.inf.ggp06_2.resolver.Predicate; import de.tu_dresden.inf.ggp06_2.resolver.structures.GameNode; import de.tu_dresden.inf.ggp06_2.simulator.Game; public class Mobility2 extends AbstractStrategy { public Mobility2(Game newGame, String currentRole) { super(newGame, currentRole); } @Override public Expression pickMove(GameNode node) { // get all legal moves List<ExpressionList> movesList = new ArrayList<ExpressionList>(); List<Atom> roleNames = game.getRoleNames(); for ( Atom aRole : roleNames ) { try { movesList.add( game.getLegalMoves( aRole, node.getState(), timerFlag ) ); } catch ( InterruptedException e1 ) { return new Predicate(Const.aDoes, role, Const.aNoop); } } // flatten moves for multiplayer games if ( !game.isSinglePlayer() ) { return new Predicate(Const.aDoes, role, Const.aNoop); } // calculate all next game states and the legal moves // check for the gamestate with the highest number of legal moves // we assume that at least one following state exist GameNode tmpNode = null; int current; int max = -1; ExpressionList best = movesList.get(0); for ( ExpressionList move : movesList ) { try { tmpNode = game.produceNextNode(node, move, timerFlag); } catch ( InterruptedException e ) { return best.get(0); } if ( tmpNode.getState().wasPlayed() ) continue; try { current = game.getLegalMoves( role, tmpNode.getState(), timerFlag ).size(); } catch ( InterruptedException e ) { return best.get(0); } if ( current > max ) { max = current; best = move; System.err.println("Move " + best.get(0) + " branching " + current); } } // return the move return best.get(0); } }