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
class MaskSaver(Saver): def __init__(self, balls=int(random.random() * 100), trail=" ", mask=None): 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 self.addMask(mask) def addMask(self, mask): """ Given a 2D array depciting some image to mask out e.g. a box or a name or a picture of peeve shrink or fatten it up to fit the shape of our field/grid dimensions must be at least.... 4 x 4 ? e.g. . . . . . x x . . x x . . . . . The players on the field should never write to the 'x'd out areas. but our grid will probably be larger than this... so what is the maths behind making this fit properly? e.g. a 4 x 4 mask supplied for a 64 x 64 grid let's start small and just double it . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . x x x x x x . . . . . . . . . . . . . . . . . . x x x x x x . . . x x x x . . . . . . . . . . . x x x x x x . . . x x x x . . . . . . . . . . => . x x x x x x . or . . x x x x . . . . . . . . . . . x x x x x x . . . x x x x . . . . . . . . . . . x x x x x x . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . bad good I think the result where we look at the proportionality works best. The first transformation has a single border like the original, and the second maintains the proportions (e.g. 50%). What happens when it's more awkward? . . . . . . . . . . . . . . . . . . . . . . . . => . x x x x . or . . x x . . . . . . . . . . . . . . . . . . . . bad good I still like the second transformation. So I guess when taking 1/2 of an odd, round down? """ pass 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()