package aima.core.environment.cellworld; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; /** * Artificial Intelligence A Modern Approach (3rd Edition): page 645.
*
* * A representation for the environment depicted in figure 17.1.
*
* Note: the x and y coordinates are always positive integers starting at * 1.
* Note: If looking at a rectangle - the coordinate (x=1, y=1) will be the * bottom left hand corner.
* * * @param * the type of content for the Cells in the world. * * @author Ciaran O'Reilly * @author Ravi Mohan */ public class CellWorld { private Set> cells = new LinkedHashSet>(); private Map>> cellLookup = new HashMap>>(); /** * Construct a Cell World with size xDimension * y Dimension cells, all with * their values set to a default content value. * * @param xDimension * the size of the x dimension. * @param yDimension * the size of the y dimension. * * @param defaultCellContent * the default content to assign to each cell created. */ public CellWorld(int xDimension, int yDimension, C defaultCellContent) { for (int x = 1; x <= xDimension; x++) { Map> xCol = new HashMap>(); for (int y = 1; y <= yDimension; y++) { Cell c = new Cell(x, y, defaultCellContent); cells.add(c); xCol.put(y, c); } cellLookup.put(x, xCol); } } /** * * @return all the cells in this world. */ public Set> getCells() { return cells; } /** * Determine what cell would be moved into if the specified action is * performed in the specified cell. Normally, this will be the cell adjacent * in the appropriate direction. However, if there is no cell in the * adjacent direction of the action then the outcome of the action is to * stay in the same cell as the action was performed in. * * @param s * the cell location from which the action is to be performed. * @param a * the action to perform (Up, Down, Left, or Right). * @return the Cell an agent would end up in if they performed the specified * action from the specified cell location. */ public Cell result(Cell s, CellWorldAction a) { Cell sDelta = getCellAt(a.getXResult(s.getX()), a.getYResult(s .getY())); if (null == sDelta) { // Default to no effect // (i.e. bumps back in place as no adjoining cell). sDelta = s; } return sDelta; } /** * Remove the cell at the specified location from this Cell World. This * allows you to introduce barriers into different location. * * @param x * the x dimension of the cell to be removed. * @param y * the y dimension of the cell to be removed. */ public void removeCell(int x, int y) { Map> xCol = cellLookup.get(x); if (null != xCol) { cells.remove(xCol.remove(y)); } } /** * Get the cell at the specified x and y locations. * * @param x * the x dimension of the cell to be retrieved. * @param y * the y dimension of the cell to be retrieved. * @return the cell at the specified x,y location, null if no cell exists at * this location. */ public Cell getCellAt(int x, int y) { Cell c = null; Map> xCol = cellLookup.get(x); if (null != xCol) { c = xCol.get(y); } return c; } }