Reglas

El juego consiste en programar el comportamiento de tu nave. El objetivo es destruir a la nave oponente la mayor cantidad de veces posible, evitando al mismo tiempo que tu oponente destruya tu nave.

Al inicio del juego ambas naves se ubican en un área cuadrada, en posiciones aleatorias y con 5 puntos de escudo. Cuando una nave atraviesa un borde reaparece por el lado contrario. Los disparos siguen la misma dinámica, aunque su alcance se limita a una distancia de tres cuartos del tamaño del área.

Cada vez que un disparo enemigo impacta en una nave, el escudo de esta disminuye en un punto. Al llegar el a 0 el escudo, la nave es destruida. Cuando destruyes la nave del oponente se te suma un punto y tu escudo se restaura completamente. Todas tus demás variables (velocidad, posición y dirección) se mantienen exactamente igual. La nave enemiga reaparece detenida en una nueva ubicación aleatoria.

Al final del tiempo estipulado para la ronda, el jugador que haya obtenido más puntos (es decir, quien haya destruido al oponente más veces) gana el partido.


Funcionamiento

La simulación es discreta y se actualiza unas 50 veces por segundo. El código que escribís se ejecuta en cada ciclo de la simulación.

La velocidad máxima que puede alcanzar tu nave es 5 unidades por ciclo. Los disparos se mueven a velocidad constante de 10 unidades por ciclo.

Podés efectuar un disparo cada 50 ciclos como máximo. Tu aceleración o desaceleración máxima es de 1/10 por cada ciclo y la rapidez con la que podés girar depende inversamente de la velocidad que tenga tu nave en el momento–en otras palabras, girás más rápido cuanto más despacio te estás moviendo.

Si el código que escribís contiene algún error, la simulación continúa ejecutando la última versión que no tenía errores. Esto te permite realizar cambios tranquilamente sin convertirte en un "sitting duck".

Por último, Code Games recuerda el último código que escribiste, incluyendo el de práctica, y lo utiliza para partidas nuevas. Así que si un torneo empieza y no podés estar online en ese momento, no te preocupes que se usará el último código registrado sin errores.


Referencia del lenguaje

El lenguaje con que programás tu nave es muy simple y tiene una sintaxis similar a Ruby. Las variables tienen un único tipo de dato (numérico) y no es necesario declararlas. El valor predeterminado para una variable no inicializada es 0.

El if .. else .. end es la estructura de control condicional básica.

if foo == 1 and bar > 2
  # foo es uno y bar es mayor a dos
else
  # foo no es uno, ó bar es menor o igual a 2
end

Podés utilizar las variables como condicionales. En ese caso, se considera como verdadero cualquier valor diferente de 0.

if enemy_visible
  # podemos ver la nave enemiga
else
  # seguir buscando...
end

Hay varias funciones matemáticas que podés usar (ver abajo). También podés definir tus propias funciones. Podés omitir los paréntesis cuando invoques una función que no tiene argumentos.

function foo()
  # una función sin parámetros
  return 5
end

function bar(x, y)
  return x + y
end

a = foo         # a == 5
b = bar(a, 3)   # b == 8

Para conocer el estado de tu nave y observar a tu oponente, hay algunas variables predeterminadas que podés evaluar en cualquier momento (ver referencia más abajo).

No existen estructuras de control de repetición y no podés usar recursión. Sin embargo, podés simular fácilmente estructuras de control ya que el código se ejecuta continuamente y los valores de las variables se mantienen de una ejecución a la siguiente.

# simular un for (i = 0; i < 5; i++) { ... }
# i vale 0 inicialmente y su valor se preserva entre ejecuciones del código
if i < 5
  # este bloque se ejecuta 5 veces seguidas
  i = i + 1
else
  # acá estamos fuera del "for"

  # volviendo i a 0 podemos ejecutar el ciclo nuevamente
  if rehacer_el_for
    i = 0
  end
end

Acciones

Las funciones básicas para mover tu nave y disparar son:

faster(impulse)
Aumenta la velocidad de tu nave, hasta un máximo de 5. El parámetro impulse es opcional y puede ser negativo (logrando un efecto igual a slower(impulse)). El valor del parámetro es proporcional a la aceleración. Con un impulso de 1 la nave acelera de 0 a 5 en 250 ciclos.
slower(impulse)
Disminuye la velocidad de tu nave o la detiene por completo. El parámetro impulse es opcional y puede ser negativo (logrando un efecto igual a faster(impulse)). El parámetro se comporta de forma análoga al caso de faster.
left(amount)
Gira la nave hacia la izquierda. El parámetro es opcional y puede ser negativo, en cuyo caso la función se comporta como right(amount). La velocidad de giro depende del valor del parámetro, con un máximo inversamente proporcional a la velocidad de la nave. Con la nave detenida y valor del argumento igual a 1, la nave realiza un giro completo de 360º en 300 ciclos aproximadamente.
right(amount)
Gira la nave hacia la derecha. El parámetro es opcional y puede ser negativo, en cuyo caso la función se comporta como left(amount). La velocidad de giro depende del valor del parámetro, con un máximo inversamente proporcional a la velocidad de la nave. Con la nave detenida y valor del argumento igual a 1, la nave realiza un giro completo de 360º en 300 ciclos aproximadamente.
fire
Efectua un disparo. Dado que existe la limitación de un máximo de 1 disparo cada 50 ciclos, es posible que fire no produzca ningún efecto. Por ello, la función devuelve un 1 si pudo efectuar el disparo y 0 en otro caso.
rift
Aumenta rápidamente la velocidad hasta 2.5 veces la velocidad actual de la nave por un período corto de tiempo. Existe un período de espera luego de usar esta funcionalidad de 150 ciclos, durante los cuales no es posible disparar ni volver a usar el rift.

Variables predeterminadas

direction
La dirección que apunta tu nave en grados sexagesimales, entre 0 y 360. El valor crece en sentido horario y el 0 apunta hacia arriba de la pantalla.
speed
La velocidad de tu nave, entre 0 y 5.
enemy_visible
1 si la nave enemiga es visible desde tu posición y dirección; 0 en caso contrario. El ángulo de visión de tu nave son 180º y la distancia máxima de visibilidad es 300, que equivale a la mitad del tamaño del área de juego.
enemy_angle
Ángulo relativo del enemigo respecto de tu dirección, entre -90 (a la izquierda) y 90 (a la derecha). Esta variable es 0 si la nave enemiga no está visible.
enemy_distance
Distancia a la nave enemiga, o 0 si no está visible.
energy
El valor de tu escudo, inicialmente 5. Si recibís un disparo con energy == 1 tu nave se destruye, reaparecés en una posición aleatoria con velocidad 0, y tu oponente recibe un punto. Tu energía también se restaura completamente cuando destruís la nave enemiga.
Variable

Funciones matemáticas

abs(x)
Valor absoluto de x.
sign(x)
Signo de x, tal que x == sign(x) * abs(x).
sin(x)
Seno de x dado en grados sexagesimales.
cos(x)
Coseno de x dado en grados sexagesimales.
tan(x)
Tangente de x dado en grados sexagesimales.
atan2(y, x)
Arco tangente de y/x en grados sexagesimales. El signo de x y de y determinan el cuadrante del ángulo resultado.
pi()
El valor de la constante π.
rand(min, max)
Devuelve un valor aleatorio entre los parámetros min y max. Si se omite min, devuelve un número aleatorio entre 0 y max. Si se omiten ambos parámetros el resultado está entre 0 y 1.
sqrt(x)
Raíz cuadradra de x.
pow(x, y)
y-ésima potencia de x.