[Edu-sig] snapshotting some instructional scaffolding...

Kirby Urner kurner at oreillyschool.com
Wed May 4 06:07:46 CEST 2011


"""
OST Skunkworks:  Freakish Tractor

generator that moves forward to a boundary reading
current character, writing current marker.  Fuel
might run out.  send protocol may be employed to
tank up, redirect, change the marker.  Farm is an
n x m array, presumably smallish, for interactive
console experiments.

  -- Python track, O'Reilly School of Technology
  http://www.facebook.com/oreillyschool

Also:
http://mybizmo.blogspot.com/2011/05/lesson-planning.html
"""


class Farm:

    def __init__(self, rows=8, columns=8, facing="N", bg="*"):
        self.h = rows
        self.w = columns
        self.facing = facing
        self.bg = bg  # background character
        self.tractors = []  # like Snake or Dog stomach
        self.field = [list(bg*self.w) for x in range(self.h)]  # model
        self.framenumber = 0
        self.trace = []

    def add(self, tractor):
        self.tractors.append(tractor)

    def ticktock(self):  # controller
        """tick tock o' the clock
        time marches on!
        Advance each tractor in the direction it's facing,
        ignoring stuck tractors already at a fence (some
        types of Tractor are smarter than others about fences).
        """
        for tractor in self.tractors:
            try:
               next(tractor) # state changer
            except StopIteration:
               pass  # harmless stuck tractor signal

        self.framenumber += 1
        return self.framenumber

    def render(self):
        display=""
        for line in self.field:
            display += "".join(line)+"\n"
        return display  # view

    __str__ = render

    def __repr__(self):
        return "Farm({},{}) @ {}".format(self.w, self.h, id(self))


def tractor(thefarm , pos = [0,0], facing="N", marker="O", fuel=10):
    "pos is mutable = current position"
    while True:
        y,x = pos

        if fuel > 0:

            if facing   == "N":
                if y > 0:
                    y -= 1
                else:
                    raise StopIteration

            elif facing == "S":
                if y < thefarm.h - 1:
                    y += 1
                else:
                    raise StopIteration

            elif facing == "W":
                if x > 0:
                    x -= 1
                else:
                    raise StopIteration

            elif facing == "E":
                if x < thefarm.w - 1:
                    x += 1
                else:
                    raise StopIteration

            fuel -= 1
            pos = (y,x)

        else:
            raise StopIteration

        changes = yield (thefarm.field[y][x], pos, fuel)
        thefarm.field[y][x] = marker

        if changes:
            facing = changes.get('facing',facing)
            marker = changes.get('marker',marker)
            fuel   = changes.get('fuel',fuel)
            pos    = changes.get('pos',pos)

def _test(n):
    # Agile Programming:  TDD is your friend
    thefarm = Farm(20,20, bg = ".")
    print("Empty field, all is peaceful", thefarm, sep="\n\n")  # frame of
film
    t1 = tractor(thefarm, pos=[10,10], marker="O", facing="N")
    t2 = tractor(thefarm, pos=[10,11], marker="X", facing="S")
    thefarm.add(t1)
    thefarm.add(t2)
    print("Showing the tractors in a list: ", thefarm.tractors, "===",
sep="\n")
    print("A busy day begins...", thefarm, sep="\n\n")  # frame of film

    for arrow_of_time in range(n):
        thefarm.ticktock()  # much physics involved in terms of what's a
realistic throughput

    print("After {} ticks of the clock, the tractors have
moved...".format(n),
          thefarm, sep="\n\n")  # frame of film

if __name__ == "__main__":
    _test(10)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/edu-sig/attachments/20110503/03031caf/attachment-0001.html>


More information about the Edu-sig mailing list