0

こんにちは、私は Chris Pine's から学んでおり、Ruby に関する本をプログラミングすることを学んでいます。終了してから、ビットごとの記事「adventures in ruby​​」からいくつかのアイデアを取り入れて、テキスト アドベンチャー ゲームを書こうとしています。

戦闘では、プレイヤーのヒット ポイントまたは敵のヒット ポイントのいずれかが 0 になったときにブレークする while ステートメントを挿入しました。2 秒ごとにダメージの計算を実行するタイマーがあります。プレイヤーがタイマーを中断しない方法で戦闘中にコマンドを入力できるようにする方法が欲しいのですが、コードに gets.chomp を呼び出すように要求するとき、プレイヤーが 2 秒以上かかる場合、タイマーはクラッシュします。不要なビットのほとんどを取り除いたコードを次に示します。

while true
    start_time = Time.now
    hp[1] = hp[1] - (enemy.stats[0] - rand(enemy.stats[0]))
    enemy.hp = enemy.hp.to_i - (mystats[0] - rand(mystats[0]))
    if hp[1] <= 0 or enemy.hp <= 0
        break
    end
    puts " "
    puts "(hp: #{hp[1]} mp: #{mp[1]} st: #{st[1]})"
    #enemy conditions go here
    puts "Enemy condition: " + condition
    puts " "
    total_time = Time.now - start_time 
    sleep(2.0 - total_time)
end

私ができる方法は、2秒ごとにgets.chompを別のタイマーで更新することですが、それを行うことは考えられません。

どんな助けでも大歓迎です。

4

1 に答える 1

0

実行しているRubyのバージョンはわかりません。また、サンプルコードは、の使用法を示していませんgets。これは、問題が発生した場合に重要です。また、ユーザーを待機しているときにバックグラウンドでループしようとしているサンプルも表示されません。

タイトルとTimeの使用に基づいて、これは問題のテストを開始するために私が考えることができる最小のコードです。

time = Time.now
asdf = STDIN.gets
p Time.now - time

Ruby 1.8.7の場合:

test.rb(main):004:0> greg-mbp-wireless:Desktop greg$ rvm 1.8.7; rvm list

rvm rubies

=> ruby-1.8.7-p302 [ x86_64 ]
   ruby-1.9.2-head [ x86_64 ]
   ruby-1.9.2-p0 [ x86_64 ]

greg-mbp-wireless:Desktop greg$ irb -f test.rb
test.rb(main):001:0> time = Time.now
=> Sun Nov 21 13:24:58 -0700 2010
test.rb(main):002:0> asdf = STDIN.gets

=> "\n"
test.rb(main):003:0> p Time.now - time
3.802123
=> nil

Ruby 1.9.2の場合:

test.rb(main):004:0> greg-mbp-wireless:Desktop greg$ rvm 1.9.2; rvm list

rvm rubies

   ruby-1.8.7-p302 [ x86_64 ]
   ruby-1.9.2-head [ x86_64 ]
=> ruby-1.9.2-p0 [ x86_64 ]

greg-mbp-wireless:Desktop greg$ irb -f test.rb
test.rb(main):001:0> time = Time.now
=> 2010-11-21 13:25:37 -0700
test.rb(main):002:0> asdf = STDIN.gets

=> "\n"
test.rb(main):003:0> p Time.now - time
3.578869
=> 3.578869

各テストで、時間の計算に反映される数秒間一時停止しました。

p1.9.2と1.8.7で値を返す以外に、nil実際の違いは見られません。計算を行うためにバックグラウンドでループしている方法のサンプルをいくつか示してください。テストコードを拡張できます。

于 2010-11-21T20:02:00.797 に答える