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.