2013-07-22 51 views
-1

所以我有下面的代碼得到一個功能循環到另一個,然後再返回:如何與不同randints每次

def monsterturn(): 
     global monster 
     global playerhp 
     turn = True 
     print "Rolling for", monster, "...(14 or better to hit)" 
     time.sleep(1) 
     if r > 14: 
      print r, "- The", monster, "hit you!" 
      playerhp-=1 
      time.sleep(0.5) 
      print "Your HP:", playerhp 
      if playerhp == 0: 
        turn = False 
        time.sleep(0.5) 
        print "YOU HAVE BEEN SLAIN." 
      else: 
        turn = False 
        time.sleep(1.5) 
        playerturn() 
     elif r < 14: 
      print r, "- The", monster, "missed you." 
      turn = False 
      playerturn() 
    r = randrange(1, 21) 

功能playerturn()的結構酷似monsterturn(),除具有全局變量monsterhp而不是playerhp,r2而不是r,並且爲玩家對話而不是怪物。問題是,它會一次計算一個隨機整數,然後保留它,這往往會在沒有人碰到任何人的情況下永遠結束。我怎樣才能得到它每次計算一個不同的隨機整數?

此外,函數playerturn()被調用,並在最後觸發monsterturn(),觸發playerturn()等等,直到有人死亡。

+0

你不應該使用全局變量這個 –

回答

0

在循環內計算r,而不是在循環外。

您還可以通過分解常見材質來改善這一點,使怪物和玩傢俱有相同的轉向功能。你可以通過避免引用全局變量並傳遞更改的細節(對手的生命值,要打印的消息等)來達到這個目的。

+0

謝謝!我越來越生氣...... –

1

我認爲你應該重新考慮你的總體設計,因爲這會導致你遇到問題。這在很大程度上是理論上的,但是你的戰鬥時間越長,調用堆棧將變得越深,最終可能導致堆棧溢出(並且還會增加內存消耗;即使它繼續正常運行)。

相反,我建議你修改函數返回一個布爾值,無論遊戲是否應該繼續。然後,您就能夠只是循環,只要這兩個函數返回true,實質上意味着比賽繼續進行:

while playerturn() and monsterturn(): 

每一擊/攻擊隨機的,你會正確使用它之前重新分配r一個隨機值:

... 
time.sleep(1) 
r = randrange(1, 21) 
if r > 14 
    ... 
+0

'while playerturn()and monsterturn():' –

+0

好的,謝謝:) – Mario