#!/usr/bin/python2 import datetime import time HEAL_SECONDS = 2 class Health(object): def __init__(self, initial=10): self.hearts = initial if initial < 10: self.lasthealing = datetime.datetime.utcnow() else: self.lasthealing = None def monitor(self): if self.hearts < 10: if self.lasthealing: # calculate how much time has passed, how much there is to heal # then update the time info now = datetime.datetime.utcnow() spendtime = now - self.lasthealing healing = spendtime.seconds / HEAL_SECONDS maxhealing = 10 - self.hearts realhealing = min(healing, maxhealing) for _ in xrange(realhealing): print "+1 heart :D" self.hearts += realhealing if self.hearts < 10: healupdate = healing * HEAL_SECONDS self.lasthealing += datetime.timedelta(seconds=healupdate) else: self.lasthealing = None else: # apparently we just lost some hearts self.lasthealing = datetime.datetime.utcnow() if self.hearts < 1: # we check this in the end so that healings that occured # previously are properly accounted for print "You are dead" else: self.lasthealing = None def __iadd__(self, amount): self.monitor() self.hearts += amount print "+{} hearts! :D".format(amount) self.monitor() return self def __isub__(self, amount): self.monitor() self.hearts -= amount print "-{} hearts! :'(".format(amount) self.monitor() return self @property def dead(self): return self.hearts < 1 def main(): me = Health() me.monitor() me -= 2 assert(me.hearts == 8) time.sleep(2) me.monitor() assert(me.hearts == 9) time.sleep(4) me.monitor() assert(me.hearts == 10) me -= 6 time.sleep(4) me -= 5 assert(me.hearts == 1) me -= 1 if __name__ == '__main__': main()