2016-11-13 57 views
-1

下面是我在9-13行的遊戲的代碼我試圖讓飢餓變量每180秒減少10,但它不工作。如何隨着時間的推移減少變量的值

import threading 
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") 
print("   Welcome to my game") 
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") 

health = 100 
stamina = 100 
hunger = 100 
def hungerdecrease(h): 
    global hunger 
    threading.Timer(180,hungerdecrease).start() 
    h -= 10 

hungerdecrease(hunger) 

while health > 0 and stamina >0 and hunger >0: 
    if hunger <50: 
     print("You are hungry.") 
    if stamina <10: 
     print("You are feeling exhausted.") 
    if health <50: 
     print("You are unhealthy.") 
print("You are dead") 
+2

'hunger'是越來越被複制,因此函數的唯一修改拷貝。 – ForceBru

+0

嘗試添加一個返回飢餓減少並做'飢餓=飢餓(飢餓)'。編輯之後,你不應該修改飢餓而不是h嗎? – themistoklik

+0

我是相當新的python所以原諒我,如果我的問題聽起來很愚蠢,但我沒有得到你的意思,增加一個返回飢餓減少 – Wilziam

回答

0
  • 首先,你並不需要傳遞的價值,因爲你只是傳遞一個副本。只要讓變量全局。
  • 然後,您的while循環需要一些被動延遲,或者您正在使用100%活動CPU進行循環。
  • 你必須保護對你health變量的併發訪問,使用thread.Lock
  • 另一個問題是:線程需要停止或重新武裝的進程不會退出。我停下來重新武裝的線程時health < 0

一個最小的完整&可驗證&工作例如,定時器設置爲1:

import threading,time,sys 

hunger = 100 
stamina = 100 
health = 100 

lock = threading.Lock() 

def hungerdecrease(): 
    global hunger 
    if hunger > 0: 
     # no rearm when dead 
     threading.Timer(1,hungerdecrease).start() # rearm timer 
     lock.acquire() 
     hunger -= 10 
     lock.release() 

threading.Timer(1,hungerdecrease).start() 

lock.acquire() 

while health > 0 and stamina >0 and hunger >0: 
    lock.release() 
    time.sleep(0.5) # so CPU isn't 100% 
    if hunger <50: 
     print("You are hungry.") 
    if stamina <10: 
     print("You are feeling exhausted.") 
    if health <50: 
     print("You are unhealthy.") 
    lock.acquire() 
print("You are dead") 
+1

好吧,現在看到這裏:http://stackoverflow.com/help/someone-answers –

相關問題