예제 #1
0
  private int iteracionMejorParaRecuperarBalonSegunAltura(GameSituations sp) {

    int result = -1;

    int[] recuperadores = sp.getRecoveryBall();
    if (recuperadores.length > 1) {

      int iteracionRecuperacion = recuperadores[0];

      int iteracionesMaximas = 30;
      int cont = 0;

      while (cont < iteracionesMaximas || result != -1) {

        double[] posRecuperacion = sp.getTrajectory(iteracionRecuperacion);
        if (posRecuperacion.length == 3 && posRecuperacion[2] <= Constants.ALTURA_CONTROL_BALON) {
          // podemos controlar el balón por alto
          result = iteracionRecuperacion;
          break;
        } else {
          cont++;
          iteracionRecuperacion++;
        }
      }

      if (result == -1) {
        result = iteracionRecuperacion;
      }
    }

    return result;
  }
예제 #2
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);
 }
예제 #3
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;
 }
예제 #4
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;
  }
예제 #5
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;
  }
예제 #6
0
  /**
   * Usa una alineacion para todos los jugadores.
   *
   * @param comandos
   * @param alineacion
   * @param sp
   */
  private void usarAlineacion(List<Command> comandos, Position[] alineacion, GameSituations sp) {

    Position[] jugadores = sp.myPlayers();
    for (int i = 0; i < jugadores.length; i++) {
      comandos.add(new CommandMoveTo(i, alineacion[i]));
    }
  }
예제 #7
0
  private double calculateFitness(
      Position position, double z, int iter, Position last, double lastZ) {
    int oppIterToBall =
        ChimueloTacticUtils.calculateIterToBall(
            position,
            z,
            currentSituation.rivalPlayers(),
            currentSituation.rivalPlayersDetail(),
            currentSituation.rivalIterationsToKick());
    double Dx = position.getX() - last.getX();
    double Dy = position.getY() - last.getY();

    if (!position.isInsideGameField(0)) {
      if (position.getY() > Constants.LARGO_CAMPO_JUEGO / 2) {
        double posX =
            (Dx / Dy) * (Constants.LARGO_CAMPO_JUEGO / 2 - position.getY()) + position.getX();
        double Dz = z - lastZ;
        double posZ = (Dz / Dy) * (Constants.LARGO_CAMPO_JUEGO / 2 - position.getY()) + z;
        if (posZ <= Constants.ALTO_ARCO
            && Math.abs(posX) < Constants.LARGO_ARCO / 2 - Constants.RADIO_BALON
            && z - Dz <= Constants.ALTO_ARCO) {
          double fvel = Math.sqrt(Dx * Dx + Dy * Dy) / Constants.REMATE_VELOCIDAD_MAX;
          double fiter = Math.max(0, Math.min(1, (oppIterToBall - iter) / 75.0));
          double fx =
              Math.max(
                  0,
                  Math.min(
                      1, 1 - Math.abs(posX) / (Constants.LARGO_ARCO / 2 - Constants.RADIO_BALON)));
          return 1 + .40 * fvel + .45 * fiter + .15 * fx;
        }
      }
      return -1;
    }
    if (oppIterToBall <= iter) {
      double fdist = Math.max(0, Math.min(1, position.getY() / Constants.centroArcoSup.getY()));
      double fiter = Math.max(0.0, 1 - (iter - oppIterToBall) / 5.0);
      double fvel =
          Math.max(0, Math.min(1, Math.sqrt(Dx * Dx + Dy * Dy) / Constants.REMATE_VELOCIDAD_MAX));
      return -1 + (.3 * fdist + .1 * fiter + .6 * fvel);
    }
    return 0;
  }
예제 #8
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;
  }
  @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;
  }
예제 #10
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);
    }
  }
예제 #11
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;
  }