Atención: Contenido visualmente obsoleto. Contiene imágenes y reproducciones animadas de CodedArena 1.0.

La nueva versión del artículo la podéis encontrar aquí.


¡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!