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; }
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); }
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; }
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; }
private boolean existeJugadorRivalCercaDeBalon(GameSituations sp) { boolean result = false; for (Position rival : sp.rivalPlayers()) { if (rival.distance(sp.ballPosition()) < 10) { result = true; break; } } return result; }
/** * 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])); } }
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; }
@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; }
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); } }
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; }