Вопрос новичка - Gets.chomp, останавливает мой таймер, вызывая сбой - PullRequest
0 голосов
/ 21 ноября 2010

Здравствуйте, я учился у Криса Пайна, учусь программировать книги на ruby, и с самого конца я пытался написать текстовую приключенческую игру, используя некоторые идеи из побитовой статьи «Приключения в ruby».

В бою я вставил оператор while, который прерывается, когда либо хит-поинты игрока, либо противника достигают 0. Есть таймер, который запускает математику для урона каждые 2 секунды.Я хотел бы, чтобы какой-нибудь способ позволял игроку вводить команды во время боя таким образом, чтобы это не прерывало таймер, но при запросе кода для вызова get.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

Я могу предположить, что это может сделать еще одно обновление таймера gets.chomp каждые 2 секунды, но я не могу думатьсделай это.

Любая помощь, которую я бы высоко оценил.

1 Ответ

0 голосов
/ 21 ноября 2010

Вы не говорите, какую версию 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

В каждом тесте ясделал паузу в паре секунд, что отражено в вычислениях времени.

Помимо p, возвращающего значение в 1.9.2 и nil в 1.8.7, я не вижу никакой реальной разницы.Покажите пример того, как вы выполняете циклы в фоновом режиме для выполнения своих вычислений, и я могу расширить тестовый код.

...