## 3. Estructura (Structure)

En esta sección se describe la estructura del programa, como se mueven los robots, los disparos, el control del radar, la puntuación y como se monta un torneo.

## 3.1 Movimiento del Robot (Robot motion)

El Robot se comporta como un vehículo con ruedas, se mueve hacia adelante con un pequeño rozamiento (roll friction) y resbala hacia los laterales (derrapa) con un gran rozamiento lateral (sliding friction). El tercer efecto de resistencia es la resistencia del aire (air resistance), que es aplicada en dirección contraria al movimiento y que incrementa con la velocidad.

Hay tres formas de variar el movimiento del robot: acelerar (acceleration), rotar (rotation) y frenar (braking).

La aceleracion se usa para incrementar la velocidad de los robots en la dirección frontal. No es posible controlar directamente la velocidad. La aceleración es la unica manera de mover al robot.

Rotando el robot puedes hacer que este gire. Ten en cuenta que la rotación no afecta directamente al movimiento, si no que afecta unicamente a la direccion de la frontal del robot. La fricción junto con la aceleración, llevarán a cabo el giro del robot.

Cuando se frena se incrementa la fricción hasta llegar a un valor máximo. Este se da cuando las ruedas son bloqueadas y el robot, en lugar de rodar, derrapa. No te olvides de liberar el freno cuando quieras aumentar la velocidad otra vez.

## 3.2 Energía (Energy)

La salud del Robot es medida por su energía. Hay varias maneras de que el robot pierda energía. El robot puede:

- ser alcanzado por un disparo,
- chocar con un muro o con otro robot,
- 'pisar' una mina o
- disparar.

Y solo hay una manera de ganar energia: comer una cookie (N. del T. o galletita ;))

## 3.3 El radar (The radar)

El método principal para obtener información sobre nuestro entorno es mediante el radar. Cada vez que el robot es actualizado recibirá un mensaje del radar (radar message), dándole información sobre los objetos mas cercanos en la dirección actual del radar, por ejemplo la distancia y el tipo de objeto. Si detectamos un robot, nos mostrará el nivel de energía de dicho robot.

Ya que la información ofrecida por el radar es prácticamente lo único que conoceremos de nuestros alrededores, es muy importante hacer un uso óptimo del radar. Es también importante maniobrar lo mejor posible el radar, para obtener información útil.

## 3.4 Posición de los robots (The robots position)

A aprtir de la versión 1.0.5 de RTB es posible obtener la posición de los robots directamente. En lugar de tener que analizar los alrededores con el radar y encontrar tu posicion a partir de él, puedes configurar RTB para que mande las coordenadas del robot (robot coordinates). El comportamiento es controlado por la opcion enviar coordenadas del robot (Send robot coordinates).

## 3.5 Disparo (Shooting)

Disparar es el principal método de eliminar a los otros robots. En RealTimeBattle un disparo se mueve con una velocidad constante, calculada como la suma de la velocidad del robot mas la velocidad de disparo (shot speed) en la dirección hacia la que apunta el cañón. El disparo se moverá hasta que choque con un objeto.

Cuando se dispara un proyectil se le da una energia, que determina el daño que sufrirá el robot contra el que impacte. La energia es, no obstante, limitada; la energia minima (minimal energy) evita los disparos de muy baja energía, por ejemplo si quieres eliminar una mina. La energia maxima (maximal energy) esta restringida por la cantidad de la energia de disparo potencial del robot, que se incrementa con el tiempo.

El disparar conlleva asi mismo cierto riesgo, ya que al disparar el mismo robot pierde una cantidad de energía proporcional a la energia del disparo.

Si se impacta sobre una mina o una cookie, estas son destruidas, independientemente de la energia del disparo. Asi pues deberias usar una cantidad mínima de energía para disparar a las minas.

Los disparos que choquen no seran destruidos inmediatamente, sino que sus velocidades y sus energias seran superpuestas, con lo que si chocan dos disparos que viajan en la misma direccion, sus energías seran sumadas, y en caso de que choquen de frente, sus energías seran canceladas.

## 3.6 Choques (Collisions)

Los robots son objetos frágiles, que sufirán daños cuando choquen contra las paredes o contra otros robots. Cuando se choca, los robots son como pelotas, con tres factores que afectan su comportamiento el coeficiente de robote, el coeficiente de dureza y el coeficiente de protecciónt. En la parte delantera, los robots estan hechos de un material diferente, normalmente mas duro. Esto puede ser usado para arrollar a otros robots, haciendo mas daño del recibido.

## 3.7 Cookies y minas (Cookies and Mines)

Las cookies y las minas son esencialmente objetos iguales, con la diferencia que los robots ganarán energia tomando una cookie y perderán energía con las minas. Tanto las minas como las cookies son colocadas aleatoriamente en la arena durante el juego. Su potencia y su frecuencia pueden ser controladas mediante las opciones (options).

## 3.8 Tiempo (Time)

Como el propio nombre del programa indica, el tiempo que se usa es tiempo real. Es tarea de los robots responder rápidamente a los eventos del juego. El juego avanza con una frecuencia de refresco regular. Entre cada llamada los robots comparten el resto del tiempo de la CPU. Para prevenir que los robots utilicen masivamente el procesador, su tiempo de CPU esta limitado en el modo competición. Las opciones correspondientes te darán mayor informacion.

De todas formas, el tiempo real puede ser violado en algunos casos. Puedes aumentar o disminiur la velocidad del juego cambiando la escala de tiempo (timescale). Asimismo hay un metodo para prevenir el colapso del sistema, cuando la carga es demasiado alta. Si el tiempo entre dos refrescos es superior a max timestep, la velocidad del juego se reducira correspondientemente.

## 3.9 Un juego (A game)

Al comienzo de un juego, los robots seran dispuestos en una posición aleatoria en la arena, con una orientación aleatoria. El radar y el cañón estaran los dos apuntando al frente y la energia potencial de disparo (potential shot-energy) estará puesta a cero. El objetivo de los robots es sobrevivir el mayor tiempo posible a la vez que destruir los otros robots. Un robot recibirá un punto por cada robot enemigo que elimine. Asi mismo, se les dará un punto extra a cada uno de los robots participantes. Si dos robots mueren al mismo tiempo, se reparten los puntos amistosamente (en otras palabras, obtendrán medio punto por cada robot que muera al mismo tiempo).

Un juego finaliza cuando el numero de robots vivos es menor que dos o cuando finaliza el tiempo (time is up).

## 3.10 Una secuencia (A sequence)

Una secuencia es una serie de juegos, donde luchan los mismos robots. Al comienzo de una secuencia se inicias los procesos de los robots. El número de robots en una secuencia esta limitado a 120. Para cada robot se crean dos tuberias (pipes) para comunicarse con el robot.

A partir de entonces se juegan el número de juegos indicados y finalmente se eliminan los procesos de los robots.

## 3.11 Un torneo (A tournament)

Un torneo es una serie de secuencias. El numero de robots en un torneo es (teoricamente) ilimitado. Esta permitido Cualquier número de secuencias, pero para hacer un torneo agradable, deberás elegir un numero de secuencias de forma que cada robot compita en el mismo numero de juegos (por ejemplo #secuencia = #robots por juego / GCD( #robots por juego, #robots en el torneo)).