/**
*
*/
package de.axxeed.animosy.ai;
import org.apache.log4j.Logger;
import de.axxeed.animosy.model.BoardModel;
import de.axxeed.animosy.model.Link;
import de.axxeed.animosy.model.Manager;
import de.axxeed.animosy.model.Node;
/**
* MaxDist.java
* Created: 15.08.2008 16:45:12
* @author Markus J. Luzius
*
*/
public class MaxDist extends MrXAbstract {
private static Logger log = Logger.getLogger(MaxDist.class);
/**This method makes a move for MrX with the maximum distance to the nearest detective
* @return a random legal Node position for the MrX
* @see de.axxeed.animosy.ai.MrXInterface#getMove()
*/
public Node getMove() {
Node n=Manager.getGame().getBoard().getMrX().getPosition();
Link[] lk=n.getLinks();
int noOfNodes=lk.length;
int[] minDist = new int[noOfNodes];
int[] sumDist = new int[noOfNodes];
int minMinDist = 99;
for(int i=0;i<noOfNodes;i++) {
log.debug("Checking node "+i+" ("+lk[i].getToNode().getPosition()+") - "+BoardModel.getNode(lk[i].getToNode().getPosition()).getLinks().length);
minDist[i] = BoardModel.getDistance(lk[i].getToNode().getPosition(), Manager.getGame().getBoard().getDetectives()[0].getPosition().getPosition());
sumDist[i] = minDist[i];
log.debug(" Detective 0: "+minDist[i]);
for(int d=1;d<Manager.getOptions().getNumberOfDetectives();d++) {
int d2 = BoardModel.getDistance(lk[i].getToNode().getPosition(), Manager.getGame().getBoard().getDetectives()[d].getPosition().getPosition());
sumDist[i] += d2;
log.debug(" Detective "+d+": "+d2);
if(d2<minDist[i]) minDist[i]=d2;
}
if(minDist[i]<minMinDist) minMinDist = minDist[i];
log.debug(" minDist : "+minDist[i]+" (sumDist="+sumDist[i]+", minMinDist="+minMinDist+")");
}
int selectedLink = 0;
for(int i=1;i<noOfNodes;i++) {
if(minDist[i]<2 && minDist[selectedLink]>1) continue;
if(minDist[i]>minDist[selectedLink]+1 || minDist[selectedLink]==0) {
selectedLink = i;
continue;
}
if(minDist[selectedLink]==1 && minDist[i]>1) {
selectedLink = i;
continue;
}
if(BoardModel.getNode(lk[i].getToNode().getPosition()).getLinks().length > BoardModel.getNode(lk[selectedLink].getToNode().getPosition()).getLinks().length)
selectedLink = i;
}
/*
if(minMinDist>1) {
// detectives are far enough away: maximize the options
for(int i=1;i<noOfNodes;i++) {
if(BoardModel.getNode(lk[i].getToNode().getPosition()).getLinks().length > BoardModel.getNode(lk[selectedLink].getToNode().getPosition()).getLinks().length)
selectedLink = i;
else if(minDist[i]>minDist[selectedLink] && BoardModel.getNode(lk[i].getToNode().getPosition()).getLinks().length == BoardModel.getNode(lk[selectedLink].getToNode().getPosition()).getLinks().length)
selectedLink = i;
}
}
else {
// detectives are close: maximize the distance!
for(int i=1;i<noOfNodes;i++) {
if(minDist[i]>minDist[selectedLink])
selectedLink = i;
else if(minDist[i]==minDist[selectedLink] && sumDist[i]>sumDist[selectedLink])
selectedLink = i;
else if(minDist[i]==minDist[selectedLink] && BoardModel.getNode(lk[i].getToNode().getPosition()).getLinks().length > BoardModel.getNode(lk[selectedLink].getToNode().getPosition()).getLinks().length)
selectedLink = i;
}
}
*/
log.debug("Selected link: "+lk[selectedLink].getToNode().getPosition());
return lk[selectedLink].getToNode();
}
}