Консольное программирование тетриса на C#.Заставить детали двигаться?
Вопрос
Я пытаюсь сделать свою первую игру — консольный тетрис.У меня есть класс Block, который содержит целые числа x и y.Тогда у меня есть класс Piece : List<Block>
, и класс Pieces : List<Piece>
.
Я уже могу случайным образом генерировать кусочки и заставлять их падать по одному ряду в секунду.До обнаружения коллизий я еще не добрался, но думаю, что уже знаю, как это решить позже.Проблема в том, что я не умею управлять фигурами.Я немного прочитал о перехвате клавиатуры и проверил несколько руководств по тетрису, но большинство из них предназначены для форм Windows, что действительно упрощает обработку событий и тому подобное.
Так...Подскажите пожалуйста начало пути к управлению штуками на консоли?Спасибо!
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.
}
}
}
Решение
То, что вам нужно, — это неблокирующий консольный ввод.
Вот пример:
http://www.dutton.me.uk/2009/02/24/non-blocking-keyboard-input-in-c/
В принципе, вы бы проверили Console.KeyAvailable в цикле while, а затем переместите фрагмент в зависимости от того, какая клавиша была нажата.
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;
}
}
Другие советы
Вы можете использовать низкоуровневый хук клавиатуры, как показано на рисунке. здесь