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

나는 파이썬에 상당히 익숙하다. 나의 질문이 어리석게 들릴지라도 용서해 준다. 그러나 나는 당신이 의미하는 바를 hungerdecrease에 되돌려 보내지 않는다. – 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 –

관련 문제