我可以将输入语句激活一段时间吗?

时间:2018-02-17 17:31:15

标签: c#

我最近开始在大学学习C#并挑战自己我决定在控制台应用程序中编写Snake游戏。 当我编码时,我最终遇到了以下问题: 整个游戏都放在一个循环中,只有当蛇撞到墙壁或自身时才会停止。但是,我在循环中有一个输入语句用于输入snake的方向,每当编译器到达这个输入语句时,整个程序就会停止并在继续循环之前等待用户的输入。

是否可以通过以下方式解决此问题: 使输入语句可用半秒钟。如果在那半秒内没有任何东西被输入,那么蛇就会向前移动。 如果这是可能的,可能有人向我提供了我如何编码这个。 谢谢。

编辑:我在理解答案方面遇到了一些麻烦。我将添加我的游戏循环的副本。

     while (isDone == false)
        {

            var ch = Console.ReadKey(false).Key;

            switch (ch)
            {
                case ConsoleKey.UpArrow:
                    direction = 'U';
                    break;
                case ConsoleKey.DownArrow:
                    direction = 'D';
                    break;
                case ConsoleKey.LeftArrow:
                    direction = 'L';
                    break;
                case ConsoleKey.RightArrow:
                    direction = 'R';
                    break;
            }
            if (hasEaten == true)
            {
                createFood(ref fruitX, ref fruitY, ref mapSize, map);
                hasEaten = false;
            }
            moveHead(ref HeadX, ref HeadY, ref TailX, ref TailY, ref fruitX, ref fruitY, map, ref direction, ref hasEaten, ref isDone, mapSize);
            if (isDone == true)
            {
                Console.WriteLine("YOU LOSE!");
            }

            //System.Threading.Thread.Sleep(500);
        }

2 个答案:

答案 0 :(得分:0)

您可以使用Console.KeyAvailable仅在按下命令时收听命令。

do { // Your main loop
    while (! Console.KeyAvailable) {
        // carry on with game
   }
   // Handle input here
   // for example, set a currentDirection varaible       
} while (Console.ReadKey(true).Key != ConsoleKey.Escape); // Escape to exit game loop

另一种可能性是使用事件在按键上运行一些代码,而无需阻止检查。

编辑: 你有没有键可用(即用户没有按键)然后做游戏逻辑,否则按下一个键所以处理第一个

while (isDone == false)
{
    while (! Console.KeyAvailable) {
        if (hasEaten == true)
        {
            createFood(ref fruitX, ref fruitY, ref mapSize, map);
            hasEaten = false;
        }
        moveHead(ref HeadX, ref HeadY, ref TailX, ref TailY, ref fruitX, ref fruitY, map, ref direction, ref hasEaten, ref isDone, mapSize);
        if (isDone == true)
        {
            Console.WriteLine("YOU LOSE!");
        }

    } 
        var ch = Console.ReadKey(false).Key;

        switch (ch)
        {
            case ConsoleKey.UpArrow:
                direction = 'U';
                break;
            case ConsoleKey.DownArrow:
                direction = 'D';
                break;
            case ConsoleKey.LeftArrow:
                direction = 'L';
                break;
            case ConsoleKey.RightArrow:
                direction = 'R';
                break;
        }

        //System.Threading.Thread.Sleep(500);
    }

答案 1 :(得分:0)

Console class中有一个简单的属性可以告诉您键盘的读缓冲区中是否有键,因此如果要更改逻辑,则可以测试此键。将KeyAvailable与您可以拥有的ConsoleKey enum结合起来:

static void Main(string[] args)
{
    ConsoleKey current = ConsoleKey.Z;
    Console.WriteLine("Waiting arrow key, press Q to exit");
    ConsoleKeyInfo keyinfo = new ConsoleKeyInfo('Z', current, false, false, false);
    do
    {
        if (Console.KeyAvailable)
        {
            keyinfo = Console.ReadKey();
            switch (keyinfo.Key)
            {
                case ConsoleKey.LeftArrow:
                case ConsoleKey.RightArrow:
                case ConsoleKey.UpArrow:
                case ConsoleKey.DownArrow:
                    current = keyinfo.Key;
                    break;
            }
        }
        else
        {
            if (current != ConsoleKey.Z)
            {
                // Here goes your logic to move the snake
                Console.WriteLine("Going: " + (current == ConsoleKey.LeftArrow ? "Left" :
                                             current == ConsoleKey.RightArrow ? "Right" :
                                             current == ConsoleKey.UpArrow ? "Up" :
                                             "Down"));

                // wait some ms before starting the next loop
                System.Threading.Thread.Sleep(200);
            }
        }

    }
    while (keyinfo.Key != ConsoleKey.Q);
}