¡Hola, Comunidad Coded!

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

En este cuarto 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 estar constantemente encima suyo.

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


Manteniendo la distancia

¡Recordemos al pobre Dummy! ¡Nuestro personaje constantemente encima bailándole!

Nuestro personaje queremos que lance hechizos a distancia, así que no queremos que se aproxime a distancia de lucha 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 probado el código, y hemos visto sus defectos, aquello que no nos gusta, debemos modificarlo.

Y ésto es muy importante cuando programamos.

A los programadores les pasa como a los escritores con 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 hacia sus coordenadas.
  3. Si en cambio está a distancia del Lightning, invocamos el hechizo.

Hemos replanteado la estrategia. 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]

extrayendo 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 >. Ahora queremos saber si el objetivo está demasiado lejos del alcance del Lightning.

Hemos dejado el resto del largo 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]

Probando el código

¡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, cuándo y cómo 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, Comprobando la vida de nuestro personaje, y actuar según la situación!


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