CS 151: Project #2

Project 2: A Shape Collection

Main course page

The goal of this assignment is to give you practice in creating and using functions and function parameters in python. You'll continue to create shapes using turtle graphics, just like we did in lab.

The end result of the assignment should be a representation of a place of your choice on the Colby campus.

For the remaining labs in the course you need to complete the work yourself. You can discuss the assignment and ideas regarding the assignment with others in English, but not Python. If you have questions about your python (other than very simple syntax questions), please ask one of the lab assistants or professors. Please see the syllabus for guidelines on collaboration and attribution.


  1. Make a copy of your lab2.py file and rename it shapes.py. Delete the main code from the file so that only the import statements and the functions remain. You should not have any top level code in the shapes.py file.

    Your first task is to create a main.py file that imports your shapes.py functions. To do this, create a file called main.py in a text editor, and at the top (after your name and a date) put the following.

    import shapes

    In your main.py file, make a function called colby1. Put a single call to the colby1 function at the end of the file, followed by a raw_input call.

    Write some python code in your colby1 function that calls some of the functions from your shapes.py file to draw a simple image (like a few blocks). Note that to call a function from your shapes file you have to prepend shapes. in front of the function name. For example shapes.block( 10, 10, 20, 30 ) would be how you would call the block function.

    You can run your main.py file using:

    python main.py

    You don't need to save this image, as you'll be replacing the code in the colby1 function later on.

  2. In your shapes.py file, make 2 more functions for drawing basic shapeslike the block function from lab. Basic shapes should take in at least an x location, y location, and size information. For example, you could make a triangle function or a hexagon function with the size value being the length of a side, in pixels . Put a print statement at the beginning of each function and test them out by calling the functions in your main.py function.

    Each of your shapes should draw properly no matter where it is drawn on the screen, what the size parameter is, or what the orientation of the turtle happens to be when the shape function executes. Test this out for all of your functions.

    In your writeup, include a picture demonstrating that your shape functions work properly. This is required picture 1.

    When you have a picture or scene you want to save, make a screen capture of it on a mac using the key combination command-shift-4. Then hit space bar to get the camera icon and click the mouse to take the picture. The picture will automatically be saved to a file on your Desktop. You can then move and rename it to a more appropriate location. Make sure the entire scene is visible in the image.

  3. In the shapes.py file, make 2 functions that draw iconic versions of more complex things that are going to be in your scene. These aggregate shapes might be a bench, a tree, or a building. They should incorporate several of the simpler shapes from your library.

    When you define these aggregate shape functions, they should all take at least three parameters. The first two (x0, y0) will define the starting location for the shape and the third should define the scale of the shape. A scale factor of 1.0 should draw the shape in its natural size. Feel free to add additional parameters as you like to control other aspects of the shape. As with the basic shapes, your shapes should draw properly at any scale, location, or turtle orientation.

    For a little more detail on making aggregate shapes, see the geometric thinking page.

    In both of of your new functions, use one or more of the basic shape functions to draw the shape. For example, a building might incorporate the block and triangle functions. Test out your new functions before proceeding.

    In your writeup, include a picture demonstrating that each of your aggregate shape functions work properly. This is required picture 2.

  4. Using the functions you created in steps 2 and 3, make a scene from Colby by writing code in the colby1 function in your main.py file that draws the shapes in appropriate locations. In your scene, make use of the fact that your functions can draw the shapes with different sizes in different locations. You can also use the random package and for loops to make more complex scenes.

    Save the image and include it in your writeup. This is required picture 3.

  5. Make a second Colby scene in a function colby2 in your main.py file.

    Save the image and include it in your writeup. This is required picture 4.


Each assignment will have a set of suggested extensions. The required tasks constitute about 85% of the assignment, and if you do only the required tasks and do them well you will earn a B+. To earn a higher grade, you need to undertake one or more extensions. The difficulty and quality of the extension or extensions will determine your final grade for the assignment. One complex extension, done well, or 2-3 simple extensions are typical.


Make a new wiki page for your assignment. Put the label cs151f12project2 on the page. You each need to have your own writeup and code for this assignment.

The purpose of the writeup is threefold. First, it gives you the opportunity to organize your thoughts about the project and see the larger purpose of the various tasks. In the case of this project, for example, the purpose was to introduce you to making use of functions as abstractions that let you create more and more complex graphical designs.

The second purpose is to give you practice with communicating the process and algorithms you developed to others. The writeup should capture the key points of the code you wrote. In the case of this project, describe how you divided up the task of making a scene. Did the division make sense? What program elements--functions, loops, variables--did you use to complete the task? Don't focus on the syntactic details, but on the overall structure and process your code uses to solve the problem. The best writeups are tutorials on the subject that would be appropriate for your peers not in the course.

The third purpose is to communicate to us that you understood the project and to show off any extensions or extra things you did to make it more interesting. We're also interested in knowing the primary things you learned from the project.

In addition to making the wiki page writeup, put the python files you wrote (shapes.py, main.py) on the courses server in your private handin directory.

Colby Wiki

In general, your writeup should follow the outline below.