¡Hola, Comunidad Coded!

En el artículo anterior hemos visto cómo aproximarnos a nuestro adversario en CodedArena.

En este tercer artículo para preparar nuestro primer código básico de competición, vamos a centrarnos en mantenernos a distancia de invocación de un hechizo, y cómo dejar que aproximarnos constantemente al adversario.

Recordad que esta serie consta de los siguiente artículos.

  1. Detectar al adversario.
  2. Acercarse al adversario.
  3. Seleccionar un hechizo, y empezar la lucha.
  4. Luchar a distancia.
  5. Comprobar la vida del personaje, y curarle o atacar, según la situación.

¡Vamos allá con el tercer artículo!


¡Llega la acción!

¡Es hora es escoger un hechizo para atacar! Por simplicidad, y por ser el primero al que nuestro personaje tiene acceso, utilizaremos Lightning.

Utilizaremos un condicional, y unas cuantas comprobaciones lógicas con funciones de nuestro personaje como is_ready() o max_distance_of(), para lanzar el hechizo de forma correcta, y a la distancia adecuada:

if self.is_ready("lightning") \ 
   and \
   self.distance_to(target) <= self.max_distance_of("lightning")  \
   and \
   self.mana >= self.cost_of("lightning"):
   return ["cast", "lightning", target]

¡ATENCIÓN

Por temas de espacio, legibilidad y comodidad para explicar los pasos, hemos dividido las condiciones lógicas por líneas, con el símbolo \, el cual nos permite con Python dividir en varias línas una única sentencia.

Podríamos haber escrito todo el condicional en una única línea, y funcionaría igual.


¡Vamos a ir paso a paso!

Nuestro personaje le lanzará un rayo al adversario

   return ["cast", "lightning", target]

si se cumple que el hechizo Lightning está disponible y no se está enfriando (cooldown)

if self.is_ready("lightning")

y

   and

nuestro adversario está a menor o igual distancia que la distancia máxima de lanzamiento del hechizo Lightning

   self.distance_to(target) <= self.max_distance_of("lightning")

y

   and

nuestro personaje más maná que lo que cuesta invocar el hechizo

   self.mana >= self.cost_of("lightning"):

Así pues, si se cumplen todas las condiciones, nuestro personaje lanzará Lightning al adversario.


¿Dónde ponemos este código?

Si, ya... pero... ¿dónde ponemos este código?

¡Gran pregunta! Vamos a ver algunas opciones.

Al final del código

Primera opción, y completamente errónea: al final del código.

target = None

for mob in mobs:
    if mob.name != self.name:
        target = mob
        break
        
dir_x = "none"
dir_y = "none"

if self.x > target.x:
    dir_x = "left"
else:
    dir_x = "right"

if self.y > target.y:
    dir_y = "up"
else:
    dir_y = "down"
    
return ["move", dir_x, dir_y]

if self.is_ready("lightning") \
   and \
   self.distance_to(target) <= self.max_distance_of("lightning")  \
   and \
   self.mana >= self.cost_of("lightning"):
   return ["cast", "lightning", target]

¡Meeeeeeeeh! La línea return ["move", dir_x, dir_y] parará la ejecución del código exactamente ahí, impidiendo que el flujo de ejecución del programa de Python llegue hasta el condicional de invocación del Lightning.

Tenemos un problema...

¿Y antes del return?

Probemos...

target = None

for mob in mobs:
    if mob.name != self.name:
        target = mob
        break
        
dir_x = "none"
dir_y = "none"

if self.x > target.x:
    dir_x = "left"
else:
    dir_x = "right"

if self.y > target.y:
    dir_y = "up"
else:
    dir_y = "down"

if self.is_ready("lightning") \
   and \
   self.distance_to(target) <= self.max_distance_of("lightning")  \
   and \
   self.mana >= self.cost_of("lightning"):
   return ["cast", "lightning", target]

return ["move", dir_x, dir_y]

¡Esto ya tiene mejor pinta!

Si se cumple el condicional de invocación del hechizo, con todas sus condiciones (distancia, maná y disponibilidad), podemos atacar al adversario con todas las garantías.

Si por el contrario no se cumple el condicional, como ya habíamos determinado la dirección en los ejes X e Y, nos moveríamos hacia el adversario.

¡Problema resuelto...!

**¿O no...? **

Veamos qué pasa si probamos el código de nuestro personaje.

¡Pobre Trickster! ¡Nuestro personaje sigue siendo un incordio persiguiéndole!

Arreglaremos este problema en el próximo artículo.


¿Qué hemos conseguido?

Una vez sabemos quién es nuestro adversario, y cómo aproximarnos, ahora ya sabemos cuando y como lanzar un hechizo.

En el próximo artículo veremos cómo mantener la distancia con nuestro adversario.

¡Nos vemos en el próximo artículo!