
juego Hundir la flota
Publicado por Dalall (1 intervención) el 27/08/2014 23:29:03
Hola!!
Necesito ayuda con el metodo disparar del ordenador, el ordenador debe de disparar de forma inteligente, es decir una vez que alcanza un barco probara la casilla superior,luego la casilla derecha luego abajo y por ultimo a la derecha.
El problema es que no se donde esta el error...me dispara hacia arriba y ya esta...se para y entra en un bucle...me estoy volviendo loca :(
os dejo el codigo a ver si podeis hecharme una mano, muchas gracias
public Coordenada especificarDisparo()
{
int estado=0;
int turnoD=0;
//Coordenada disparo=null;
boolean ocupada=false;
Random randomGenerator= new Random();
int cX=0;
int cY=0;
int cj=0;
int cc=0;
if (resultadoDisparoFinal==null)
{
ultimoMovimiento=MovimientoDisparo.ALEATORIO;
//disparo=disparar(MovimientoDisparo.ALEATORIO);
do
{
cX=randomGenerator.nextInt(ancho_tablero);
cY=randomGenerator.nextInt(alto_tablero);
ocupada = (!(tableroOrd[cX][cY]==Posiciones.SIN_DISPARAR));
}
while(ocupada);
disparo=new Coordenada(cX,cY);
}
else
{
if ((resultadoDisparoFinal==ResultadoDisparo.AGUA)&&(estado==0))
{ do
{
cX=randomGenerator.nextInt(ancho_tablero);
cY=randomGenerator.nextInt(alto_tablero);
ocupada = (!(tableroOrd[cX][cY]==Posiciones.SIN_DISPARAR));
}
while(ocupada);
disparo=new Coordenada(cX,cY);
}
else
{ if (resultadoDisparoFinal==ResultadoDisparo.HUNDIDO)
{ do
{
cX=randomGenerator.nextInt(ancho_tablero);
cY=randomGenerator.nextInt(alto_tablero);
ocupada = (!(tableroOrd[cX][cY]==Posiciones.SIN_DISPARAR));
}
while(ocupada);
disparo=new Coordenada(cX,cY);
}
else
{
if( (resultadoDisparoFinal==ResultadoDisparo.TOCADO)|| (estado==1))
{
//disparar hacia arriba hasta que el resultado sea agua, o si no se puede
//disparar arriba disparamos hacia la derecha y si tampoco se puede,
//se dispara abajo, esto ocurre en el caso de que el barco este situado en la
//parte superior derecha, coordenada (9,9)tocado
ultimoDisparoTocado=disparoFinal;
estado =1;
// disparar arriba
//ARRIBA:
if((turnoD==0)&&(resultadoDisparoFinal==ResultadoDisparo.AGUA))
{
turnoD=1;}//derecha
else
{ if((turnoD==1)&&(resultadoDisparoFinal==ResultadoDisparo.AGUA))
{
turnoD=2;//abajo
}
else
{
if((turnoD==2)&&(resultadoDisparoFinal==ResultadoDisparo.AGUA))
{
turnoD=3;//izquierda
};
if ((turnoD==0)&&(resultadoDisparoFinal==ResultadoDisparo.TOCADO))
{//arriba
cY=ultimoDisparoTocado.getY();
do
{
cX=ultimoDisparoTocado.getX();
cY=cY-1;
if(cY>=0)
ocupada = (!(tableroOrd[cX][cY]==Posiciones.SIN_DISPARAR));
}
while ((cY>=0) && (ocupada));
if(cY<0)
{
turnoD=1;
}
else{
disparo= new Coordenada(cX,cY);
};
}
else{
if ((turnoD==1)&&(resultadoDisparoFinal==ResultadoDisparo.TOCADO))
{//DERECHA:
cX=ultimoDisparoTocado.getX();
do
{
cX=cX+1;
cY=ultimoDisparoTocado.getY();
if (cX<ancho_tablero)
ocupada = (!(tableroOrd[cX][cY]==Posiciones.SIN_DISPARAR));
}
while((cX<ancho_tablero) && (ocupada));
if(cX>=ancho_tablero)
turnoD=2;
else{
disparo=new Coordenada(cX,cY);
};
}
else
{//abajo
if ((turnoD==2)&&(resultadoDisparoFinal==ResultadoDisparo.TOCADO))
{ cY=ultimoDisparoTocado.getY();
do
{
cX=ultimoDisparoTocado.getX();
cY=cY+1;
if(cY<ancho_tablero)
ocupada = (!(tableroOrd[cX][cY]==Posiciones.SIN_DISPARAR));
}
while((cY<alto_tablero) && (ocupada));
if(cY>=alto_tablero)
turnoD=3;
else{
disparo=new Coordenada(cX,cY);
};
}
else
{//izquierda
if ((turnoD==3)&&(resultadoDisparoFinal==ResultadoDisparo.TOCADO))
cX=ultimoDisparoTocado.getX();
do
{
cX=cX-1;
cY=ultimoDisparoTocado.getY();
if(cX>=0)
ocupada = (!(tableroOrd[cX][cY]==Posiciones.SIN_DISPARAR));
}
while ((cX>=0) && (ocupada));
if(cX<0)
estado=0;
else
{
disparo=new Coordenada(cX,cY);
};
} }} }} } }}}
cj=disparo.getX();
cc=disparo.getX();
System.out.println("mov "+ultimoMovimiento);
System.out.println(" x "+cj+"y "+cc );
disparoFinal=disparo;
return disparo;
}
Necesito ayuda con el metodo disparar del ordenador, el ordenador debe de disparar de forma inteligente, es decir una vez que alcanza un barco probara la casilla superior,luego la casilla derecha luego abajo y por ultimo a la derecha.
El problema es que no se donde esta el error...me dispara hacia arriba y ya esta...se para y entra en un bucle...me estoy volviendo loca :(
os dejo el codigo a ver si podeis hecharme una mano, muchas gracias
public Coordenada especificarDisparo()
{
int estado=0;
int turnoD=0;
//Coordenada disparo=null;
boolean ocupada=false;
Random randomGenerator= new Random();
int cX=0;
int cY=0;
int cj=0;
int cc=0;
if (resultadoDisparoFinal==null)
{
ultimoMovimiento=MovimientoDisparo.ALEATORIO;
//disparo=disparar(MovimientoDisparo.ALEATORIO);
do
{
cX=randomGenerator.nextInt(ancho_tablero);
cY=randomGenerator.nextInt(alto_tablero);
ocupada = (!(tableroOrd[cX][cY]==Posiciones.SIN_DISPARAR));
}
while(ocupada);
disparo=new Coordenada(cX,cY);
}
else
{
if ((resultadoDisparoFinal==ResultadoDisparo.AGUA)&&(estado==0))
{ do
{
cX=randomGenerator.nextInt(ancho_tablero);
cY=randomGenerator.nextInt(alto_tablero);
ocupada = (!(tableroOrd[cX][cY]==Posiciones.SIN_DISPARAR));
}
while(ocupada);
disparo=new Coordenada(cX,cY);
}
else
{ if (resultadoDisparoFinal==ResultadoDisparo.HUNDIDO)
{ do
{
cX=randomGenerator.nextInt(ancho_tablero);
cY=randomGenerator.nextInt(alto_tablero);
ocupada = (!(tableroOrd[cX][cY]==Posiciones.SIN_DISPARAR));
}
while(ocupada);
disparo=new Coordenada(cX,cY);
}
else
{
if( (resultadoDisparoFinal==ResultadoDisparo.TOCADO)|| (estado==1))
{
//disparar hacia arriba hasta que el resultado sea agua, o si no se puede
//disparar arriba disparamos hacia la derecha y si tampoco se puede,
//se dispara abajo, esto ocurre en el caso de que el barco este situado en la
//parte superior derecha, coordenada (9,9)tocado
ultimoDisparoTocado=disparoFinal;
estado =1;
// disparar arriba
//ARRIBA:
if((turnoD==0)&&(resultadoDisparoFinal==ResultadoDisparo.AGUA))
{
turnoD=1;}//derecha
else
{ if((turnoD==1)&&(resultadoDisparoFinal==ResultadoDisparo.AGUA))
{
turnoD=2;//abajo
}
else
{
if((turnoD==2)&&(resultadoDisparoFinal==ResultadoDisparo.AGUA))
{
turnoD=3;//izquierda
};
if ((turnoD==0)&&(resultadoDisparoFinal==ResultadoDisparo.TOCADO))
{//arriba
cY=ultimoDisparoTocado.getY();
do
{
cX=ultimoDisparoTocado.getX();
cY=cY-1;
if(cY>=0)
ocupada = (!(tableroOrd[cX][cY]==Posiciones.SIN_DISPARAR));
}
while ((cY>=0) && (ocupada));
if(cY<0)
{
turnoD=1;
}
else{
disparo= new Coordenada(cX,cY);
};
}
else{
if ((turnoD==1)&&(resultadoDisparoFinal==ResultadoDisparo.TOCADO))
{//DERECHA:
cX=ultimoDisparoTocado.getX();
do
{
cX=cX+1;
cY=ultimoDisparoTocado.getY();
if (cX<ancho_tablero)
ocupada = (!(tableroOrd[cX][cY]==Posiciones.SIN_DISPARAR));
}
while((cX<ancho_tablero) && (ocupada));
if(cX>=ancho_tablero)
turnoD=2;
else{
disparo=new Coordenada(cX,cY);
};
}
else
{//abajo
if ((turnoD==2)&&(resultadoDisparoFinal==ResultadoDisparo.TOCADO))
{ cY=ultimoDisparoTocado.getY();
do
{
cX=ultimoDisparoTocado.getX();
cY=cY+1;
if(cY<ancho_tablero)
ocupada = (!(tableroOrd[cX][cY]==Posiciones.SIN_DISPARAR));
}
while((cY<alto_tablero) && (ocupada));
if(cY>=alto_tablero)
turnoD=3;
else{
disparo=new Coordenada(cX,cY);
};
}
else
{//izquierda
if ((turnoD==3)&&(resultadoDisparoFinal==ResultadoDisparo.TOCADO))
cX=ultimoDisparoTocado.getX();
do
{
cX=cX-1;
cY=ultimoDisparoTocado.getY();
if(cX>=0)
ocupada = (!(tableroOrd[cX][cY]==Posiciones.SIN_DISPARAR));
}
while ((cX>=0) && (ocupada));
if(cX<0)
estado=0;
else
{
disparo=new Coordenada(cX,cY);
};
} }} }} } }}}
cj=disparo.getX();
cc=disparo.getX();
System.out.println("mov "+ultimoMovimiento);
System.out.println(" x "+cj+"y "+cc );
disparoFinal=disparo;
return disparo;
}
Valora esta pregunta


0