我正在做一个反射游戏.这是输出 -
__________________________________________________________________________
Reflex game initiated. Press ENTER to begin the game, and then press ENTER
after the asterisks are printed to measure your reflexes!.
*************************
Your result: 0.285606 seconds.
logout
[Process completed]
__________________________________________________________________________
Run Code Online (Sandbox Code Playgroud)
但是有一个小问题 - 按下Enter键开始游戏之后和星星打印之前有0-10秒(基于随机变量).在此期间,如果玩家按下ENTER,则将其记录为反射时间.所以我需要一种方法来阻止我的代码在打印星星之前读取他们的ENTER按钮.代码 -
#!/usr/bin/perl
use Time::HiRes qw(sleep);
use Time::HiRes qw(gettimeofday);
#random delay variable
$random_number = rand();
print "Reflex game initiated. Press ENTER to begin the game, and then press ENTER after the asterisks are printed to measure your reflexes!.\n";
#begin button
$begin = <>;
#waits x milliseconds
sleep(10*$random_number);
#pre-game
$start = [ Time::HiRes::gettimeofday() ];
print "\n****************************\n";
#user presses enter
$stop = <>;
#post game
$elapsed = Time::HiRes::tv_interval($start);
#delay time print
print "Your result: ".$elapsed." seconds.\n";
Run Code Online (Sandbox Code Playgroud)
看起来Term::ReadKey可能会有所帮助。
#!perl
use strict;
use warnings;
use 5.010;
use Term::ReadKey;
say "I'm starting to sleep...";
ReadMode 2;
sleep(10);
ReadMode 3;
my $key;
while( defined( $key = ReadKey(-1) ) ) {}
ReadMode 0;
say "Enter something:";
chomp( my $input = <STDIN> );
say "You entered '$input'";
Run Code Online (Sandbox Code Playgroud)
发生的情况如下:
ReadMode 2意思是“将输入模式置于常规模式但关闭回显”。这意味着当您使用计算量大的代码时,用户执行的任何键盘敲击操作都不会回显到屏幕上。但它仍然会进入 的STDIN缓冲区,所以......ReadMode 3变成STDINcbreak 模式,这意味着STDIN每次按键后都会被刷新。这就是为什么...while(defined($key = ReadKey(-1))) {}发生。这会清除用户在计算成本较高的代码中输入的字符。然后...ReadMode 0Resets ,您可以像用户没有敲击键盘一样STDIN读取内容。STDIN当我运行此代码并在 期间敲击键盘sleep(10),然后在提示后输入一些其他文本时,它只打印出我在提示出现后输入的文本。
严格来说,这ReadMode 2是不需要的,但我把它放在那里,这样当用户敲击键盘时,屏幕就不会被文本弄乱。