package src.estrategias;
import java.util.*;
import com.gameloftProgrammersCup.client.ClientCommand;
import com.gameloftProgrammersCup.clientInterfaces.Command;
import com.gameloftProgrammersCup.clientInterfaces.Point;
import src.*;
import src.estadisticas.Estadisticas;
/*
* clase abstracta de la que van a heredar todas las estrategias a usar por la fortaleza
*/
abstract public class EstrategiaGeneral {
/**
* Actualiza las estrategias de cada unidad, verificando condiciones de fin, estad�sticas, etc.
* @param listaUnidades: todas las unidades de mi equipo o un subgrupo
* @author Fernando Rivas @version 1.0
*
*/
protected int ultimoTurnoDetecctionAtaqueMasivo = 0;
protected boolean hayEnemigosEnRangoSeguridad = false;
/**
* en el create, nullea todas las estrategias de todas las unidades, despu�s decidir� cu�l asigna a cada una
*
*/
public EstrategiaGeneral(List unidades){
if (unidades == null) return;//caso inicial, nada que asignar
Iterator it = unidades.iterator();
while(it.hasNext())
{
UnidadBasica ub = (UnidadBasica)it.next();
ub.setEstrategiaUnidad(null);
}
}
abstract public void actualizarEstrategias(List listaUnidades, src.estadisticas.Estadisticas estadisticas);
/**
* Decide qu� unidad fabricar a continuacion, lleva a cabo la accion y devuelve el comando
* @param f
* @return comando a llevar a cabo
* @author Fernando Rivas @version 1.0
*/
abstract public ClientCommand fabricarUnidad(Fortaleza f );
/**
* en ciertos casos, como cambio de estrategia general, creaci�n de unidad o especiales, se le tiene que setear
* una estrategia a la unidad analizando lo que tenga que analizar
* @param ub: unidad a setear estrategia nueva
*/
//me parece que no va mas, se hace todo en actualizarUnidad abstract public void setearEstrategiaUnidad(UnidadBasica ub);
/**
* funciones b�sicas de actualizaci�n que se llaman en cada ciclo para cada unidad
* la idea es que controle si es necesario un cambio de estrategia
*/
abstract public void actualizarUnidad(Asesino asesino);
abstract public void actualizarUnidad(Guardia guardia);
abstract public void actualizarUnidad(ColectorInicial colector);
abstract public void actualizarUnidad(ColectorNormal colector);
abstract public void actualizarUnidad(Explorador explorador);
/**
* @return the hayEnemigosEnRangoSeguridad
*/
public boolean isHayEnemigosEnRangoSeguridad() {
return hayEnemigosEnRangoSeguridad;
}
/**
* @param hayEnemigosEnRangoSeguridad the hayEnemigosEnRangoSeguridad to set
*/
public void setHayEnemigosEnRangoSeguridad(boolean hayEnemigosEnRangoSeguridad) {
this.hayEnemigosEnRangoSeguridad = hayEnemigosEnRangoSeguridad;
}
/**
*
* @return Enemigo: si hay, el que est� m�s cerca de la fortaleza. Sino, null
*/
public Enemigo chequearEnemigosEnRangoSeguridad(){
Enemigo enemigo=null;
for(int y=Fortaleza.instanciaFortaleza.getPosition().getY()-Fortaleza.instanciaFortaleza.getRadioSeguridad();y<=Fortaleza.instanciaFortaleza.getPosition().getY()+Fortaleza.instanciaFortaleza.getRadioSeguridad();y++)
{
for(int x= Fortaleza.instanciaFortaleza.getPosition().getX()-Fortaleza.instanciaFortaleza.getRadioSeguridad();x<=Fortaleza.instanciaFortaleza.getPosition().getX()+Fortaleza.instanciaFortaleza.getRadioSeguridad();x++)
{
Point pEvaluado = new Point(x,y);
if(!Fortaleza.isPointAfuera(pEvaluado)&& pEvaluado.distance(Fortaleza.instanciaFortaleza.getPosition())<=Fortaleza.instanciaFortaleza.getRadioSeguridad())
{
if(Fortaleza.mapa[x][y]!=null && Fortaleza.mapa[x][y].getClass().equals(Enemigo.class) && ((Enemigo)Fortaleza.mapa[x][y]).getUltimoTurnoVisto()==Fortaleza.instanciaFortaleza.getJugador().turno)
if(enemigo==null)
enemigo=(Enemigo)Fortaleza.mapa[x][y];
else if(((Enemigo)Fortaleza.mapa[x][y]).getPosition().distance(Fortaleza.instanciaFortaleza.getPosition()) < enemigo.getPosition().distance(Fortaleza.instanciaFortaleza.getPosition()))
enemigo=(Enemigo)Fortaleza.mapa[x][y];
}
}
}
return enemigo;
}
/**
* devuelve una posici�n cualquiera dentro de rango seguridad. sirve para guardiaPatrullando
* @return
*/
static public Point getPosicionRandomEnRangoSeguridad(){
int maxPuntosEvaluados = 5;
Point pEvaluado=null;
//Point pElegido=null;
int porcentaje= 50;
int GradoRandomizacion=(int)Math.round(Math.random()*(Fortaleza.instanciaFortaleza.getRadioSeguridad()));
for(int y=Fortaleza.instanciaFortaleza.getPosition().getY()-Fortaleza.instanciaFortaleza.getRadioSeguridad();y<=Fortaleza.instanciaFortaleza.getPosition().getY()+Fortaleza.instanciaFortaleza.getRadioSeguridad();y++)
{
for(int x= Fortaleza.instanciaFortaleza.getPosition().getX()-Fortaleza.instanciaFortaleza.getRadioSeguridad();x<=Fortaleza.instanciaFortaleza.getPosition().getX()+Fortaleza.instanciaFortaleza.getRadioSeguridad();x++)
{
pEvaluado = new Point(x,y);
if(!Fortaleza.isPointAfuera(pEvaluado)&& pEvaluado.distance(Fortaleza.instanciaFortaleza.getPosition())<=Fortaleza.instanciaFortaleza.getRadioSeguridad())
{
/*MapElement meEvaluado = Fortaleza.getElementoMapaEnPosicion(pEvaluado);
if (meEvaluado != null && meEvaluado.getClass().getName().equals("src.Enemigo") && ((Enemigo)meEvaluado).getUltimoTurnoVisto()==Fortaleza.instanciaFortaleza.getJugador().turno )
return (Enemigo)meEvaluado;*/
/*for(int i=0;i<maxPuntosEvaluados;i++)
{
if(listaMaxPuntos[i]==null)
{
listaMaxPuntos[i] = pEvaluado;
break;
}
else if (Estadisticas.mapaEstadistico[listaMaxPuntos[i].getX()][listaMaxPuntos[i].getY()].getPeligrosidad()< Estadisticas.mapaEstadistico[pEvaluado.getX()][pEvaluado.getY()].getPeligrosidad())
{
listaMaxPuntos[i] = pEvaluado;
break;
}
}*/
if(Math.random()*100 < porcentaje)
{
GradoRandomizacion--;
porcentaje = porcentaje/2;
if(GradoRandomizacion < 0)
return pEvaluado;
}
/*if(Math.random()*100 < 100/((Fortaleza.instanciaFortaleza.getRadioSeguridad()*4)+(Fortaleza.instanciaFortaleza.getRadioSeguridad()+(Math.pow(2,2*(Fortaleza.instanciaFortaleza.getRadioSeguridad()-1) ) - 1))))
return pEvaluado;*/
}
}
}
/* prefiero que randomice entre el top 5 for(int i=0;i<maxPuntosEvaluados;i++)
{
if (Fortaleza.getElementoMapaEnPosicion(listaMaxPuntos[i])== null ||
((Fortaleza.getElementoMapaEnPosicion(listaMaxPuntos[i]).getClass().equals(Enemigo.class)
&& ((Enemigo)Fortaleza.getElementoMapaEnPosicion(listaMaxPuntos[i])).getUltimoTurnoVisto() != Fortaleza.instanciaFortaleza.getJugador().turno))
)
return listaMaxPuntos[i];
}*/
//bue, si no te gusta ninguna, agarr� cualquiera nom�s
// Estadisticas.logear("para rango"+Fortaleza.instanciaFortaleza.getRadioSeguridad()+"puntos :"+cantidadCiclos);
return pEvaluado;
}
public boolean hayAtaqueMasivoNOW(){
/*if(Fortaleza.instanciaFortaleza.getJugador().turno > 200)//prueba
return false;
if(Fortaleza.instanciaFortaleza.getJugador().turno > 100)//prueba
return true;*/
if (Fortaleza.instanciaFortaleza.fortalezaEnemiga== null)
return false;//no se puede calcular
List enemigosFueraRango = new ArrayList();
List enemigosTurno = Fortaleza.instanciaFortaleza.enemigosAtacantesDelTurno();
Iterator it = enemigosTurno.iterator();
while(it.hasNext())
{
Enemigo en = (Enemigo)it.next();
if (en.getPosition().distance(Fortaleza.instanciaFortaleza.fortalezaEnemiga.getPosition()) > EstrategiaExploradorAcecharColector.perimetro)
enemigosFueraRango.add(en);
}
System.out.println("enemigosFueraRango.size()"+enemigosFueraRango.size()+1+" < "+Fortaleza.instanciaFortaleza.getJugador().turno/ 60 );
if (enemigosFueraRango.size()<Fortaleza.instanciaFortaleza.getJugador().turno/ 50 && Fortaleza.instanciaFortaleza.getJugador().turno>=50)//todos en su casa
return false;
int sumaDistanciasMenores = 0;//suma de distancia de c/u al que tenga mas cerca
it = enemigosFueraRango.iterator();
Enemigo [] enArray=new Enemigo[enemigosFueraRango.size()];
int i=0;
while(it.hasNext())
{
Enemigo en = (Enemigo)it.next();
enArray[i]= en;
i++;
}
for(int j=0;j<enemigosFueraRango.size();j++)
{
Point pActual = enArray[j].getPosition();
int minDistancia =9999;
for(int k=1;k<enemigosFueraRango.size();k++)
{
if(k==j)
continue;
if(pActual.distance(enArray[k].getPosition()) < minDistancia)
minDistancia = pActual.distance(enArray[k].getPosition());
}
sumaDistanciasMenores += minDistancia;
}
if(enemigosFueraRango.size()==0)
return false;
System.out.println("if"+sumaDistanciasMenores/enemigosFueraRango.size()+" < 10");
if(enemigosFueraRango.size()>0 && sumaDistanciasMenores/enemigosFueraRango.size() < 10)
return true;
return false;
}
}