¡Hola, Comunidad Coded!

En el artículo anterior hemos visto cómo detectar a nuestro adversario en CodedArena.

En este segundo artículo para preparar nuestro primer código básico de competición, vamos a centrarnos en la aproximación al adversario.

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


Acercarnos al adversario

Gracias al código que obtuvimos en el anterior artículo, ya sabemos quién es nuestro adversario.

¡Ahora toca acercarse!

Con la ayuda de un par de variables, dir_x y dir_y, que nos ayuden a determinar la dirección de desplazamiento en los ejes de coordenadas X e Y, y con algo de condicionales y comparaciones, llegaremos a destino.

¿Qué destino? De momento, ir hacia el punto (x, y) donde se encuentra el adversario, aunque se mueva.


¡ATENCIÓN!

Recordemos que CodedArena funciona con un eje de coordenados invertido respecto al eje Y, y que el punto 0,0 se encuentra en la esquina superior izquierda.

Que nuestro personaje vaya hacia la derecha hace que la coordenada X aumente, mientras que si va a la izquierda, disminuya.

Sin embargo, si nuestro personaje baja, su coordenada Y aumenta, no disminuye, mientras que si sube, la Y disminuye.


¡Vamos a ver el código!

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]

En primer lugar, hemos inicializado las variables dir_x y dir_y con los valores por defecto del movimiento que indican que no queremos hacer nada

dir_x = "none"
dir_y = "none"

Podríamos hacer inicializado las variables con la cadena vacía, "", porque los condicinales que hay a continuación de una forma u otra les van a cambiar el contenido. Valen las dos opciones, pero inicializar las variables con la cadena "none" en cierta forma deja claro el objetivo de las variables.

Una vez inicializadas las variable, vamos a establecer en primer lugar la dirección en el eje X.

Miramos si la coordenada x de nuestro personaje es más pequeña que la x del adversario

if self.x > target.x:

en cuyo caso significa que nuestro personaje se encuentra a la derecha del adversario, y por lo tanto queremos que se mueva hacia la izquierda, estableciendo la cadena left como valor de la variable dir_x:

    dir_x = "left"

Si no

else:

significa que nuestro personaje no está a la derecha, sino a la izquierda, y queremos que vaya hacia la derecha:

    dir_x = "left"

¿Y qué pasa si la X del personaje y la X del adversario coinciden? Por simplicidad del código, hemos determinado que entrará en el else, ya que la comparación self.x > target.x dará False.

El caso de la dirección en el eje Y, estableceremos el contenido de la variable dir_y. El caso es muy similar, pero debemos tener en cuenta la particularidad de los ejes de coordenadas de CodedArena.


¿Qué código tenemos hasta ahora?

Hasta ahora tenemos el siguiente 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]

Si probamos este código en una Escaramuza con uno de los bots, veremos que nuestro personaje se acerca hasta el adversario, hasta intentar estar prácticamente en las mismas coordenadas.

En definitiva, hemos creado un personaje un poco... pegajoso.


¿Qué hemos conseguido?

Bien, además de saber quién es nuestro adversario dentro de la lista mobs, ahora también hemos aprendido a aproximarnos a su posición.

De acuerdo... una aproximación quizá un poco demasiado cercana... Pero en breves veremos cómo resolver este problema, quedándonos a la distancia del hechizo que queramos.

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