[Tutor] my newbie program

Alan Trautman ATrautman@perryjudds.com
Wed Nov 20 10:12:20 2002


Sheri,

IMO and experience after working at it a while there is a magic point where
you will "get it" and if your like me you'll want to go back and fix
everything you've done. It will be much easier until you try to do something
way over you head. Then there is a whole new set of ideas for handling that.
That's the interesting part of programming/system design.

Alan

-----Original Message-----
From: sheri [mailto:din22@cox.net]
Sent: Wednesday, November 20, 2002 9:03 AM
To: Magnus Lycka
Cc: tutor@python.org
Subject: Re: [Tutor] my newbie program


so i make a map object that has a dictionary to keep
track of rooms indexed by xy coords as keys.
and i think i get the placeRoom method.
i am working through the rest. i guess right now
my question is: does thinking like this get any
easier with practice? because my brain is starting
to hurt.

> 
> class Map:
>      ...
> 
> class Room:
>      map = Map() # Shared between instances.
> 
> I don't remember exactly what your code so far
> looks like, but I guess the interface to Room
> can look the same, but instead of looking in an
> internal list a room makes a call to:
>          self.map.hasOpening(self, direction).
> 
> In Room.__init__ you have something like
> self.map.placeRoom(self, x, y) so that the map
> can keep track of where each room is.
> 
> So, in class Map you will have something like:
> 
> class Map:
>      '''Keep track of rooms and connections'''
>      # DirectionSymbol: (deltaX, deltaY) Assumes 0,0 lower left corner
>      directions = {'n': (1, 0), 's': (-1, 0), 'w': (-1, 0), 'e': (1, 9)}
> 
>      def __init__(self):
>          self.grid = {}
>          self.connections = [] # or {}???
> 
>      def placeRoom(self, room, x, y):
>          if self.grid.has_key((x, y)):
>              raise KeyError, "Location taken!"
>          self.grid[(x, y)] = room
> 
>      def _getXY(self, theRoom):
>          '''Where is a room'''
>          for aKoord, aRoom in self.grid.items():
>              if aRoom == theRoom:
>                  return aKoord
>          # Didn't find it
>          raise KeyError, "Room not found"
> 
>      def _relativeCoord(self, room, direction):
>          thisX, thisY = self._getXY(room)
>          deltaX, deltaY = self.directions[direction]
>          return (thisX + deltaX, thisY + deltaY)
> 
>      def dig(self, room, direction):
>          # A lot of checks needs to be added in this method
>          newX, newY = self._relativeCoord(room, direction)
>          try:
>              otherRoom = self.grid[(newX, newY)]
>          except KeyError: #No room where we dug
>              otherRoom = Room(newX, newY)
>          self._makeConnection(room, otherRoom)
> 
>      def move(self, room, direction):
>          '''Return the room we get to when we move in a
>             certain direction'''
>          newX, newY = self._relativeCoord(room, direction)
>          try:
>              otherRoom = self.grid[(newX, newY)]
>              if self.hasConnection(room, otherRoom):
>                  return otherRoom
>              else: # Stay where we are
>                  reurn room
>          except: #Stay where we are
>              return room
>          # Another approach is to cast an exception if we can't move.
> 
>      def _makeConnection(self, room1, room2):
>          ...
> 
>      def _hasConnection(self, room1, room2):
>          ...
>          return xxx # 1 (yes) or 0 (no)
> 
> 
> I'm not sure about how to store connections (i.e. openings / doors).
> A connection could be stored like a pair of coordinates as above.
> "((thisX, thisY), (newX, newY))". But how do we see in a simple
> way that the above is equivalent with
> "((newX, newY), (thisX, thisY))"? Or isn't it? Can there be one
> way connections? Should we store both directions when we dig?
> Should we sort before we store?
> 
> 
> 
> -- 
> Magnus Lycka, Thinkware AB
> Alvans vag 99, SE-907 50 UMEA, SWEDEN
> phone: int+46 70 582 80 65, fax: int+46 70 612 80 65
> http://www.thinkware.se/  mailto:magnus@thinkware.se
> 


_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor