我正在尝试创建一个处理用户健康状况的模块。
如果self.hearts
为0,则用户死亡,并将其打印出来。
但如果用户没有死亡且self.hearts
小于10,则用户将每20秒恢复一次。
使用下面的代码,monitor
功能只会修复用户并且不会打印出用户已死的信息(特别是当它发生时)。我做错了什么?
import threading
class Health(object):
def __init__(self):
self.hearts = 10
def monitor(self):
if self.hearts <= 10 and self.hearts > 0:
def heal():
threading.Timer(20.0, heal).start()
if self.hearts < 10 and self.hearts > 0:
self.hearts += 1
print '+1 heart! :D'
print 'hearts %d' % self.hearts
heal()
elif self.hearts < 1:
print 'You are dead'
quit()
def add(self, amount):
if self.hearts < 10:
self.hearts += amount
print '+{} hearts! :D'.format(amount)
else:
print 'You are full of hearts'
def remove(self, amount):
self.hearts -= amount
print '-{} hearts! :\'('.format(amount)
def health(self):
print 'Hearts: ', self.hearts
me = Health()
me.monitor()
我觉得我需要循环,但我不知道如何以正确的方式编码。我希望我知道如何根据self.hearts
编码启动,中断和重新开始的循环。此循环必须始终等待更改。
如何让模块在实际发生时提示用户已经死亡?
当我在python控制台上运行时,除了“你已经死了”之外,一切都有效。提示:
>>> me.remove(5)
-5 hearts! :'(
>>> +1 heart! :D
hearts 6
me.remove(10)
-10 hearts! :'(
>>>
答案 0 :(得分:2)
试用此版本的代码
我刚注意到你没有用计时器测试死亡,试试这个版本
def monitor(self):
if self.hearts <= 20 and self.hearts > 0:
def heal():
if self.hearts < 10 and self.hearts > 0:
self.hearts += 1
print '+1 heart! :D'
print 'hearts %d' % self.hearts
threading.Timer(10.0, heal).start()
elif self.hearts < 1:
quit()
heal()
你还需要在删除时进行死亡测试以避免等待下一次计时器检查
def remove(self, amount):
self.hearts -= amount
print '-{} hearts! :\'('.format(amount)
if self.hearts < 1:
print 'You are dead'
编辑以避免代码重复
答案 1 :(得分:1)
您应该保存计时器对象,以便在cancel()
变为零时调用self.hearts
。
例如(在heal()
中):
self.healing_timer = threading.Timer(20.0, self.heal).start()
和remove()
:
def remove(self, amount):
self.hearts -= amount
print '-{} hearts! :\'('.format(amount)
if self.hearts < 1:
self.healing_timer.cancel()
print 'You are dead'