¡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 lanzar el hechizo Lightning de forma correcta, una vez nos hayamos acercado al adversario.

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

  1. Detectando al adversario.
  2. Acercándonos al adversario.
  3. Seleccionando un hechizo, y empezando la lucha.
  4. Luchando a distancia.
  5. Comprobando la vida de nuestro personaje, y actuar según la situación.

¡Vamos allá con el tercer artículo!


¡Llega la acción!

¡Es hora de 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 una línea larga en varias más cortas.

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 (no se está enfriando)

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 (es decir, está al alcance del hechizo de rayo)

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

y

   and

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

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

Si se cumplen todas las condiciones, nuestro personaje lanzará el hechizo Lightning sobre el 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 Dummy! ¡Nuestro personaje sigue siendo un incordio bailándole cerca!

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 cuándo y cómo 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, Seleccionando un hechizo, y empezando la lucha!


Si os ha gustado este artículo y queréis saber qué es CodedArena, no dudéis en poneros en contacto con nosotros.

También podéis seguirnos en nuestras redes sociales:

https://twitter.com/codedarena
https://instagram.com/codedarena
https://www.youtube.com/channel/CodedArena
https://facebook.com/codedarena