Esempio n. 1
0
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
Esempio n. 2
0
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
Esempio n. 3
0
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()