Programación C # consola de Tetris. Hacer las piezas se mueven?
Pregunta
Estoy tratando de hacer mi primer juego, un tetris consola.
Tengo un bloque de clase, que contiene X e Y enteros. Entonces tengo una Piece : List<Block>
clase, y una Pieces : List<Piece>
clase.
Ya puedo generar aleatoriamente pedazos, y hacerlos caer una fila por segundo. Todavía no llegué a la detección de colisiones, pero creo que ya sé cómo hacerlo funcionar más tarde. El problema es que no sé cómo controlar las piezas. He leído un poco acerca de enganche teclado y comprobado algunos tutoriales Tetris, pero la mayoría de ellos son de formas de las ventanas, que realmente simplifica el manejo de eventos y el ejemplo.
Así que ... ¿Me podría indicar el comienzo de la ruta de acceso al control de las piezas en una consola? Gracias!
public class Program
{
static void Main(string[] args)
{
const int limite = 60;
Piezas listaDePiezas = new Piezas(); //list of pieces
bool gameOver = false;
Pieza pieza; //piece
Console.CursorVisible = false;
while (gameOver != true)
{
pieza = CrearPieza(); //Cretes a piece
if (HayColision(listaDePiezas, pieza) == true) //if there's a collition
{
gameOver = true;
break;
}
else
listaDePiezas.Add(pieza); //The piece is added to the list of pieces
while (true) //This is where the piece falls. I know that I shouldn't use a sleep. I'll take care of that later
{
Thread.Sleep(1000);
pieza.Bajar(); //Drop the piece one row.
Dibujar(listaDePiezas); //Redraws the gameplay enviroment.
}
}
}
Solución
Lo que se busca es la consola de entrada no bloqueante.
Aquí es un ejemplo:
http: // www .dutton.me.uk / 2009/02/24 / no bloqueo-teclado-input-en-c /
Básicamente, se comprobaría Console.KeyAvailable en su bucle de tiempo y luego mover la pieza de acuerdo con lo que ha pulsado la tecla.
if (Console.KeyAvailable)
{
ConsoleKeyInfo cki = Console.ReadKey();
switch (cki.Key)
{
case ConsoleKey.UpArrow:
// not used in tetris game?
break;
case ConsoleKey.DownArrow:
// drop piece
break;
case ConsoleKey.LeftArrow:
// move piece left
break;
case ConsoleKey.RightArrow:
// move piece right
break;
}
}
Otros consejos
Se puede usar un gancho de teclado de bajo nivel, como se muestra aquí