【问题标题】:Trying to use delays in a loop while waiting for a response在等待响应时尝试在循环中使用延迟
【发布时间】:2018-12-01 21:25:05
【问题描述】:

我是 C# 的新手,在我开始接触技术含量更高的东西之前,我已经开始在控制台中创建一个基于文本的小游戏。在我的开始菜单上,我希望制作一个简单的炫酷'Press Enter to continue',它会循环打开和关闭,直到用户按下 Enter 键。

while (!enter)
{
    WhiteText();
    Console.SetCursorPosition(47, 15);
    Console.WriteLine("[Press 'Enter' to start game]");
    System.Threading.Thread.Sleep(2000);
    BlackText();
    Console.SetCursorPosition(47, 15);
    Console.WriteLine("[Press 'Enter' to start game]");
    System.Threading.Thread.Sleep(1000);
}

本质上,我希望在检查用户是否实际按下回车时重复该操作。我使用了带有ConsoleKeyInfo input = Console.ReadKey(); 的if 语句,然后检查他们是否按下了回车键。我的问题是我似乎无法让两者一起运行。这在控制台中甚至是可能的吗?

我真的希望我能以我有限的知识把这一点说清楚,对此的任何帮助或见解将不胜感激。

【问题讨论】:

  • “我对 C# 很陌生”——那么不要浪费你的时间让控制台做它真正不适合做的事情。这并不像看起来那样“初学者”。
  • 找到一些可以用 ReadLine 和 WriteLine 做的项目。
  • 好吧,ReadKey() 将阻塞 - 即在返回之前不会继续执行下一行,直到按下一个键才会执行。相反,您可以在循环中检查 Console.KeyAvailable 以查看是否已按下某个键,然后对其进行操作。

标签: c# while-loop timer sleep


【解决方案1】:

您可以在读取密钥之前使用 Console.KeyAvailable。 但是当用户按下输入时,输入只会在 Thread.Sleep 结束后被处理。所以用户会觉得很慢

bool show = true;
while (true)
{
    if (Console.KeyAvailable)
    {
        ConsoleKeyInfo key = Console.ReadKey(true);
        if (key.Key == ConsoleKey.Enter)
            break;
    }

    Console.ForegroundColor = show ? ConsoleColor.White : ConsoleColor.Black;

    Console.SetCursorPosition(47, 15);
    Console.WriteLine("[Press 'Enter' to start game]");
    System.Threading.Thread.Sleep(show ? 2000 : 1000);
    show = !show;
}

【讨论】:

  • 太好了,谢谢,我相信我可以加快开/关速度,使其对用户更具反应性。也谢谢你的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 2019-07-18
  • 1970-01-01
  • 2017-10-29
相关资源
最近更新 更多