1

我正在尝试制作我的第一款游戏,一款控制台俄罗斯方块。我有一个类 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.
                }
            }
        }
4

2 回答 2

12

您正在寻找的是非阻塞控制台输入。

这是一个例子:

http://www.dutton.me.uk/2009/02/24/non-blocking-keyboard-input-in-c/

基本上,您会在 while 循环中检查Console.KeyAvailable,然后根据按下的键移动该片段。


            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;
                }
            }
于 2010-01-04T22:14:16.720 回答
1

您可以使用低级键盘挂钩,如下所示

于 2010-01-04T22:13:35.557 回答