初学者问题 - Gets.chomp,停止我的计时器运行,导致崩溃

时间:2010-11-21 13:42:43

标签: ruby timer while-loop getstring

您好我从Chris Pine那里学习,学习红宝石程序书,自从完成以来我一直在尝试编写一个文本冒险游戏,从一些有点文章“红宝石冒险”中获取一些想法。

对于战斗,我已经输入了一个while语句,当玩家的生命值或敌人的生命值达到0时,它会中断。有一个计时器每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,但我想不到这样做。

任何帮助都会让我非常感激。

1 个答案:

答案 0 :(得分:0)

您没有说出您正在运行的Ruby版本。此外,您的示例代码并未演示如何使用gets,如果您遇到问题,这一点非常重要。它也没有显示你在等待用户时如何在后台循环的任何样本。

根据您的标题和时间的使用,这是我能想到的最小代码,它将开始测试问题:

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

在每次测试中,我暂停了几秒钟,这反映在时间计算中。

除了p在1.8.2中返回一个值而在1.8.7中返回nil之外,我没有看到任何真正的区别。显示一些如何在后台循环进行计算的示例,我可以扩展测试代码。