/*
* This file is part of MazeSolver.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Copyright (c) 2014 MazeSolver
* Sergio M. Afonso Fumero <theSkatrak@gmail.com>
* Kevin I. Robayna Hernández <kevinirobaynahdez@gmail.com>
*/
/**
* @file MazeCell.java
* @date 21/10/2014
*/
package es.ull.mazesolver.maze;
import java.io.Serializable;
import es.ull.mazesolver.util.Direction;
/**
* Clase que representa una celda del laberinto.
*/
public class MazeCell implements Serializable {
private static final long serialVersionUID = 4328443829621010840L;
private short m_cell;
/**
* Constructor por defecto. La celda creada está rodeada de muros.
*/
public MazeCell () {
m_cell |= Direction.UP.val;
m_cell |= Direction.DOWN.val;
m_cell |= Direction.RIGHT.val;
m_cell |= Direction.LEFT.val;
}
/**
* Cambia el estado de la dirección especificada. Si no había muro, ahora lo
* hay y viceversa.
*
* @param dir
* Lado de la celda que se quiere modificar.
*/
public void toggleWall (Direction dir) {
if (hasWall(dir))
unsetWall(dir);
else
setWall(dir);
}
/**
* Pone un muro si no lo hay en la dirección especificada.
*
* @param dir
* Lado de la celda que se quiere modificar.
*/
public void setWall (Direction dir) {
m_cell |= dir.val;
}
/**
* Quita el muro si lo hay en la dirección especificada.
*
* @param dir
* Lado de la celda que se quiere modificar.
*/
public void unsetWall (Direction dir) {
m_cell &= ~dir.val;
}
/**
* Elimina todas las paredes de la celda.
*/
public void removeWalls () {
m_cell = 0;
}
/**
* Indica si hay un muro en la dirección indicada.
*
* @param dir
* Lado de la celda que se quiere consultar.
* @return Si hay una celda en esa dirección o no.
*/
public boolean hasWall (Direction dir) {
return (m_cell & dir.val) != 0;
}
/**
* Enumeración de los diferentes estados que puede tener una celda de cara a
* un agente cualquiera.
*/
public static enum Vision {
/**
* Este estado significa que la celda está vacía y no hay una pared entre
* las 2 celdas.
*/
EMPTY,
/**
* Este estado significa que hay una pared entre la posición actual del
* agente y la celda.
*/
WALL,
/**
* Este estado significa que hay un agente sobre esa celda actualmente y no
* hay nada interponiéndose en medio.
*/
AGENT,
/**
* Este estado significa que la celda referenciada está fuera del laberinto
* y además no hay una pared en medio.
*/
OFFLIMITS;
}
}