/*
* This file is part of JGAP.
*
* JGAP offers a dual license model containing the LGPL as well as the MPL.
*
* For licensing information please see the file license.txt included with JGAP
* or have a look at the top of class org.jgap.Chromosome which representatively
* includes the JGAP license policy applicable for any file delivered with JGAP.
*/
package examples.gp.anttrail;
/**
* Holds the map of the ant trail. Important: Clone intentionally not supported
* here!
*
* @author Klaus Meffert
* @since 3.01
*/
public class AntMap {
/** String containing the CVS revision. Read out via reflection!*/
private final static String CVS_REVISION = "$Revision: 1.6 $";
// map point descriptions
public static final int ERROR = 0;
public static final int FOOD = -1;
public static final int EMPTY = 1;
public static final int TRAIL = 2;
public static final int ATE = 3;
// orientations
public static final int O_UP = 0;
public static final int O_LEFT = 1;
public static final int O_DOWN = 2;
public static final int O_RIGHT = 3;
private int m_orientation;
private int m_posx;
private int m_posy;
private int m_foodTaken;
/**
* Number of moves proceeded.
*/
private int m_moves;
/**
* Width of map.
*/
private int m_sizex;
/**
* Height of map.
*/
private int m_sizey;
/**
* Holder of the trail's map.
*/
private int[][] m_map;
/**
* For displaying moves as a..za..z etc. (idea from ECJ).
* Also see m_moveModUpper
*/
private int m_moveMod;
/**
* False: use lower case chars with m_moveMod. true: Use Upper case chars.
*/
private boolean m_moveModUpper;
/**
* Stores the moves done to display them later.
*/
private int[][] m_movementMap;
/**
* Maximum number of solutions allowed.
*/
private int m_maxMoves;
public AntMap(final int[][] a_map, int a_maxMoves) {
m_sizex = a_map.length;
m_sizey = a_map[0].length;
m_map = new int[m_sizex][m_sizey];
for (int x = 0; x < m_sizex; x++) {
m_map[x] = (int[]) (a_map[x].clone());
}
m_movementMap = new int[m_sizex][m_sizey];/**@todo speedup possible by using string?*/
m_orientation = O_RIGHT;
m_posx = 0;
m_posy = 0;
m_moveMod = 0;
m_moveModUpper = false;
m_maxMoves = a_maxMoves;
storeMove();
m_moves = 0;
}
public int[][] getMap() {
return m_map;
}
public int getFromMap(int a_x, int a_y) {
return m_map[a_x][a_y];
}
// public void setInMap(int a_x, int a_y, int a_value) {
// m_map[a_x][a_y] = a_value;
// }
public int getPosX() {
return m_posx;
}
public int getPosY() {
return m_posy;
}
public void setPosX(int a_value) {
m_posx = a_value;
storeMove();
checkFoodTaken();
}
public void setPosY(int a_value) {
m_posy = a_value;
storeMove();
checkFoodTaken();
}
private void storeMove() {
char c;
if (!m_moveModUpper) {
c = (char) (m_moveMod + 'a');
if (m_moveMod++ >= 25) {
m_moveMod = 0;
m_moveModUpper = true;
}
}
else {
c = (char) (m_moveMod + 'A');
if (m_moveMod++ >= 25) {
m_moveMod = 0;
m_moveModUpper = false;
}
}
m_movementMap[m_posx][m_posy] = c;
}
public int[][] getMovements() {
return m_movementMap;
}
private void checkFoodTaken() {
if (m_map[m_posx][m_posy] == AntMap.FOOD) {
m_foodTaken++;
m_map[m_posx][m_posy] = AntMap.ATE;
}
else {
// Do nothing.
// -----------
}
}
public int getOrientation() {
return m_orientation;
}
public void setOrientation(int a_orientation) {
m_orientation = a_orientation;
}
public int getFoodTaken() {
return m_foodTaken;
}
public int getMoveCount() {
return m_moves;
}
public void IncrementMoveCounter() {
m_moves++;
if (m_moves > m_maxMoves) {
throw new IllegalStateException("Maximum number of moves exceeded");
}
}
public int getWidth() {
return m_sizex;
}
public int getHeight() {
return m_sizey;
}
}