2016-03-22 13 views
0

私は端末ゲームを書いています。これは毎秒ゲームフィールドを書き換えます。私は、ユーザーがキーを押すことによって対話したい。ここに私が思いついたものの単純化された例があります:Rubyで入力を取得

require 'io/console' 

move = true 

thr = Thread.new do 
    while move do 
    puts "Foo" 
    sleep(1) 
    end 
end 

loop do 
    input = $stdin.getch 
    if input == "a" 
    move = false 
    break 
    end 
end 

このように見えます。

game field

+1

ゲームを作成している場合は、['curses'](https://github.com/ruby/curses)ライブラリを使用し、キーボードの読み取り可能な状態をチェックするイベントループが必要な場合があります。スレッドの理由はありません。 – tadman

+0

スレッドによる正しい出力方法 –

+0

私はあなたのコードを試してみたとき、 "Foo"は常にあなたの場合のように挿入されていない行の先頭に書かれています。これは、端末の設定が異なるためです。 'puts'は文字列の最後に改行を書き出し、使用している端末は改行を改行コードとして解釈します。 Foo \ r "'を書くときの出力はどうですか? – user1934428

答えて

0

putsが自動的に画面に文字列を出力した後、改行(\n)を追加:しかし、私は、全体のゲームフィールドを台無しにthrから奇妙な出力を持っています。これはほとんどの場合に有効ですが、必ずしもそうではありません。

使用printあなたは改行したくない場合:この場合

print "Foo" 

を、あなたはおそらくも、既存のラインをクリアしたいです。 - それは単にバックにカーソルを移動

print "Foo\r" 

これは、それがは、任意の文字をクリアしないことに注意してくださいバックの列0にカーソルを移動します:あなたは(「キャリッジリターン」のための)\rでそれを行うことができます列0は文字をオーバーライドすることができます。画面上のものより2少ない - Fooは3文字のみを出力するので

Foolo 

:だから、たとえば、この:

print "Hello\r" 
print "Foo\r" 

はになります。それを修正するには、我々はスペースを追加する必要があります。

print "Foo \r" 

\b(バックスペース)が戻ってカーソルを1つの文字を移動することもあります:すべての

Fee 

print "Foo" 
print "\b\bee" 

はになりますこれはむしろ面倒であり、正確にはcursesライブラリが存在する理由です;-)これは、正しいstuの消去を扱うラッパー関数でこれをすべてラップしますffとそれはもともとこのようなASCIIゲームのために開発されました;-)私はあなたがそれを使用することをお勧めします!

+0

詳細な説明をありがとうございます。キャリッジリターンは私の問題を解決しました。次回は、cursesライブラリを使用すると思います。それのためのチュートリアルを持っていることは素晴らしいことでしょう。 –

関連する問題