如何根据变量使循环开始,中断和重新开始?

时间:2015-06-02 00:15:53

标签: python class

我正在尝试创建一个处理用户健康状况的模块。

如果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! :'(
>>> 

2 个答案:

答案 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'