package de.tu_dresden.inf.ggp06_2.strategies;
import org.apache.log4j.Logger;
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;
import de.tu_dresden.inf.ggp06_2.simulator.flags.TimerFlag;
public class Mobility extends AbstractStrategy {
private static final Logger logger = Logger.getLogger(Mobility.class);
private final Atom opponent;
public Mobility(Game game, String role){
super(game,role);
this.opponent = otherRoles[0];
}
public Mobility(Game game, String string, TimerFlag flag) {
this(game, string);
this.timerFlag = flag;
}
@Override
public Expression pickMove(GameNode gameNode) {
Expression pickedMove = null;
ExpressionList legalMoves;
try {
legalMoves = game.getLegalMoves(
role, gameNode.getState(), timerFlag );
}
catch ( InterruptedException e2 ) {
return new Predicate(Const.aDoes, role, Const.aNoop);
}
if (!legalMoves.isEmpty()){
if (logger.isTraceEnabled()){
logger.trace( "first turn moves: "+legalMoves );
}
ExpressionList aMovesList;
try {
aMovesList = game.getLegalMoves(
this.opponent, gameNode.getState(), timerFlag );
}
catch ( InterruptedException e1 ) {
return new Predicate(Const.aDoes, role, Const.aNoop);
}
Expression opponentMove = aMovesList.get( 0 );
Expression bestMove = legalMoves.get( 0 );
int mobilityRate = -1;
for (Expression aMove: legalMoves){
if (logger.isTraceEnabled()){
logger.trace( "processing move: "+aMove );
}
ExpressionList turnMoves = new ExpressionList();
turnMoves.add( aMove );
turnMoves.add( opponentMove );
GameNode nextNode = null;
try {
nextNode = game.produceNextNode(
gameNode, turnMoves, this.timerFlag );
}
catch ( InterruptedException e ) {
return bestMove;
}
if (logger.isTraceEnabled()){
logger.trace( "nextState: " + nextNode.getState() );
}
ExpressionList nextStateMovesList = null;
try {
nextStateMovesList = game.getLegalMoves(
this.opponent, nextNode.getState(), timerFlag );
}
catch ( InterruptedException e ) {
return bestMove;
}
int tmp = nextStateMovesList.size();
if (-1 == mobilityRate ||
tmp < mobilityRate) {
bestMove = aMove;
mobilityRate = tmp;
}
}
if (logger.isTraceEnabled()){
logger.trace( " dicided for: "+bestMove );
}
pickedMove = bestMove;
}
if (null == pickedMove)
return new Predicate(Const.aDoes, role, Const.aNoop);
return pickedMove ;
}
}