CSCI 171 Questions and Answers

If you have specific questions on PyGame or Python, especially if you think they might be an issue for other students as well, fire me an email (David.Wessels@viu.ca) and I'll try to answer them here.

PyGame

Can we look at an asteroids-style example in pygame?
I actually ran across a good introductory one on the web, 
   so will simply post a link for now, from
    Comp Sci at UNSW 

How do I let the player set direction using mouse clicks?

To determine the direction from one object's position to another in PyGame, here's a direction function using a quick and dirty bit of trig. You can use pygame.mouse.get_pos() to look up the current position of the mouse and pass that as x2,y2.

 # compute the direction from (x1,y1) to (x2,y2)
 # assuming 0-360 degrees goes counterclockwise 
 #    with 0 degrees facing directly to the right
 def comp_direction(x1, y1, x2, y2):

     # handle a few special cases
     if (x1 == x2):
         if (y1 < y2): return 0
	 else: return 180
     elif (y1 == y2):
         if (x1 < x2): return 90
	 else: return 270

     # compute the degrees in radians, using tan = opp/adj
     #    and arctan(tan) to get the actual angle
     rad_tan = (x2 - x1) / (y2 - y1)
     rad_angle = math.atan(rad_tan)

     # now convert the angle to degrees 
     deg_angle = 180 * rad_angle / math.pi

     # note that deg_angle will be in the range -90 to +90,
     # and we have to convert to a 0-360 degree value based
     # on which quadrant (x2,y2) falls into relative to (x1,y1)
     #                   |
     #   deg_angle < 0   | deg_angle > 0
     #   we want 90-180  | we want 0-90
     #                   |
     #   ----------------+----------------
     #                   |
     #   deg_angle > 0   | deg_angle < 0
     #   we want 180-270 | we want 270-360
     #                   |
     if (x1 < x2):
         if (y1 < y2): return deg_angle
	 else: return 360 + deg_angle
     elif (y1 < y2): return 180 + deg_angle
     else: return 180 + deg_angle
 

Python

How can I get 2D arrays in python?
# you can use a list of lists to act like a two-dimensional array
arr2d = [ [0, 1], [2, 3], [4, 5] ]
print arr2d

# to access an entire row, refer to it by the row index, e.g.: 
print arr2d[0]
# to access a single element, use the [row][column] style, e.g.:
print arr2d[0][0]

# add a new row to the array (i.e. append a new element to the list) use the append method:
arr.append([6,7])
print arr2d

# similarly, to add a new element to the end of a row, apply append to a specific row, e.g:
arr2d[0].append(-1)
print arr2d

Python's __init__ method is run on object creation, but which method is run on object destruction?
   # __del__ is the Python equivalent of a destructor, e.g.
   class myObj:
      def __init__(self):
          print "object created"

      def __del__(self):
          print "object destroyed"

   myvar =  x()
   del x