32. Frontón (1): Pelota que rebota

Como acercamiento a la forma de descomponer en juego en una serie de clases que colaboran, vamos a crear un nuevo proyecto sencillo: un juego de "frontón", una pelota que rebota en una pared formada por ladrillos, al estilo del clásico Arkanoid.

Para centrarnos en la lógica y no perder tiempo en detalles adicionales, nuestro juego será en modo consola.

La apariencia final será algo como:

Fronton, consola

En esta primera entrega, vamos a hacer que una pelota rebote en los bordes de la pantalla. Después añadiremos los "ladrillos" y la posibilidad de que la pelota "los rompa". A continuación, incorporaremos una raqueta manejada por el usuario de forma simultánea. Para finalizar, añadiremos la colisión de la pelota con la raqueta, varias vidas, etc.

La lógica de esta primera entrega debería ser simple:

  • Borrar la pantalla y dibujar la pelota en su posición actual
  • Calcular la próxima posición, sumando un cierto incremento a la posición actual
  • Si llegamos a un extremo de la pantalla, invertir el incremento correspondiente, para que la pelota se mueva en sentido contrario.
  • Esperar un instante (por ejemplo, 40 milisegundos, para que el juego se mueva a 25 fotogramas por segundo)
  • Repetir... indefinidamente.

Que se podría plantear así...

// Fronton - version 1: pelota que rebota
 
using System;
using System.Threading;
 
public class Fronton01
{
  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;
 
    do
    {
      // Dibujo la pelota
      Console.Clear();
      Console.SetCursorPosition(x, y);
      Console.Write(pelota);
 
      // 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 se pueda abandonar la partida pulsando ESC.