Un primer código para competir (III)
Tercer artículo de esta serie, mediante la cual podréis empezar a competir en CodedArena con vuestro personaje. En esta ocasión toca empezar a invocar hechizos.

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 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.
- Detectar al adversario.
- Acercarse al adversario.
- Seleccionar un hechizo, y empezar la lucha.
- Luchar a distancia.
- 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!