Final Project

Goal and Notes

The goal of this project is to use your new computational skills to do something awesome!

You may do this project individually or in a pair, with a partner of your choice. You'll have about two weeks to build your project, so you have the time to really build something bigger and more sophisticated than we've made so far for this class. The expectations are proportionally higher for pairs than individuals.

This project consists of four “deliverables”, delivered at three different times:

  1. A design document.
  2. A public demo of your project during our final-exam period.
  3. A final hand-in of your software and a short writeup about it.

Evaluation

Whatever you choose to build (we'll get to that in a second), I will grade your software based on the following factors:

  1. How cleanly the program runs: is it bug-free? Does it crash? Does it run smoothly and at a reasonable speed?
  2. Sophistication: a project that involves sophisticated ideas or implementations is preferable to a simplistic one. Only original code that you write will count toward this evaluation.
  3. Software Design: how organized is your source code? Is it easy to understand? Is it well commented? Do different components have well-defined jobs?

The first factor above is most important. A program that runs correctly and error-free, and achieves the content specifications below, will earn a better grade than an incredibly smart chess program that crashes and provides unreadable output. Of course, given two programs side-by-side that run perfectly and are equally well-designed, the one that accomplishes more (as a result of more original work by the authors) will receive the better grade.

So what's this deal about originality? You will be evaluated only on the new code that you write, and the resulting behavior due to that code. There are tons of libraries out there for Python, and you're welcome to use pretty much any library you can find, in the service of producing a cool final project. But if everything interesting that happens in your program is due to the work that the library does, and the code you wrote is just “glue” code that sticks the various third-party pieces together, then that won't count for a lot in my evaluation of your work.

Similarly, your project may recycle old code from class or from your homework submissions. But any code you recycle will be disregarded in the evaluation of the sophistication of your work. So small changes to code that you've submitted before, or that I wrote, will not count for a lot.

Project Options

Graphical Simulation

Create an interactive simulation of (some aspect of) the real world. You could simulate animal swarms, planetary motion, linguistic evolution, ecological dynamics, reaction and diffusion of chemicals, etc. Your simulation must be time-dependent (that is, the system must change over time) and must be displayed graphically: a side view of an aquarium, a top view of the solar system, etc. These requirements combine to mean that your visualization must be animated.

Your simulation should be based on some kind of well-supported model of real-world behavior — this can be a model that you design, but if so you must include a good justification for the model in your final writeup.

Your simulation may include pretty much any features you can cook up, but it minimally must include:

Game

Create a computer game. This can be entirely text-based, or you can do some graphics with graphics.py, imageManip.py, or Pygame if you'd like like. No graphics are required or necessary, though; it's up to you whether you'd rather place more effort in the logic of a text-based game, or in the challenges of implementing interactive graphics.

Unless your game is quite complicated in implementation, your project should incorporate some level of computer intelligence. In some sense, the computer should play against you or manage your game in some kind of intelligent way. You don't need to get the computer to be a world-class player of your game, or even close (we've got an Artificial Intelligence elective for that), but some sort of effort here could really pay off.

Data Investigation

Use your computational skills to automatically analyze some large, interrelated body of data. Maybe you want to scrape the web for census data and public-health statistics, then compare all that to some theoretical epidemiological model. Or maybe you'd like to process a bunch of ancient texts written in Latin, looking for allusions among them. Or perhaps you've got a giant database of protein interactions in human cells, and you want to try to infer something about the network of interactions as a whole.

Your data investigation should be based on a well-formed, testable hypothesis. The software you write should not only analyze the data, but also collect it autonomously (if that makes sense for your data source) and present the results in a useful and nontrivial way.

In addition to writing an analysis program, you must also prepare a short writeup (2–3 pages, single-spaced) that discusses the background of your problem, your hypothesis, your data sources, how your program addresses your hypothesis, the results, and the conclusions you draw from these results.

Your Own Idea

Would you like to apply what you're learning about computing to something in another discipline, not covered by the Graphical Simulation or Data Investigation options above? Perhaps you want to build a tool that helps with some complicated task; perhaps you want to do something artistic. Talk to me.

Advice

You'll have about two weeks to work on the execution phase of your project. This is more time than you've been able to devote to any of the assignments so far in the class, and you're also fairly experienced now in designing and writing software. However, there's only so much you can get done in two weeks.

In the past, the biggest trap that students have fallen into this assignment is picking something too complex and not having the time to finish it. That's why I'm asking you to submit a design document describing what your project will do. The more detail you provide, the better I can help direct you in the appropriate direction.

Furthermore, we've been emphasizing throughout the term that it's important to keep your program in a working state, only adding one feature at a time. This applies to big projects, too. So while you're thinking about the project you'd like to do, think about how to “stage” it too — what's the very simplest version of this project that you could build? If you build that, what's one feature you could add to it? What feature would you add next? If you plan things out in this way, you can be sure that you'll have a working program (which, as mentioned above, is the primary evaluation criterion) whenever you choose to call your project finished.

Successful Projects from the Past

Graphical Simulation
A planetary simulation with body-merging on collisions
Reaction-diffusion simulation
A simulation of language acquisition and exchange in two neighboring villages
Game
A “rogue-like” game with randomly-generated dungeons
Battleship, with an AI player
Bejeweled
Graphical 20 Questions, guessing a Carleton student from a huge set of photos scraped from the online directory
Data Investigation
Analysis of language use on Reddit
College recommender
Allusion detection in ancient Latin texts
Your Own Idea
A painting program, which the student used to paint some portraits
A GUI file manager
A 3D graphics system built on graphics.py

Unsuccessful Projects from the Past

Note that these are examples of projects that have been unsuccessful in the past. This does not mean that they're off-limits, just that others (sometimes many others) have tried and failed to produce a good result. So I recommend against them, and against projects that have similar disadvantages. I can imagine ways to make each of the above-named projects great, but doing so in two weeks would take a rare combination of luck, planning, and coding ability.

In addition to the lists above, Dave Musicant has a big list of game projects with observations of what works and what doesn't. If you're curious what Bagels is (I'd never heard of it), here's a great explanation and playable online implementation of the game. It might be useful to look around at other online puzzle games and so forth for inspiration, if you'd like to build a game.

Deliverables

1. Design Document

The design document is due on Saturday, 24 May, at 8pm. Submit it as a PDF on Moodle.

Type up your design document in such a way that you can produce a PDF file. Be sure to put your name on it, and if you're working in a pair, put both names on it and submit only one copy.

Describe in brief your plan for your final project. It should contain a description of the program(s) you plan to write, a plan for the stages of your development, and a careful description of the algorithms you hope to implement. You don't really need all the details at this point, but I do want to know your general plan.

By “stages of development”, I mean a sequence of versions of your program: one baseline thing that runs, then a version with an additional feature, then a version with another feature... Plan your development so that each of these versions will be fully working and testable before adding the next feature.

Another way to look at it is this: A design document that shows that you have applied the first three steps of the object-oriented design process, and have also planned for stages of development, is sufficient. (That is: what objects are in your program? What are their instance variables? What are their methods? Which things will you implement first, and which can wait till later?) Remember to think about how you would implement the user interface for your program, and how to keep the components of your program well separated into Model, View, and Controller portions.

If it covers the above, the design document does not need to be longer than a page.

2. Demo

Project demonstrations will occur during our normally scheduled exam time: Sunday, 8 June from 3:30pm to 6pm. There is no “hand-in” for this; you just have to show up and show your work. You will be expected to attend the entire demo event, even while you are not yourself presenting your project.

You will be required to show your project to me and your classmates, and anyone else who happens to show up during this time. You and your group should run your project and be prepared to explain what it should be doing, how to play (if it's a game), how the simulation works (if it's a simulation), etc.

The format of the presentation will be a gala of sorts: each group will have a 30 minute slot during which they will have their project running on a computer. They will log in and show it off to anyone who asks questions. Multiple groups will be presenting at the same time, so everyone else is welcome to check out what is going on.

Feel free to invite your friends who aren't in intro to come and check out your projects.

It is not required that your project be in its final, finished state at the time of the demo. But enough of it should be finished that you can demonstrate what is going on, how your project works, and maybe have only some small changes left that you will make.

3. Final Submission

The final project is due Monday, 9 June at 5pm. Your submission will consist of:

In addition to the above, if you do the “Data Investigation” option, you must also submit your 2–3-page writeup as a PDF file. The expectations for the sophistication or difficulty of your program are somewhat lower for this option, to compensate for the extra work involved in preparing the writeup.

Note that I cannot grant extensions beyond the above-stated deadline under any circumstances. The College has strict policies that forbid faculty from taking assignments any later than the end of final exams without an extension granted by the Dean of Students' office.

Grading

As explained above, your code will be graded based on its performance, sophistication, and design. Remember that the first criterion is the most fundamental; it is most important to submit something that works. Set modest goals and achieve them first, then enhance your program later.

On academic honesty: You must submit a program that you and your teammate (if you have one) write yourselves. You may obtain help from other students in getting ideas and in debugging your code, but you must write your own program. If you choose to utilize libraries (such as graphics.py, imageManip.py, or others), you must clearly acknowledge them. Make sure to review the syllabus, and ask me questions if you have any.

The final project will be graded on a 50-point scale, with points allocated as follows:

If you do the “Data Investigation” option, your writeup will count for 2 of the 22 Execution points and 1 of the 10 Sophistication points.

Much of the original writing for this assignment description was done by Dave Musicant, with modifications by Andy Exley, and then more by me.