反应时间游戏中Thread.Sleep期间按键触发ReadKey的问题
解决反应时间游戏的按键提前触发问题
你的问题根源在于Thread.Sleep期间用户按下的按键会被存入控制台输入缓冲区,当Console.ReadKey(true)执行时会直接读取这些提前按下的按键,导致反应时间计算完全失真。
解决方法很简单:在显示"NOW:"并开始计时之前,先清空输入缓冲区里的所有预输入按键。可以通过循环检查Console.KeyAvailable,如果有未读取的按键就调用Console.ReadKey(true)丢弃掉。
修改后的代码如下:
// 随机等待1-5秒 Thread.Sleep(rnd.Next(1000, 5000)); // 清空输入缓冲区,丢弃Sleep期间按下的所有按键 while (Console.KeyAvailable) { Console.ReadKey(true); } // 提示用户并开始计时 Console.Write("NOW: "); long start = DateTime.Now.Ticks; Console.ReadKey(true); long timePassed = DateTime.Now.Ticks - start; Console.WriteLine(timePassed < 5_000_000 ? "Fast" : "Slow");
关键说明:
Console.KeyAvailable:检查控制台输入缓冲区是否有未读取的按键,返回true表示有按键等待读取。- 循环调用
Console.ReadKey(true):true参数表示不将按键字符输出到控制台,直接丢弃这些提前输入的按键,确保后续的ReadKey只会捕获用户在看到"NOW:"之后的按键操作。
这样就能保证游戏的公正性,用户必须在看到提示后按下按键才会被计入反应时间。
内容的提问来源于stack exchange,提问作者callumetheridge
相关产品推荐
相关产品推荐

