|
Visit the APOCALYX BLOG!
| | | | | | | |
Jrobots FAQ
[English] [Italiano] [Español]
"CARGAS"
- Para agregar un nuevo
robot, necesitas mi programa Java para
compilarlo y agregarlo a tus
archivos?
Como cargo mi robot luego de hacerle
modificaciones? Debo enviar el archivo con el mismo nombre o utilizar un
nuevo nombre?
Seguí todas las instrucciones, pero el
programa "cargador" me rechaza el robot. Por qué?
Envié un robot al sitio y su nombre
aparece en la lista, pero cuando lo selecciono para competir, no aparece
en la Arena. Por qué?
DESARROLLO
- Por qué la Arena no respeta la
convención estándar para el manejo de coordenadas y ángulos?
- Como puedo depurar mi robot y ver que
está sucediendo dentro del código?
- Cuando un robot muere, el simulador no
podría invocar el método finalize() sobre ese robot? Lo necesito ya que
tengo variables estáticas que se incrementan cuando los robots son
creados.
"CARGAS"
- P:
Para agregar un nuevo robot, necesitas mi
programa Java para compilarlo y
agregarlo a tus archivos?
R:
No. Puedes compilar y testear tu robot usando el paquete off-line y
luego debes cargar el archivo .class en el sitio. Ese archivo es
automáticamente reconocido por el applet que ejecuta los torneos.
- P:
Como cargo mi robot luego de hacerle modificaciones? Debo enviar el
archivo con el mismo nombre o utilizar un nuevo nombre?
R: Debes enviar el
archivo con el mismo nombre. El archivo anterior es sobrescrito y el
nuevo robot hereda los resultados de su predecesor. Si lo cargas con
un nuevo nombre, será considerado como un nuevo robot ... que también
competirá contra tu versión anterior.
- P:
Seguí todas las instrucciones, pero el programa "cargador" me rechaza el
robot. Por qué?
R:
1º Posibilidad: En el programa que controla tu robot, agregaste un
"catch" para manejar una excepción y en el archivo ..class aparece la
clase java.lang.Exception. En este caso has quebrado una regla: "No
puedes usar las clases de las API de Java en el código de tu robot".
2º Posibilidad: En el programa que controla tu robot,
incluiste la clase java.lang.Math para usar la constante PI.
Debes definir la constante PI dentro del código de tu robot.
- P:
Envié un robot al sitio y su nombre aparece en la lista, pero cuando lo
selecciono para competir, no aparece en la Arena. Por qué?
R: 1º Posibilidad:
Lamentablemente los robots no pueden usar clases internas. Todos los
algoritmos deben estar definidos en una sola clase, y seguramente tu
robot usa dos clases MiRobot.class y MiRobot$1.class. Dado que solo
puedes definir una clase, MiRobot$1.class fue eliminada de la versión
on-line y se produjo una excepción que eliminó tu robot.
DESARROLLO
- P: Por
qué la Arena no respeta la convención estándar para el manejo de
coordenadas y ángulos?
R: Se usa una convención diferente
para acelerar las simulaciones en máquinas
lentas, y lograr una simplificación de
los cálculos. De todas maneras no es gran problema, ya que los robots no
pueden ver dentro del applet, y tu podrías ver la
Arena cabeza abajo ;-)
- P:
Como puedo depurar mi robot y ver que está sucediendo dentro del código?
R: Si usas el JDK y el
appletviewer, es realmente simple. Por ejemplo puedes usar este código
para imprimir la variable 'a': System.out.println("El valor de 'a' es: "+a);
De esta forma usas una de las clases de Java para
imprimir en la ventana de comandos DOS en la que ejecutaste el
appletviewer. La interfaz gráfica no será afectada.
Recuerda que debes remover todas esas líneas cuando
envías el robot a la Arena, ya que el programa cargador rechaza los
robots que contienen clases Java. Si no
usas el JDK y sus comandos de línea, sino una herramienta de
desarrollo más compleja, la
depuración depende de las facilidades que provea esa herramienta.
- P:
Cuando un robot muere, el simulador no podría invocar el método
finalize() sobre ese robot? Lo necesito ya que tengo variables estáticas
que se incrementan cuando los robots son creados.
R: Existe un problema
de seguridad al usar finalize(). Este método debe ser invocado desde
la hebra (thread) principal cuando un robot muere, y de esta manera
la hebra (thread)
principal le daría el control al robot. Alguien podría colocar un
ciclo
infinito dentro del finalize() para detener la ejecución y evitar un
resultado negativo. Para identificar los robots
utiliza el método id() en el inicio del main(). Este método devuelve un
identificador único de acuerdo al orden de creación de los robots.
Si tienes más preguntas,
envía un mail.
| | | | | | | | |
|