2016-11-13 56 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 –

相关问题