12. Arrays: simplificando la lógica

Ahora vamos a añadir 10 "premios" que (más adelante) podamos recoger para obtener puntos. Crear 10 variables X y 10 variables Y debería empezar a no parecer la solución más adecuada, y menos aún si hablamos de 100 premios en vez de 10.

Usaremos una única estructura de datos para guardar todas las X de esos 10 premios, como si se tratara de un cajón del que obtenemos una ficha concreta cuando nos hace falta. Esa estructura que contendrá esas 10 X juntas es lo que llamaremos una "tabla" o "array". Por ejemplo, podríamos prefijar 10 valores para las X de los premios haciendo:

int[] xPremio = {20,25,18,10,11,3,8,15,13,22};

De modo que xPremio[0] será la coordenada X del primer premio, y xPremio[9] será la del último.

En general, será más cómodo recorrer el array desde la posición 0 a la 9 de forma repetitiva, usando "for". Por ejemplo, podríamos mostrar los premios en pantalla haciendo:

for (int i=0; i<=9; i++)
{
    Console.SetCursorPosition(xPremio[i], yPremio[i]);
    Console.Write("/");
}

Hay programadores que prefieren que el contador del "for" llegue hasta 9, incluido (i<=9) y hay otros que prefieren expresarlo como que no llega hasta el 10 (i<10), así:

for (int i=0; i<10; i++)

En este ejemplo, usaremos esa segunda forma. De igual modo que dibujamos los premios de forma repetitiva, podemos darle valores al azar de forma repetitiva, en vez de dejar sus valores prefijados. Lo haremos en dos pasos: primero reservaremos espacio

int[] xPremio = new int[10];

y luego daremos valores:

Random generador = new Random();
for (int i=0; i<10; i++)
    xPremio[i] = generador.Next(0,80);

Y el fuente completo quedaría:

// Primer mini-esqueleto de juego en modo texto
// Versión "g"
 
using System;
using System.Threading; // Para Thread.Sleep
 
public class Juego03g
{
    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
        float xe1 = 10, ye1 = 10, incr1 = 0.5f;  // Enemigo 1
        int fin = 0;   // 0 = no terminado, 1 = terminado        
        int[] xPremio = new int[10]; // Premios
        int[] yPremio = new int[10]; 
 
        // Genero las posiciones de los premios al azar
        Random generador = new Random();
        for (int i=0; i<10; i++)
        {
            xPremio[i] = generador.Next(0,80);
            yPremio[i] = generador.Next(0,24);
        }
 
        // 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((int) xe1, (int) ye1); // Enemigo
            Console.Write("@");
 
            for (int i=0; i<10; i++)  // Premios
            {
                Console.SetCursorPosition(xPremio[i], yPremio[i]);
                Console.Write("/");
            }
 
            // Leer teclas y calcular nueva posición
            if (Console.KeyAvailable)
            {
                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
            Thread.Sleep(40);
        }
    }
}
 

Ejercicio propuesto: Mejora el juego para que los datos de los obstáculos también sean parte de un nuevo "array".