2016-11-13 18 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

hungerdecreaseに戻り、 'hunger = hungerdecrease(hunger)'を実行してみてください。あなたの編集の後、hの代わりに飢えを修正するべきではありませんか? – themistoklik

+0

私はPythonにかなり新しいですので、私の質問が愚かに聞こえる場合は私を許してくださいが、私はあなたが意味するものを得ることはありませんhungerdecreaseへの復帰を追加する – Wilziam

答えて

0
  • まず、あなたは値を渡す必要はありません。変数をグローバルにするだけです。
  • 次に、whileループに何らかのパッシブ遅延が必要な場合、または100%アクティブCPUでループしている場合。
  • あなたはthread.Lock
  • 別の問題を使用して、あなたのhealth変数の同時アクセスから保護する必要があります:スレッドが再軍備を停止する必要があるか、プロセスが終了しません。私は、とき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

OK、今すぐ参照してください:http://stackoverflow.com/help/someone-answers –

関連する問題