您好我从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,但我想不到这样做。
任何帮助都会让我非常感激。
答案 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
之外,我没有看到任何真正的区别。显示一些如何在后台循环进行计算的示例,我可以扩展测试代码。