Package src.estrategias

Source Code of src.estrategias.EstrategiaGuardiaPerimetreando

package src.estrategias;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.gameloftProgrammersCup.clientInterfaces.Point;
import com.gameloftProgrammersCup.clientInterfaces.Command.*;
import com.gameloftProgrammersCup.client.*;
import com.gameloftProgrammersCup.command.AttackCommand;

import src.*;
import src.pathFinding.Astar;

public class EstrategiaGuardiaPerimetreando extends EstrategiaUnidad{
 
  public List waypoints=new ArrayList();
  public int orden=-1;
  //tiene que ser un atacante para implementar esta estrategia, por eso lo casteo
  public ClientCommand accionDeTurno(UnidadBasica ub)
  {return accionDeTurno((Guardia )ub);}
 
 
  public ClientCommand accionDeTurno(Guardia guardian){
    //primero chequear si hay enemigo en rango por favor
   
    ifguardian.enemigoEnRango() != null)
      //ATTACK!
    {
     
    Enemigo enemigo = guardian.enemigoEnRango();
    ClientCommand cAtaque =guardian.atacar(enemigo.getPosition());
    //comandos.add(nuevoComando);
    guardian.setCommand(cAtaque);
    return cAtaque;
    }
    else{//idle
      return pasearPorPerimetro(guardian,Fortaleza.instanciaFortaleza.getRadioSeguridad(),Fortaleza.instanciaFortaleza.getRadioSeguridad(),Fortaleza.instanciaFortaleza.getPosition());
    }
   
    //falta ver si tiene objetivo o si patrulla o idlea
   
   
    //return null;//unreachable!!
  }

public ClientCommand pasearPorPerimetro(UnidadBasica unidad,int perimetroX,int perimetroY,Point centro){//perimetro de 4 puntos
   
    int perimetroExteriorX=perimetroX;
    int perimetroExteriorY=perimetroY;
    //int perimetroInterior=9;
    boolean afuera=true;
    Point destino=null;
    if (waypoints.size()==0){
      int centroX=centro.getX();
      int centroY=centro.getY();
      // Arma los punto. El -5 es porque no tiene sentido que pase tan cerca del borde, le da un margen
      int limiteIzquierdo=(centroX-perimetroExteriorX)>=0 ? centroX-perimetroExteriorX : 0;
      int limiteDerecho=(centroX+perimetroExteriorX)<unidad.getJugador().getFortaleza().anchoMapa-5 ? centroX+perimetroExteriorX : unidad.getJugador().getFortaleza().anchoMapa-1;
      int limiteSuperior=(centroY-perimetroExteriorY)>=0 ? centroY-perimetroExteriorY : 0;
      int limiteInferior=(centroY+perimetroExteriorY)<unidad.getJugador().getFortaleza().altoMapa-5 ? centroY+perimetroExteriorY : unidad.getJugador().getFortaleza().altoMapa-1;
     
 
      Point waypoint1=new Point (limiteDerecho,limiteSuperior);
      Point waypoint2=new Point (limiteDerecho,limiteInferior);
      Point waypoint3=new Point (limiteIzquierdo,limiteInferior);
      Point waypoint4=new Point (limiteIzquierdo,limiteSuperior);
      //Chequeo para ver si algun way queda afuera, si es una esquina me quedan solo 3 ways
      if (Math.abs(waypoint1.getX()-centroX)==perimetroExteriorX || Math.abs(waypoint1.getY()-centroY)==perimetroExteriorY)
        waypoints.add(waypoint1);
      if (Math.abs(waypoint2.getX()-centroX)==perimetroExteriorX || Math.abs(waypoint2.getY()-centroY)==perimetroExteriorY)
        waypoints.add(waypoint2);
      if (Math.abs(waypoint3.getX()-centroX)==perimetroExteriorX || Math.abs(waypoint3.getY()-centroY)==perimetroExteriorY)
        waypoints.add(waypoint3);
      if (Math.abs(waypoint4.getX()-centroX)==perimetroExteriorX || Math.abs(waypoint4.getY()-centroY)==perimetroExteriorY)
        waypoints.add(waypoint4);
     
      //armo la secuencia de los ways
      if (waypoints.size()==3){
        //el 0 es el del medio
        if ((((Point)waypoints.get(0)).getX() == ((Point)waypoints.get(1)).getX() && ((Point)waypoints.get(0)).getY() == ((Point)waypoints.get(2)).getY())
            || (((Point)waypoints.get(0)).getX() == ((Point)waypoints.get(2)).getX() && ((Point)waypoints.get(0)).getY() == ((Point)waypoints.get(1)).getY())){
          Point punto=(Point)waypoints.remove(0);
          waypoints.add(1,punto);
          waypoints.add(punto);
        }
        //el 1 es el del medio
        if ((((Point)waypoints.get(1)).getX() == ((Point)waypoints.get(2)).getX() && ((Point)waypoints.get(1)).getY() == ((Point)waypoints.get(0)).getY())
            || (((Point)waypoints.get(1)).getX() == ((Point)waypoints.get(0)).getX() && ((Point)waypoints.get(1)).getY() == ((Point)waypoints.get(2)).getY())){
          Point punto=(Point)waypoints.remove(1);
          waypoints.add(1,punto);
          waypoints.add(punto);
        }
        //el 2 es el del medio
        if ((((Point)waypoints.get(2)).getX() == ((Point)waypoints.get(0)).getX() && ((Point)waypoints.get(2)).getY() == ((Point)waypoints.get(1)).getY())
            || (((Point)waypoints.get(2)).getX() == ((Point)waypoints.get(1)).getX() && ((Point)waypoints.get(2)).getY() == ((Point)waypoints.get(0)).getY())){
          Point punto=(Point)waypoints.remove(2);
          waypoints.add(1,punto);
          waypoints.add(punto);
        }
      }
     
      else{
      //armo la secuencia de los ways
        if (limiteIzquierdo!=centroX-perimetroExteriorX){
          //orden de los way
          //123214
          waypoints.add(3,waypoints.get(0));
          waypoints.add(3,waypoints.get(1));
        }
        if (limiteDerecho!=centroX+perimetroExteriorX){
          //143234
          waypoints.add(1,waypoints.get(waypoints.size()-2));
          waypoints.add(1,waypoints.get(waypoints.size()-1));
        }
        if (limiteSuperior!=centroY-perimetroExteriorY){
          //123432
          waypoints.add(waypoints.get(2));
          waypoints.add(waypoints.get(1));     
        }
        if (limiteInferior!=centroY+perimetroExteriorY){
          //121434
          waypoints.add(2,waypoints.get(waypoints.size()-1));
          waypoints.add(2,waypoints.get(0));
        }
      }
      Iterator it=waypoints.iterator();
      while (it.hasNext()){
        Point punto=(Point)it.next();
        if (destino==null || punto.distance(unidad.getPosition())<destino.distance(unidad.getPosition())){
          destino=punto;
        }
      }
      unidad.destino=destino;
    }
   
    if (unidad.getWayPoints()==null || unidad.getWayPoints().size()==0 || !Astar.verificarCamino(unidad)){
      Iterator it=waypoints.iterator();
      while (it.hasNext()){
        Point punto=(Point)it.next();
        if (destino==null || punto.distance(unidad.getPosition())<destino.distance(unidad.getPosition())){
          destino=punto;
        }
      }
      if (orden<0 && destino.distance(unidad.getPosition())<3){
        orden=waypoints.indexOf(destino);
      }
      unidad.destino=destino;
      if (orden>=0){
        if (destino.distance(unidad.getPosition())<3){
          orden++;
          orden=orden%waypoints.size();
          destino=(Point)waypoints.get(orden);
          unidad.destino=destino;
        }
        destino=(Point)waypoints.get(orden);
        unidad.destino=destino;
      }
     
      unidad.setPeligrosidad(false);
      unidad.setDescubir(false);
     
      unidad.setWayPoints(Astar.intentoDePathFinding(unidad.destino, unidad, unidad.getJugador().getFortaleza()));
      unidad.destino=unidad.destino;
    }
    ClientCommand nuevoComando=new ClientCommand();
    nuevoComando.setId(unidad.getJugador().getIdComando());
    nuevoComando.setIdUnit(unidad.getId());
    nuevoComando.setType("move");
    nuevoComando.setDestination((Point)unidad.getWayPoints().get(0));
    nuevoComando.setUnitType(unidad.getType());
    unidad.setCommand(nuevoComando);

    return nuevoComando;
  }
 
 
 
 
 
}
TOP

Related Classes of src.estrategias.EstrategiaGuardiaPerimetreando

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.