10

我正在做一个反射游戏。这是输出 -

__________________________________________________________________________
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]
__________________________________________________________________________

不过有一个小问题 - 在您按下回车键开始游戏之后和打印星星之前有 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";
4

1 回答 1

4

重复CanSpice原始答案

看起来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'";

这是发生的事情:

  • ReadMode 2表示“将输入模式置于常规模式但关闭回显”。这意味着当您在计算昂贵的代码中时用户所做的任何键盘敲击都不会回显到屏幕上。它仍然会进入STDIN's 缓冲区,所以...
  • ReadMode 3变成STDINcbreak 模式,这意味着STDIN每次按键后都会刷新。这就是为什么...
  • while(defined($key = ReadKey(-1))) {}发生。这将清除用户在计算昂贵的代码期间输入的字符。然后...
  • ReadMode 0resets STDIN,您可以STDIN像用户没有敲击键盘一样阅读。

当我运行此代码并在 期间敲击键盘sleep(10),然后在提示后输入一些其他文本时,它只会打印出我在提示出现后键入的文本。

严格来说,ReadMode 2不需要,但我把它放在那里,这样当用户敲击键盘时屏幕不会被文本弄得乱七八糟。

于 2012-06-21T16:55:00.000 回答