Консольное программирование тетриса на C#.Заставить детали двигаться?

StackOverflow https://stackoverflow.com/questions/2002623

  •  18-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь сделать свою первую игру — консольный тетрис.У меня есть класс 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;
                }
            }

Другие советы

Вы можете использовать низкоуровневый хук клавиатуры, как показано на рисунке. здесь

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top