【问题标题】:Console.ReadKey not reliableConsole.ReadKey 不可靠
【发布时间】:2019-01-13 02:08:28
【问题描述】:

我有以下代码,它等待用户通过箭头键输入移动,或退出以结束程序。

Console.WriteLine(startNode.Render(true));
LevelState currentNode = startNode;
while (Console.ReadKey(true).Key != ConsoleKey.Escape)
{
    if (Console.ReadKey(true).Key == ConsoleKey.UpArrow)
    {
        Console.WriteLine("up");
        LevelState move = currentNode.StepInDirection(CardinalDirection.Up);
        if (move != null)
        {
            currentNode = move;
            Console.WriteLine(currentNode.Render(true));
        }
    }
    //ditto for the other 3 directions
}

但是,它只是偶尔承认我的输入。例如,如果我快速点击退出键,大多数时候什么都不会发生。所以 Console.ReadKey 方法对我来说似乎非常不可靠。有什么更好的选择?

【问题讨论】:

  • 您的读取键模式似乎错误
  • 您一直在循​​环中读取键,这是您的问题。在最坏的情况下,您需要按 ESC 的次数与循环中的 if (Console.ReadKey(true).Key == ... 行一样多。 (基本上,对于循环中出现的每个 Console.ReadKey(true),您都需要再次按一个键,然后才能返回 ESC 键检查...)
  • 不是在循环中多次读取键,而是每次循环迭代只读取一次键并将其分配给变量。然后检查这个变量的值是ESC键,还是其他键。
  • 看看Console.KeyAvailable:docs.microsoft.com/en-us/dotnet/api/…

标签: c# .net console console.readkey readkey


【解决方案1】:

您拨打ReadKey 的次数过多

这是一个更好的模式

ConsoleKey key;
while ((key = Console.ReadKey(true).Key) != ConsoleKey.Escape)
{
   if (key == ConsoleKey.UpArrow)
   {
      ///
   }
   //ditto for the other 3 directions

}

// read key once
ConsoleKey key = Console.ReadKey(true).Key;
while (key != ConsoleKey.Escape)
{
   if (key == ConsoleKey.UpArrow)
   {
      ///
   }

   //ditto for the other 3 directions
   key = Console.ReadKey(true).Key;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    相关资源
    最近更新 更多