Difference between revisions of "CSC111 Lab 12 2011"

From dftwiki3
Jump to: navigation, search
(Challenge 5)
(Part 1: A Bus)
Line 21: Line 21:
 
# the same.  Figure out what the differences are.
 
# the same.  Figure out what the differences are.
 
#
 
#
 +
"""
 +
Objects:
 +
Rectangle
 +
Circle
 +
Text
 +
Point
 +
Line
 +
 +
r = Rectangle( Point(x1, y1), Point(x2, y2) )
 +
# object = class( information)
 +
r.draw(win)
 +
# .draw() is a method
 +
 +
class + parameters becomes the data; can apply methods, like "buttons"
 +
"""
 
from graphics import *
 
from graphics import *
W = 800
+
W = 400
H = 600
+
H = 400
+
# creating a class for a taxicab
#----------------------------------------------------------------
+
 
 +
#start with class for wheel; two concentric circles of different colors
 
class Wheel:
 
class Wheel:
    """A class with two concentric circles"""
+
     def __init__(self, center, r1, r2 ): #__init__() is constructor; self is part of init; center, r1, r2 match parameters
+
         self.center = center
     def __init__( self, center, r1, r2 ):
+
         r1, r2 = min(r1, r2), max(r1, r2)
        self.circ1 = Circle( center, r1 )
 
         self.circ2 = Circle( center, r2 )
 
         r1, r2 = min( r1, r2 ), max( r1, r2 )
 
 
         self.radius1 = r1
 
         self.radius1 = r1
 
         self.radius2 = r2
 
         self.radius2 = r2
+
         self.c1 = Circle( center, r1 )
    def draw( self, win ):
+
         self.c2 = Circle( center, r2 )
        """draws the wheel on the window"""
+
 
         self.circ2.draw( win )
+
     def setFill( self, col1, col2 ):
         self.circ1.draw( win )
+
         self.c2.setFill( col1 )
+
         self.c1.setFill( col2 )
     def setFill( self, color1, color2 ):
+
       
        """colors the outside and inside circles.  First color for small circle"""
+
     def draw( self, win): #win matches parameter sent to draw in main
         self.circ1.setFill( color1 )
+
         self.c2.draw( win )
         self.circ2.setFill( color2 )
+
         self.c1.draw( win )
+
 
     def getRadius1( self ):
+
#class for car
         """returns radius of small circle"""
 
        return self.radius1
 
 
    def getRadius2( self ):
 
        """returns radius of large circle"""
 
         return self.radius2
 
 
#----------------------------------------------------------------
 
 
class Car:
 
class Car:
     """A class for a car, which is a rectangle and two wheels"""
+
     def __init__(self, p1, p2 ):
 +
        self.rect = Rectangle( p1, p2 )
 +
        length = abs( p1.getX() - p2.getX() )
 +
        xWheel1 = p1.getX() + length/4
 +
        yWheel1 = p2.getY()
 +
        xWheel2 = p2.getX() - length/4
 +
        yWheel2 = yWheel1
 +
       
 +
        self.w1 = Wheel( Point(xWheel1, yWheel1), length/16, length/8 )
 +
        self.w2 = Wheel( Point(xWheel2, yWheel2), length/16, length/8 )
  
    def __init__( self, P1, P2 ):
 
        """Get 2 points and create the box and two wheels from the dimensions"""
 
        self.P1 = P1
 
        self.P2 = P2
 
        self.width = abs( P1.getX()-P2.getX() )
 
        self.height= abs( P1.getY()-P2.getY() )
 
 
        self.rect    = Rectangle( P1, P2 )
 
        center1      = Point( P1.getX()+self.width/8, P2.getY() )
 
        center2      = Point( P1.getX()+self.width*7/8, P2.getY() )
 
        radius2      = self.height/3
 
        radius1      = radius2/2
 
        self.wheel1  = Wheel( center1, radius1, radius2 )
 
        self.wheel2  = Wheel( center2, radius1, radius2 )
 
 
 
     def draw( self, win ):
 
     def draw( self, win ):
        """draws the car on the screen.  One of the wheels is covered"""
+
         self.w2.draw( win )
         self.wheel2.draw( win )
 
 
         self.rect.draw( win )
 
         self.rect.draw( win )
         self.wheel1.draw( win )
+
         self.w1.draw( win )
  
     def move( self, dx, dy ):
+
     def setFill( self, col1, col2, col3 ):
        """moves the car by dx and dy"""
+
         self.rect.setFill( col1 )
         self.wheel2.move( dx, dy )
+
         self.w1.setFill( col2, col3 )
         self.rect.move( dx, dy )
+
         self.w2.setFill( col2, col3 )
         self.wheel1.move( dx, dy )  
+
       
 
#----------------------------------------------------------------
 
def waitForClick( win, message ):
 
    """ waitForClick: stops the GUI and displays a message. 
 
    Returns when the user clicks the window. The message is erased."""
 
 
    # wait for user to click mouse to start
 
    startMsg = Text( Point( win.getWidth()/2, win.getHeight()/2 ), message )
 
    startMsg.draw( win )    # display message
 
    win.getMouse()          # wait
 
    startMsg.undraw()      # erase
 
 
 
 
def main():
 
def main():
 
     global W, H
 
     global W, H
     win = GraphWin( "wheel demo", W, H )
+
     win = GraphWin( "Wheel Class Demo", W, H)
+
 
    waitForClick( win, "click to start" )
 
    car = Car( Point( 100,100 ), Point( 250, 170 ) )
 
 
   
 
   
 +
    """
 +
    w = Wheel( Point( W/2, H/2 ), 20, 30 ) #20 and 30 are two radii
 +
    w.setFill( "yellow", "black" ) #small circle then big circle 
 +
    w.draw( win )
 +
    """
 +
 +
    car = Car( Point( 50,50 ), Point( 250, 100 ) )
 +
    car.setFill( "yellow", "white", "black" )
 
     car.draw( win )
 
     car.draw( win )
     waitForClick( win, "click to end" )
+
      
+
    win.getMouse()
 +
    win.close()  
 +
 
 
main()
 
main()
 +
 
</source>
 
</source>
  

Revision as of 12:15, 30 November 2011

--D. Thiebaut 09:42, 30 November 2011 (EST)


This lab will have you play with classes and objects: the essence of Object Oriented Programming!


Part 1: A Bus

CSC111 bus.png


  • Using the example we did in class on Tuesday as inspiration (see similar code below), create a new program that draws the bus shown above.
  • Your program should have two classes:
    • class Wheel
    • class Bus



# A program with a car and a wheel class.
# This is slightly different from what we did in class, but works
# the same.  Figure out what the differences are.
#
"""
Objects:
Rectangle
Circle
Text
Point
Line

r = Rectangle( Point(x1, y1), Point(x2, y2) )
# object = class( information)
r.draw(win)
# .draw() is a method

class + parameters becomes the data; can apply methods, like "buttons"
"""
from graphics import *
W = 400
H = 400
# creating a class for a taxicab

#start with class for wheel; two concentric circles of different colors
class Wheel:
    def __init__(self, center, r1, r2 ): #__init__() is constructor; self is part of init; center, r1, r2 match parameters
        self.center = center
        r1, r2 = min(r1, r2), max(r1, r2)
        self.radius1 = r1
        self.radius2 = r2
        self.c1 = Circle( center, r1 )
        self.c2 = Circle( center, r2 )

    def setFill( self, col1, col2 ):
        self.c2.setFill( col1 )
        self.c1.setFill( col2 )
        
    def draw( self, win): #win matches parameter sent to draw in main
        self.c2.draw( win )
        self.c1.draw( win )

#class for car
class Car:
    def __init__(self, p1, p2 ):
        self.rect = Rectangle( p1, p2 )
        length = abs( p1.getX() - p2.getX() )
        xWheel1 = p1.getX() + length/4
        yWheel1 = p2.getY()
        xWheel2 = p2.getX() - length/4
        yWheel2 = yWheel1
        
        self.w1 = Wheel( Point(xWheel1, yWheel1), length/16, length/8 )
        self.w2 = Wheel( Point(xWheel2, yWheel2), length/16, length/8 )

    def draw( self, win ):
        self.w2.draw( win )
        self.rect.draw( win )
        self.w1.draw( win )

    def setFill( self, col1, col2, col3 ):
        self.rect.setFill( col1 )
        self.w1.setFill( col2, col3 )
        self.w2.setFill( col2, col3 )
        
def main():
    global W, H
    win = GraphWin( "Wheel Class Demo", W, H)

 
    """
    w = Wheel( Point( W/2, H/2 ), 20, 30 ) #20 and 30 are two radii
    w.setFill( "yellow", "black" ) #small circle then big circle  
    w.draw( win )
    """

    car = Car( Point( 50,50 ), Point( 250, 100 ) )
    car.setFill( "yellow", "white", "black" )
    car.draw( win )
    
    win.getMouse()
    win.close() 
   
main()


Challenge 1

QuestionMark1.jpg


  • Add a for-loop that makes your bus disappear from the window. Make it go in the forward direction (i.e. left for the bus in the image above).


class Tree:
 
    def __init__( ... ):
        ...

    def draw( ... ):
        ...

    def move( ... ):
        ...


  • Make your program display the tree with the bus. No need for any of them to move, but that's fine if the bus is moving out of the window...

Part 2: Trees


CSC111Bus and Tree.png


  • Create a new class in your program called Tree. It will represent a simplified tree, with its green head of leaves, and its brown trunk.
  • Make your program display the bus and the tree. It doesn't matter if the tree is in front or behind the bus.

Challenge 2

QuestionMark2.jpg


  • Make the bus stand still and the tree move in the direction opposite of the bus direction.
  • Make the tree move out of the window

Challenge 3

QuestionMark3.jpg


  • Add another tree object. One class: two objects.
  • Locate the trees in different locations so that they do not overlap (hint: you can change the constructor so that you can specify the x-coordinate of the tree object when you create it:)
  • Make your program display the two trees and the bus


Challenge 4

QuestionMark4.jpg


  • Make the two trees move to the right and disappear from the window


Challenge 5

QuestionMark5.jpg


  • Make the trees that disappear from the right reappear on the left, giving the illusion of a real cartoon!
  • For this your program will have to ask the tree object to return its x position, and if this position is larger than the width plus some offset, then the tree will have to move by a large negative dx value...



     class Tree:
         ...
         def getX( ... ):
              return ...


     def main():
         ...

         if tree.getX() > width:
              tree.move( -nnnn, 0 )