¡Hola, Comunidad Coded!

En el artículo anterior hemos visto cómo invocar un hechizo en CodedArena.

En este tercer artículo para preparar nuestro primer código básico de competición, vamos a centrarnos en la mantener la distancia con el adversario, o por lo menos no acercarnos constantemente encima suyo.

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 cuarto artículo!


Manteniendo la distancia

¡Recordemos al pobre Trickster! ¡Nuestro personaje constantemente persiguiéndole!

Recordemos también que no queremos que nuestro personaje luche cuerpo a cuerpo. Queremos que nuestro personaje se acerque a distancia de Lightning, y que luche a distancia. Y si el hechizo no está disponible, ¡no queremos acercarnos!

Vamos a solucionar el problema. Veamos una pequeña modificación del código que obtuvimos en el artículo anterior:

target = None

for mob in mobs:
    if mob.name != self.name:
        target = mob
        break
        
if self.distance_to(target) > self.max_distance_of("lightning"):
    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]
else:
    if self.is_ready("lightning") and self.mana >= self.cost_of("lightning"):
        return ["cast", "lightning", target]

¿Qué hemos cambiado?

Hemos cambiado la forma como entendemos el programa, una vez hemos visto sus defectos, lo que no nos gusta.

Y ésto es muy importante cuando programamos.

Como pasa con los escritores y los borradores de sus obras literarias. Los revisan, y rehacen capítulos o páginas si al repasar la historia algo no les encaja o no les gusta.

En nuestro caso, hemos entendido que lo que queremos en realidad hacer es:

  1. Detectar al adversario.
  2. Si está demasiado lejos para atacarle con un Lightning, nos movemos en la dirección adecuada.
  3. Si en cambio está a diatancia del Lightning, lo invocamos.

Es decir, hemos replanteado la estrategia, y por lo tanto debemos replantear el código.

Lo que hemos hecho es restructurar el código un poco, dividiendo el largo condicional

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]

en la parte de comprobación de la distancia

if self.distance_to(target) > self.max_distance_of("lightning"):

y cambiando el signo de comprobación, de <= a >, porque ahora queremos saber si el objetivo está lejos, no al alcance del Lightning, como antes.

Y después hemos dejado el resto del condicional dentro del else que nos indica que estamos a distancia de lightning, y por lo tanto podemos comprobar si lo podemos lanzar:

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

¡Vamos a ver los resultados!

¡Ahora sí! ¡Nuestro personaje se queda a distancia de invocación de Lightning, y no se acerca cuerpo a cuerpo!

*De lejos se escucha un suspiro de alivio..."

De acuerdo... Si el adversario se nos aproxima, no nos alejamos para mantenernos a distancia de Lightning, pero ese código ya es algo más elaborado, y lo trataremos en otra serie de artículos, próximamente.


¿Qué hemos conseguido?

Una vez sabemos quién es nuestro adversario, cómo aproximarnos, cuando y como lanzar un hechizo, ahora ya sabemos mantenernos a distancia, o por lo menos no acercarnos constantemente.

En el próximo artículo veremos cómo curar a nuestro personaje.

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