33. Frontón (2): Ladrillos

Una vez que tenemos la pelota que rebota, el siguiente paso es añadir los ladrillos.

Los podríamos dibujar con varios WriteLine, pero parece más razonable crear un array de "strings", de modo que podamos modificar esa estructura que hay que dibujar. Podríamos incluso usar caracteres distintos, como:

string[] ladrillos =
{ 
  "-------=-------=-------=-------=----------------",
  "------=-=-----=-=-----=-=-----=-=---------------",
  "-----=---=---=---=---=---=---=---=--------------",
  "----=-----=-=-----=-=-----=-=-----=-------------",
  "---=-------=-------=-------=-------=------------"
};

Y dibujaríamos este array completo nada más borrar la pantalla:

Console.Clear();
  foreach( string filaLadrillos in ladrillos)
    Console.WriteLine( filaLadrillos );

Pero es que borrarlo sería casi igual de fácil: si la pelota está dentro de las coordenadas de los ladrillos, y en una posición que que no sea un espacio en blanco, cambiamos esa casilla por un espacio y hacemos que la pelota rebote ("dando la vuelta" a su incremento vertical):

// Compruebo colisiones con el fondo
if ( ( y < ladrillos.Length)// Si estoy en vertical dentro del fondo
  && ( x < ladrillos[0].Length) // Y en horizontal
  && (ladrillos[y][x] != ' ')) // Y hay ladrillo
{
  incrY = - incrY;
  // Borrar: en 2 pasos, C# no permite modificar un carácter de un string
  ladrillos[y] = ladrillos[y].Remove(x, 1);
  ladrillos[y] = ladrillos[y].Insert(x, " ");
}

El fuente completo quedaría:

// Fronton - version 1: pelota que rebota y
// choca con los ladrillos (a veces falla en la
// primera línea)
 
using System;
using System.Threading;
 
public class Fronton02
{
  public static void Main()
  {
    char pelota = 'O';
    int x = 40; // Posición de la pelota
    int y = 12;
    int incrX = 1; // Incremento (velocidad) de la pelota
    int incrY = -1;
    int minX = 0, maxX = 79; // Límites horizontales
    int minY = 0, maxY = 23; // Límites verticales
    bool terminado = false;
 
    // Ladrillos del fondo
    string[] ladrillos =
      { 
        "-------=-------=-------=-------=----------------",
        "------=-=-----=-=-----=-=-----=-=---------------",
        "-----=---=---=---=---=---=---=---=--------------",
        "----=-----=-=-----=-=-----=-=-----=-------------",
        "---=-------=-------=-------=-------=------------"
      };
 
 
    do
    {
      // Dibujo los ladrilos y la pelota
      Console.Clear();
      foreach( string filaLadrillos in ladrillos)
        Console.WriteLine( filaLadrillos );
      Console.SetCursorPosition(x, y);
      Console.Write(pelota);
 
      // Compruebo colisiones con el fondo
      if ( ( y < ladrillos.Length)// Si estoy en vertical dentro del fondo
      && ( x < ladrillos[0].Length) // Y en horizontal
      && (ladrillos[y][x] != ' ')) // Y hay ladrillo
      {
        incrY = - incrY;
        // Borrar: no puedo hacer "ladrillos[y][x] = ' ';"
        ladrillos[y] = ladrillos[y].Remove(x, 1);
        ladrillos[y] = ladrillos[y].Insert(x, " ");
      }
 
      // Compruebo si llego al límite de la pantalla
      if ( (x <= minX) || (x >= maxX) )
        incrX = -incrX;
      if ( (y <= minY) || (y >= maxY) )
        incrY = -incrY;
 
      // Y paso a la siguiente posición
      x += incrX;
      y += incrY;
 
      // Y espero un poco hasta el siguiente fotograma
      Thread.Sleep( 40 );
    }
    while (!terminado);
  }
}
 

Ejercicio propuesto: Mejora esta versión del juego, para que la pared de ladrillos ocupe todo el ancho de la pantalla.