public class Mapa {
private Cosas[][] cosas;
public Mapa(int filas, int columnas) {
this.cosas = new Cosas[filas][columnas];
for (int i = 0; i < this.cosas.length; i++)
for (int j = 0; j < this.cosas[i].length; j++)
cosas[i][j] = Cosas.NADA;
}
/**
* Coloca la cosa en una posición del mapa. Sirve para
* preparar los mapas
* @param cosa, la cosa a colocar
* @param x, la posición donde colocar la cosa en x
* @param y, la posición donde colocar la cosa en y
*/
public void colocar(Cosas cosa, int x, int y) {
if(x > cosas.length - 1 || y > cosas[x].length || x < 0 || y < 0){
Error posicionErronea = new Error("Intenta colocar una cosa por fuera del mapa");
throw posicionErronea;
}
this.cosas [x][y] = cosa;
}
/**
* Buscará la cosa más cercana desde la posición suministrada
* @param cosa, la cosa a buscar. No debe ser Cosas.NADA
* @param x, la posición de origen en x
* @param y, la posición de origen en y
* @return la posicion de la cosa más cercana a x, y
*/
public Posicion buscarCosaMasCercana(Cosas cosa, int x, int y) {
// completar, evitando utilizar "fuerza bruta"
Posicion unaPosicion = new Posicion();
Cosas objetoABuscar = Cosas.NADA;
int vueltasX = x ;
int vueltasY = y ;
int cont = 1;
if (x > cosas.length - 1 || y > cosas[x].length - 1|| x < 0 || y < 0){
Error estasFuera = new Error("Estas fuera del mapa");
throw estasFuera;
}
else if (cosa == Cosas.NADA){
Error noSeBuscaNada = new Error("No puede buscar este objeto");
throw noSeBuscaNada;
}
while(objetoABuscar != cosa){
if (cosas[x][y] == cosa){
objetoABuscar = cosa;
}
else {
if(x + cont < cosas.length - 1){
for(int a = x;a < vueltasX + cont;a++){
if(cosas[a][y] == cosa){
objetoABuscar = cosa;
}
x++;
}
vueltasX = x;
}
if(y - cont > 0){
for(int i = y ;i > vueltasY - cont ; i--){
if(cosas[x][i] == cosa ){
objetoABuscar = cosa;
}
y--;
}}
vueltasY = y;
cont++;
if(x - cont > 0){
for(int ar = x ; ar > vueltasX - cont ; ar--){
if(cosas[ar][y] == cosa){
objetoABuscar = cosa;
}
x--;
}}
vueltasX = x;
if(y + cont < cosas [x].length - 1){
for(int d = y ; d < vueltasY + cont ; d++){
if(cosas[x][d] == cosa){
objetoABuscar = cosa;
}
y++;
}}
vueltasY = y;
cont++;
}
}
if(objetoABuscar != cosa){
Error noEsta = new Error("El objeto no esta en el mapa");
throw noEsta;
}else {
unaPosicion.x = x;
unaPosicion.y = y;
System.out.print(x+","+y);
}
return unaPosicion;
}
/**
* Buscará la cosa más lejana desde la posición suministrada
* @param cosa, la cosa a buscar. Puede ser Cosas.NADA
* @param x, la posición de origen en x
* @param y, la posición de origen en y
* @return la posicion de la cosa más lejana a x, y
*/
public Posicion buscarCosaMasLejana(Cosas cosa, int x, int y) {
Posicion unaPosicion = new Posicion ();
Cosas cosaABuscar = Cosas.NADA;
int cont = 1;
int vueltasX = 0;
int vueltasY = 0;
if (x > cosas.length - 1 || y > cosas[x].length - 1|| x < 0 || y < 0){
Error estasFuera = new Error("Estas fuera del mapa");
throw estasFuera;
}
else if (cosa == Cosas.NADA){
Error noSeBuscaNada = new Error("No puede buscar este objeto");
throw noSeBuscaNada;
}
if (cosas[x][y] == cosa){
cosaABuscar = cosa;
}
else {
if(x + cont < cosas.length - 1){
for(int a = x;a < vueltasX + cont;a++){
if(cosas[a][y] == cosa){
cosaABuscar = cosa;
}
x++;
}
vueltasX = x;
}
if(y - cont > 0){
for(int i = y ;i > vueltasY - cont ; i--){
if(cosas[x][i] == cosa ){
cosaABuscar = cosa;
}
y--;
}}
vueltasY = y;
cont++;
if(x - cont > 0){
for(int ar = x ; ar > vueltasX - cont ; ar--){
if(cosas[ar][y] == cosa){
cosaABuscar = cosa;
}
x--;
}}
vueltasX = x;
if(y + cont < cosas [x].length - 1){
for(int d = y ; d < vueltasY + cont ; d++){
if(cosas[x][d] == cosa){
cosaABuscar = cosa;
}
y++;
}}
vueltasY = y;
cont++;
}
if (){
}
}
}
class Posicion {
int x, y;
}
enum Cosas {
ENEMIGO, FRUTA, NADA, PARED
}