Ejemplo n.º 1
0
 private ShootInfo evaluateShoot(double power, double angle, double angleVert) {
   TrajectoryMasia trajectory =
       new TrajectoryMasia(
           currentSituation.ballPosition(), Constants.getVelocidadRemate(power), angle, angleVert);
   double fitness = 0, f;
   for (int i = 0; i < trajectory.length; i++) {
     if (i == 0) {
       f =
           calculateFitness(
               trajectory.positions[i],
               trajectory.z[i],
               i + 1,
               currentSituation.ballPosition(),
               0);
     } else {
       f =
           calculateFitness(
               trajectory.positions[i],
               trajectory.z[i],
               i + 1,
               trajectory.positions[i - 1],
               trajectory.z[i - 1]);
     }
     fitness += f;
     if (f > 1 || f == -1) {
       break;
     }
   }
   return new ShootInfo(angle, angleVert, fitness);
 }
Ejemplo n.º 2
0
 private boolean isShootSituation(double power) {
   double factor =
       Math.abs(Math.sin(currentSituation.ballPosition().angle(Constants.centroArcoSup)));
   factor = 1 - (1 - factor) * (1 - factor);
   return currentSituation.ballPosition().distance(Constants.centroArcoSup)
       <= THRESHOLD
           * factor
           * Constants.getVelocidadRemate(power)
           / Constants.REMATE_VELOCIDAD_MAX;
 }
Ejemplo n.º 3
0
  @Override
  public List<Command> makeStrategy() {
    List<Command> commands = new ArrayList<Command>();

    double power = 1;
    for (int i = 0; i < canShoot.length; i++) {
      if (currentSituation.myPlayersDetail()[canShoot[i]].getPower() < power) {
        power = currentSituation.myPlayersDetail()[canShoot[i]].getPower();
      }
    }
    if (isShootSituation(power)) {
      double maxVertAngle = Constants.ANGULO_VERTICAL_MAX * Math.PI / 180;
      double angleVert;
      double angle =
          currentSituation
              .ballPosition()
              .angle(Constants.posteDerArcoSup.movePosition(-Constants.RADIO_BALON, 0));
      angle =
          Math.min(
              angle + 0.5 * Constants.getErrorAngular(1.0) / 2 * Math.PI,
              currentSituation.ballPosition().angle(Constants.centroArcoSup));
      double maxAngle =
          currentSituation
              .ballPosition()
              .angle(Constants.posteIzqArcoSup.movePosition(Constants.RADIO_BALON, 0));
      maxAngle =
          Math.max(
              maxAngle - 0.5 * Constants.getErrorAngular(1.0) / 2 * Math.PI,
              currentSituation.ballPosition().angle(Constants.centroArcoSup));

      ShootInfo shoot = new ShootInfo();
      while (angle <= maxAngle) {
        angleVert = 0;
        while (angleVert <= maxVertAngle) {
          shoot = compareShoot(shoot, evaluateShoot(power, angle, angleVert));
          angleVert += Math.PI / 180;
        }
        angle += Math.PI / 180;
      }

      for (int player : canShoot) {
        commands.add(
            new CommandHitBall(
                player, shoot.angle * 180 / Math.PI, 1, shoot.angleVert * 180 / Math.PI));
      }
    }

    return commands;
  }
Ejemplo n.º 4
0
  @Override
  public List<Command> makeStrategy() {
    List<Command> commands = new ArrayList<Command>();

    if (gameSituation.isStarts()
        && (gameSituation.ballPosition() == Constants.cornerSupDer
            || gameSituation.ballPosition() == Constants.cornerSupDer)) {
      int jugador = gameSituation.ballPosition().nearestIndex(gameSituation.myPlayers());
      if (jugador != 10) {
        commands.add(new CommandHitBall(jugador, gameSituation.myPlayers()[10], 1, true));
      } else {
        commands.add(new CommandHitBall(jugador, Constants.centroArcoSup, 1, true));
      }
    }

    return commands;
  }
Ejemplo n.º 5
0
  public void afterUpdate(MSGSituacionPartidoContext context) {
    GameSituations situacionPartido = context.getSituacionPartido();

    Punto3D punto =
        new Punto3D(
            situacionPartido.ballPosition().getX(),
            situacionPartido.ballPosition().getY(),
            situacionPartido.ballAltitude());
    this.probabilidadControl = MSGUtils.getProbabilidadControl(punto, this.posicion);
    this.posicion = punto;
  }
Ejemplo n.º 6
0
  private boolean existeJugadorRivalCercaDeBalon(GameSituations sp) {

    boolean result = false;

    for (Position rival : sp.rivalPlayers()) {

      if (rival.distance(sp.ballPosition()) < 10) {
        result = true;
        break;
      }
    }

    return result;
  }
Ejemplo n.º 7
0
  private void cambiarAlineacion(GameSituations sp, List<Command> result) {
    if (sp.isRivalStarts()) {
      //			//System.out.println("SACA RIVAL. iteracionesParaSacar: " + iteracionesParaSacar);
      int cont = 0;

      int[] recuperadores = sp.getRecoveryBall();
      if (recuperadores.length > 1) {
        for (int i = 1; i < 2; i++) {
          double[] posRecuperacion = sp.getTrajectory(recuperadores[0]);
          result.add(
              new CommandMoveTo(
                  recuperadores[i], new Position(posRecuperacion[0], posRecuperacion[1])));
        }
      }

      if (sp.ballPosition().equals(Constants.cornerInfDer)) {
        //				//System.out.println("SAQUE " + cont++);
        usarAlineacion(result, cornerInferiorDer, sp);

      } else if (sp.ballPosition().equals(Constants.cornerInfIzq)) {
        //				//System.out.println("SAQUE " + cont++);
        usarAlineacion(result, cornerInferiorIzq, sp);

      } else if (sp.ballPosition().equals(Constants.cornerSupIzq)) {
        //				//System.out.println("SAQUE " + cont++);
        usarAlineacion(result, cornerSuperiorIzq, sp);

      } else if (sp.ballPosition().equals(Constants.cornerSupDer)) {
        //				//System.out.println("SAQUE " + cont++);
        usarAlineacion(result, cornerSuperiorDer, sp);
      }

    } else if (sp.isStarts()) {
      // System.out.println("SACO. iteracionesParaSacar: " + iteracionesParaSacar);
      int cont = 0;

      iteracionesParaSacar++;

      int[] recuperadores = sp.getRecoveryBall();
      if (recuperadores.length > 1) {
        for (int i = 1; i < 2; i++) {
          double[] posRecuperacion = sp.getTrajectory(recuperadores[0]);
          result.add(
              new CommandMoveTo(
                  recuperadores[i], new Position(posRecuperacion[0], posRecuperacion[1])));
        }
      }

      if (sp.ballPosition().equals(Constants.cornerInfDer)) {
        //				//System.out.println("SAQUE " + cont++);
        usarAlineacion(result, cornerInferiorDer, sp);

      } else if (sp.ballPosition().equals(Constants.cornerInfIzq)) {
        //				//System.out.println("SAQUE " + cont++);
        usarAlineacion(result, cornerInferiorIzq, sp);

      } else if (sp.ballPosition().equals(Constants.cornerSupIzq)) {
        //				//System.out.println("SAQUE " + cont++);
        usarAlineacion(result, cornerSuperiorIzq, sp);

      } else if (sp.ballPosition().equals(Constants.cornerSupDer)) {
        //				//System.out.println("SAQUE " + cont++);
        usarAlineacion(result, cornerSuperiorDer, sp);
      }
    } else {
      usarAlineacion(result, alineacion1, sp);
    }
  }
Ejemplo n.º 8
0
  public List<Command> execute(GameSituations sp) {

    List<Command> result = new ArrayList<Command>();

    cambiarAlineacion(sp, result);

    if (sp.canKick().length > 0) {

      for (int jugador : sp.canKick()) {

        if (jugador == porteroIndice) {
          CommandHitBall golpear = new CommandHitBall(jugador, 90, 1, 40);
          result.add(golpear);
        } else if (sp.isStarts()) {
          //					//System.out.println("SACO. iteracionesParaSacar: " + iteracionesParaSacar);

          if (iteracionesParaSacar == Constants.ITERACIONES_SAQUE - 10) {
            int count = 0;
            Random r = new Random();
            int j = -1;
            Position[] jugadores = sp.myPlayers();
            while ((j = r.nextInt(jugadores.length)) == jugador
                && jugadores[jugador].getY() > jugadores[j].getY()
                && count < 20) {
              count++;
            }
            ;
            result.add(new CommandHitBall(jugador, jugadores[j], 3, r.nextInt(45)));

            iteracionesParaSacar = 0;
          } else if (iteracionesParaSacar > Constants.ITERACIONES_SAQUE) {
            iteracionesParaSacar = 0;
          } else {

            // Desplazamos a un compañero para que le pueda sacar el balón
            int[] jugadoresParaCombinar =
                sp.myPlayers()[jugador].nearestIndexes(sp.myPlayers(), 0, jugador);

            if (jugadoresParaCombinar.length > 0) {

              for (int jugadorParaCombinar : jugadoresParaCombinar) {

                if (jugadorParaCombinar != 0 && jugadorParaCombinar != jugador) {

                  double x = 0;
                  if (sp.ballPosition().getX() < 0) {
                    x = sp.ballPosition().getX() + 10;
                  } else {
                    x = sp.ballPosition().getX() - 10;
                  }

                  Position newPosition = new Position(x, sp.ballPosition().getY());

                  CommandMoveTo muevete = new CommandMoveTo(jugadorParaCombinar, newPosition);
                  result.add(muevete);

                  break;
                }
              }
            }
          }

        } else if (jugador == 8 || jugador == 9 || jugador == 10 || jugador == 11) {
          Random r = new Random();
          if (r.nextBoolean()) {
            result.add(new CommandHitBall(jugador, Constants.centroArcoSup, 3, 12 + r.nextInt(6)));
          } else {
            if (r.nextBoolean()) {
              result.add(
                  new CommandHitBall(jugador, Constants.posteDerArcoSup, 3, 12 + r.nextInt(6)));
            } else {
              result.add(
                  new CommandHitBall(jugador, Constants.posteIzqArcoSup, 3, 12 + r.nextInt(6)));
            }
          }

        } else if (jugador == 5 || jugador == 6) {
          result.add(new CommandHitBall(jugador));

        } else {
          int count = 0;
          Random r = new Random();
          int j = -1;
          Position[] jugadores = sp.myPlayers();
          while ((j = r.nextInt(jugadores.length)) == jugador
              && jugadores[jugador].getY() > jugadores[j].getY()
              && count < 20) {
            count++;
          }
          ;
          result.add(new CommandHitBall(jugador, jugadores[j], 3, r.nextInt(45)));
        }
      }
    }

    // Portero
    int[] recuperadores = sp.getRecoveryBall();
    if (recuperadores.length > 1) {
      for (int i = 1; i < 2; i++) {

        double[] posRecuperacion =
            sp.getTrajectory(iteracionMejorParaRecuperarBalonSegunAltura(sp));
        result.add(
            new CommandMoveTo(
                recuperadores[i], new Position(posRecuperacion[0], posRecuperacion[1])));
      }
    }

    //		if(sp.myGoals() == sp.rivalGoals() && sp.ballPosition().distancia(sp.myPlayers()[0]) < 50){
    //
    //			if (sp.canKick().length > 0 && sp.rivalCanKick().length == 0) {
    //
    //				for(int jugador : sp.canKick()){
    //
    //					if(jugador != 0){
    //						// El portero no actúa aquí
    //						CommandHitBall golpear = new CommandHitBall(jugador);
    //						result.add(golpear);
    //
    //						ComandoIrA irA = new ComandoIrA(jugador, new Posicion(40, sp.myPlayers()[0].getY()));
    //						result.add(irA);
    //					}
    //				}
    //
    //			}
    //
    //		}

    return result;
  }