Buscar
Social
Ofertas laborales ES

Foro de la JavaCup > Bugs en el nuevo motor con tacticas antiguas

Estoy desarrollando una táctica con las modificaciones del framework y cuando la pongo a jugar contra tácticas del 2012, en algunas ocasiones se queda en un bucle, iteraciones deja de incrementarse pero iteracionesReal hace overflow.

En concreto si pongo a jugar Hortaleza vs LaMasia, siempre ocurre esto en algún momento del bucle.

iteraciones se incrementa cuando !sacaLocal && !sacaVisitante, se queda bloqueado con estas dos tácticas cuando saca uno de ellos, quizá la táctica esté mal.

:)

septiembre 4, 2013 | Unregistered CommenterBuffon

Es cierto, esto pasa con mucha frecuencia, pero no solo con estas dos tácticas y no en todos los saques. No creo que sea un problema de las tácticas porque el juego sigue, es decir, ninguna de las dos tácticas entran en un bucle infinito. Se siguen ejecutando las iteraciones pero a ninguno de los dos equipos se le permite golpear el balón.

Saludos.

septiembre 4, 2013 | Unregistered Commenterosorio

Gracias Buffon intentaré reproducir el error para subsanarlo. Ya lo intenté anteriormente, pero nunca entraba en dicho bucle las tácticas que probé. A ver si con la combinación que me indicas puedo dar con la tecla.

Saludos.

septiembre 4, 2013 | Unregistered CommenterVictor

Creo que encontré el error. En el método corregirDistanciaSaque, cuando la nueva posición p está fuera del campo de juego (if (!p.isInsideGameField(0))), se intenta cambiar la posición para una dentro del terreno de juego, lo que sucede es que en ocasiones la nueva posición es la misma que tenia el jugador al iniciar la iteración. Por lo que el jugador contrario no se mueve del lugar, imposibilita el saque y el juego cae en un bucle infinito.

No se si es la mejor solución pero se me ocurrió que cambiando el ángulo con que se calcula p 180º es muy probable que esta nueva posición si esté dentro del campo y necesariamente siempre sera distinta a la posición original del jugador. Algo así como esto:

if (!p.isInsideGameField(0)){
ang += Math.PI;
p = new Position(posBalonNoSaca.getX() + Math.cos(ang) * (Constants.DISTANCIA_SAQUE + 1), posBalonNoSaca.getY() + Math.sin(ang) * (Constants.DISTANCIA_SAQUE + 1));
}

Al menos así no he tenido más problemas :)
Saludos.

septiembre 4, 2013 | Unregistered Commenterosorio

¡Genial! Osorio, realizaré los cambios que indicas y si todo va bien los aplicaré definitivamente al framework.

Gracias.

septiembre 5, 2013 | Unregistered CommenterVictor

Hola Victor,

Después de hacer pruebas entre RomedalusTeam y la Masia, veo que cuando el portero de la Masia no saca adecuadamente se cobra un tiro libre indirecto y si RomedalusTeam intenta disparar a meta directamente, también se pita el libre indirecto.

Pero lo que he observado es que al hacer un pase en ese punto y después lanzar a meta, no se está validando el fuera de lugar. No creo que este comportamiento sea adecuado.

septiembre 10, 2013 | Unregistered CommenterRomedal

Hola, Romedal, no sé si he comprendido bien. Cuando dices que el portero saca incorrectamente supongo que te refieres a que se le agota el tiempo de saque y pitan libre indirecto en el punto de saque de meta. ¿no?

septiembre 11, 2013 | Unregistered CommenterVictor

Hola Victor, en ese caso es que el portero toca el balón después de realizar el saque por lo que le cobran libre indirecto. Creo que lo que plantea Romedal es que en los libres indirectos no se verifica el fuera de juego, y según las reglas del fútbol sí que debería hacerse.

Saludos.

septiembre 11, 2013 | Unregistered Commenterosorio

Le echaré un vistazo al código, puede que haya algún problema a la hora de distinguir si se trata de un saque de meta o de un tiro libre indirecto en la meta contraria.

Gracias.

septiembre 11, 2013 | Unregistered CommenterVictor

Hola Victor,
Con respecto a los saques de puerta, Osorio tiene razón, ya que en los libres indirectos parece que no se está verificando el fuera de juego (al menos después de un mal saque de puerta).

Por otro lado, seguí teniendo problemas en algunos saques de banda dado que la función corregirDistanciaSaque verifica solo una vez si la posición de separación se encuentra dentro del campo. Ya que cuando ésta no se encuentra en el campo, se invierte el angulo. Lo malo, es que esta nueva posición puede quedar también fuera del campo (Casos en los que el saque de banda es cercano a alguna esquina). Por ende, probé la siguiente modificación y no he vuelto a tener problemas al respecto
La solución consiste en hacer cambios graduales en el angulo (90°) y verificar que la nueva posición se encuentre en el campo

Position p = new Position();
do {
p = new Position(posBalonNoSaca.getX() + Math.cos(ang) *(Constants.DISTANCIA_SAQUE + 1), posBalonNoSaca.getY() + Math.sin(ang) * (Constants.DISTANCIA_SAQUE + 1));
ang += Math.PI / 2;
} while ((!p.isInsideGameField(0)));

septiembre 19, 2013 | Unregistered CommenterRomedal