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

ただし、小さな問題が1つあります。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";
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、のバッファに入力されるので、...
  • ReadMode 3STDINcbreakモードに変わります。つまりSTDIN、キーを押すたびにフラッシュされます。それが理由です...
  • while(defined($key = ReadKey(-1))) {}起こります。これは、計算コストの高いコード中にユーザーが入力した文字をフラッシュします。それで...
  • ReadMode 0リセットされ、ユーザーがキーボードを叩いていないかのようにSTDIN読み取ることができます。STDIN

このコードを実行し、の間にキーボードを叩いてsleep(10)、プロンプトの後に他のテキストを入力すると、プロンプトが表示された後に入力したテキストのみが出力されます。

厳密に言えばReadMode 2必要ありませんが、ユーザーがキーボードを叩いたときに画面がテキストで乱雑にならないように配置しました。

于 2012-06-21T16:55:00.000 に答える