2016-08-31 2 views
1

を示しながら、ユーザー入力を必要とする方法(警告:私はルビーに比較的新しいです。)ルビー - 同時にカウントダウン

私は私の子供たちはそれらの付加事実を学ぶのに役立つ簡単な数学のスクリプトを書いています。私は彼らの答えで打ち負かす必要があるカウントダウンを示したい。たとえば、カウントダウンが5から0になるのを見ている間、3 + 3 =?に正しく答えるには、「6 + enter」を押す必要があります。 '6 + enter'はカウントダウンを止め、次の質問に進めるべきです。

現在、これは私のカウントダウンのためのコードは次のとおりです。

5.downto(0) do |i| 
    print "\r00:00:#{'%02d' % i}" 
    sleep 1 
end 

これは、限り、それが行くように、動作します。それは私に私が望むカウントダウンを与える。問題は、カウントダウンプロセスがまだ実行されている間に、このカウントダウンを中断するユーザーからの回答を求める必要があることです。現状では、私はカウントダウン後

答え= gets.chompに

を置くことができるが、それは明らかに非常に多くの私を助けることはないだろう。

アイデア?私は同時プロセスを実行する方法を読もうとしましたが、説明は少し難しかったし、私が読んだもののどれも、私が後に行ったようなユーザーのやりとりを許可していないようでした。

ご協力いただきありがとうございます。

+0

'' Thread''ライブラリを見てください。 – zhon

+0

2つのスレッドを同時に使用するには、[EventMachine](http://www.rubydoc.info/gems/eventmachine/frames)や[Curses]のように、2つのスレッドを使用するか、タイマーを使用してイベントループを実行する必要があります。 (http://ruby-doc.org/stdlib-2.0.0/libdoc/curses/rdoc/Curses.html)。 – tadman

答えて

1

スレッディングが答えです。ここに私がしたことがあります。それは完璧ではありませんが、仕事は終わりです。

student_answer = nil 

timer = Thread.new do 
    5.downto(0) do |i| 
    puts "\r00:00:#{'%02d' % i}" 
    sleep 1 
    end 
    puts 'Time is up' 
end 

answer = Thread.new do 
    puts 'What is your answer?' 
    student_answer = gets.chomp 
end 

answer.join(5) 
timer.join 

if $answer.nil? 
    puts 'No Answer' 
else 
    puts "Your answer is #{student_answer }" 
end 

このコードを使用すると、いつでもあなたの答えを入力することができ、次の出力もちろん

What is your answer? 

00:00:05 

00:00:04 

00:00:03 

00:00:02 

00:00:01 

00:00:00 
Time is up 
No Answer 

を生成しますが、回答のスレッドは、約5秒殺され、そしてあなたは、もはやどんな答えを入力することはできません。

残念ながら、回答が入力されたら、タイマースレッドをどのように殺すのか分かりません。誰かがアイデアを持っているなら、私に知らせてください。

+0

あなたのタイピングは、タイマー自体によってプッシュされますが、ちょっと、これは技術的に*動作します。 – tadman

+0

には、 '$ answer'の値に基づいてタイマースレッドを停止する方法がありますか?私はそれで何かを見つけることができませんでした。 – davidhu2000

+0

もう一つの重要な注意:人々は '$ answer'のようなグローバル変数を使うことをお勧めしません。 – tadman

関連する問題