9. Un enemigo móvil

Hacer que un enemigo se mueva no es especialmente difícil: preparamos sus coordenadas x e y (que podríamos llamar xe1, ye1 por eso de que son del primer enemigo), lo dibujamos cuando sea el momento de dibujar cosas en pantalla y cambiamos su x y su y en la zona de "mover enemigos".

La forma más simple de cambiar su posición es modificando su x (por ejemplo). Podemos aumentar su x una unidad en cada fotograma haciendo "x = x + 1;", que se puede abreviar "x++;"

Pero eso de siempre aumentar el valor de X puede provocar que nos salgamos pronto de la pantalla, y esto puede provocar que el enemigo no se vea o incluso que el programa falle al intentar escribir en posiciones no permitidas de la pantalla. En la mayoría de bibliotecas de juegos (como la que usaremos más adelante), se puede escribir fuera de la pantalla sin problemas, pero no en la "consola" que estamos usando todavía, así que lo que haremos es comprobar si llegamos al extremo de la pantalla, para hacer que entonces el enemigo "rebote" y vuelva por donde venía.

Hay varias formas de conseguirlo. En la mayoría de casos, pasan por no sumar siempre 1, sino un "incremento", que empezará valiendo 1 (para que se mueva hacia la derecha) pero que en ciertos momentos nos puede interesar cambiar a -1 (para que vuelva hacia la izquierda).

Lo podríamos hacer con una construcción como

if (xe1 == 0) incr1 = 1;
if (xe1 == 79) incr1 = -1;

o bien, en una única condición:

if ((xe1 == 0) || (xe1 == 79))
    incr1 = - incr1;

Yo usaré la segunda construcción. El juego completo podría quedar así:

// Primer mini-esqueleto de juego en modo texto
// Versión "d"
 
using System;
 
public class Juego03d
{
    public static void Main()
    {
        ConsoleKeyInfo tecla;
        int x = 40, y=12;
        int xo1 = 20, yo1 = 15;  // Obstáculo 1
        int xo2 = 25, yo2 = 5;   // Obstáculo 2
        int xo3 = 62, yo3 = 21;  // Obstáculo 3
        int xe1 = 10, ye1 = 10, incr1 = 1;  // Enemigo 1
        int fin = 0;   // 0 = no terminado, 1 = terminado
 
        // Bucle de juego
        while( fin == 0 )
        {
            // Dibujar
            Console.Clear();
            Console.SetCursorPosition(x, y);
            Console.Write("A");
 
            Console.SetCursorPosition(xo1, yo1); // Obstáculos
            Console.Write("o");
 
            Console.SetCursorPosition(xo2, yo2);
            Console.Write("o");
 
            Console.SetCursorPosition(xo3, yo3);
            Console.Write("o");
 
            Console.SetCursorPosition(xe1, ye1); // Enemigo
            Console.Write("@");
 
            // Leer teclas y calcular nueva posición
            tecla = Console.ReadKey(false);
 
            if(tecla.Key == ConsoleKey.RightArrow) x++;
            if(tecla.Key == ConsoleKey.LeftArrow) x--;
            if(tecla.Key == ConsoleKey.DownArrow) y++;
            if(tecla.Key == ConsoleKey.UpArrow) y--;
 
            // Mover enemigos, entorno
            xe1 = xe1 + incr1;
 
            if ((xe1 == 0) || (xe1 == 79))
                incr1 = - incr1;
 
            // Colisiones, perder vidas, etc
            if ( ( (x==xo1) && (y==yo1) )
                || ( (x==xo2) && (y==yo2) )
                || ( (x==xo3) && (y==yo3) )
               )
               fin = 1; 
 
            // Pausa hasta el siguiente "fotograma" del juego
            // NO TODAVIA
        }
    }
}
 

Se puede ver que todavía "no es muy real": el enemigo se mueve, pero sólo cuando nosotros nos movemos. Lo solucionaremos en el siguiente apartado.

Ejercicio propuesto: Añade un segundo enemigo que también se mueva.