class Saver(): def __init__(self, balls=int(random.random() * 100), trail=" "): self.field = Field(title="Term Saver") self.balls = [Ball(x=int(random.random() * self.field.x-1)+1, y=int(random.random() * self.field.y-1)+1) for x in range(balls)] self.speed = 0.009 self.trail = trail return def update(self): for ball in self.balls: hitWall = self.walled(ball) if hitWall: # wall collision ball.bounce(hitWall) # ball collision self.clearTrail(ball, self.trail, True) ball.move() self.field.write_at(item=ball.image, coords=ball.getPosition()) # clear the field randomly (.1% chance) if random.choice(range(1000)) == 1: self.field.clear() self.field.deploy() return def walled(self, ball): direction = [] if ball.x < 1: direction.append('right') elif ball.x >= self.field.x-1: direction.append('left') if ball.y < 1: direction.append('down') elif ball.y >= self.field.y-1: direction.append('up') if len(direction): return ' '.join(direction) return None def run(self): run = 1 while run: c = self.field.display.getch() if c == ord('q'): run = 0 self.update() time.sleep(self.speed) self.field.destroy() return def clearTrail(self, obj, remains=" ", centered=False): for i in range(len(obj.image)): self.field.write_at(item=remains, coords=[obj.x+i, obj.y], centered=centered) return
class Rain(): def __init__(self, drops=int(random.random() * 100), trail=" "): self.field = Field(title="Zen Rain") self.drops = [Drop(x=int(random.random() * self.field.x-1)+1, y=int(random.random() * self.field.y-1)+1) for x in range(drops)] self.speed = 0.009 self.trail = trail self.wind = random.choice((1, -1, 0)) return def new_drop(self): newdrop = Drop(x=int(random.random() * self.field.x-1)+1, y=int(random.random() * self.field.y-1)+1) newdrop.dx = self.wind return newdrop def update(self): for drop in self.drops: hitWall = self.walled(drop) if hitWall: # wall collision drop.bounce(hitWall) if 'more' in hitWall: self.drops.pop(self.drops.index(drop)) self.drops.append(self.new_drop()) self.clearTrail(drop, self.trail, True) drop.move() self.field.write_at(item=drop.image, coords=drop.getPosition(), color='blue') # clear the field randomly (.1% chance) #if random.choice(range(1000)) == 1: # self.field.clearField() self.field.deploy() return def walled(self, drop): direction = [] if drop.x < 1: direction.append('right') elif drop.x >= self.field.x-1: direction.append('left') if drop.y < 1: direction.append('down') elif drop.y >= self.field.y-1: direction.append('more') if len(direction): return ' '.join(direction) return None def run(self): run = 1 while run: c = self.field.display.getch() if c == ord('q'): run = 0 self.update() time.sleep(self.speed) self.field.destroy() return def clearTrail(self, obj, remains=" ", centered=False): for i in range(len(obj.image)): self.field.write_at(remains, (obj.x + i), obj.y, None, centered, None) return