2010-11-21 11 views
0

Merhaba Chris Pine'ın öğrencisiydim, Ruby hakkında kitap programlamayı ve bitirdiğimden beri bir metin macera oyunu yazmaya çalışıyorum. "Ruby'de maceralar" adlı bitsel makaleden bazı fikirler.Beginner Question - Gets.chomp, zamanlayıcımın çalışmasını durdurur ve bir çökmeye neden olur

Savaşta, oyuncunun hit puanları ya da düşmanın vuruş puanları 0'a ulaştığında kırılan bir açıklama yazdım. Her 2 saniyede bir hasarı matematik için çalıştıran bir zamanlayıcı var. Oyuncunun zamana müdahale etmeyecek bir şekilde dövüş sırasında komutları yazmasına izin vermenin bir yolunu kullanmak istiyorum, ancak kodun bir gets.chomp çağırması istendiğinde, oynatıcı 2 saniyeden fazla sürerse, zamanlayıcı çöker. Başka bir zamanlayıcı yenileme gets.chomp her 2 saniyede olması

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 

yapılabilir olabilir ben şeyi can yoldur ama bunu yapmak için düşünemiyorum: - İşte yararsız bit çoğuyla kod çıkarıldı .

Herhangi bir yardım beni çok takdir ederdi.

+1

İçinde bulunduğunuz sorunlar, aynı anda iki şeyi yapmaya çalıştığınız içindir. Programın giriş için engellenmesine izin verirken bir zamanlayıcının çalışmasını istiyorsanız, iş parçacığı veya EventMachine gibi bir eşzamanlılık çerçevesini kullanmaya ihtiyacınız vardır. – Jeremy

+0

Teşekkürler Jeremy, konulara bir göz attım ve temel bir sistemi devreye sokmayı başardım. Böylelikle, mücadele, döngüyü içeren yeni bir iş parçacığı başlatır ve aktör öldüğünde, ana oyun döngüsüne geri döner. Çok teşekkür ederim :) –

cevap

0

Ruby'nin hangi sürümünü kullandığınızı söyleme. Ayrıca, örnek kodunuz, gets kullanımınızı göstermez, bununla ilgili bir sorun yaşıyorsanız önemlidir. Kullanıcı için beklediği şekilde arka planda nasıl döngü yapmaya çalıştığınız ile ilgili bir örnek de göstermez. Ruby 1.8.7 yılında

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

:

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 
başlık ve Zamanın kullanımı dayanarak

, bu bunu düşünebildiğim asgari kod sorunu test etmek başlayacağı olduğu Ruby 1.9.2 içinde

: her testte

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 

I saat hesaplamaları yansıyan bir kaç saniye bekleme süresi.

1.8.2 ve nil'da 1.8.7'de bir değer döndüren p dışında, gerçek bir fark görmüyorum. Hesaplamalarınızı yapmak için arka planda nasıl döngü yaptığınıza dair bir örnek gösterin ve test kodunu genişletebilirim.

+0

Bilgi eksikliğinden dolayı üzgünüm Greg, bir dahaki sefere daha kapsamlı olacağından emin olacağım, problemi tamamen yeni bir kavram olan Threads kullanarak çözmeyi başardım ama yine de eğlenceli bir şey! Yardımın için teşekkürler. –

+0

Konular çok iyi. Onlarla eğlenceli şeyler yaptım ve birden çok çocuk süreçleri ürettim. Bir zamanlar 15 çocuktan oluşan bir örümcek yazdım. Hata ayıklama işlemi eğlenceli bir alıştırma oldu. :-) –

İlgili konular