Final Project
Overview and Goals
The goal of the CS111 final project is for you to get more practice using concepts we've talked about in class, and especially to gain experience in linking different concepts together into a medium-sized project. As the code base you create will be larger than any that we've used in assignments, another goal of the project is for you to practice good code organization.
You can complete the final project with a partner of your choice (recommended!) or individually. The project expectations (scope, etc.) are the same regardless of if you work with a partner or alone.
Your final project will take one of two formats: you can either implement a game, or design a data visualization for a dataset of your choice.
First, some advice: start early, ask lots of questions, and have fun! You've come a long way since Week 1, and this project is a way to show off what you've learned. Anna, the lab assistants, and the prefect are all here to answer questions and help you succeed.
Deliverables overview
There are 5 deliverables/milestones for the final project:
- Partner and topic selection (May 18, 10PM on Gradescope)
- Project Proposal (May 22, 10PM on Gradescope)
- Progress Update (June 1, 10PM on Gradescope)
- Project demo session (June 8, 3:30-6PM in Olin 310)
- Final code submission (June 8, 9:30PM on Gradescope)
I'll go into more detail on each of these pieces below, but first, I'll talk more about the two project options: game or visualization.
Option 1: Implement a game
For this option, you can design a computer game that uses some level of computer intelligence.
- Some ideas: Scrabble, Battleship, Go Fish, Bejeweled, Connect Four, Mastermind, Dots and Boxes. These are just some suggestions, there are lots more games that could work well!
- Some anti-ideas: Your game shouldn't be too simple (Hangman, Tic-Tac-Toe, Pig/Hog) or too complex (Go, Catan, etc.). Text-adventure games also haven't worked well in the past because they often boil down to a long set of nested if statements.
- Game visuals: No graphics are required (I'm more interested in seeing how you structure your code and implement the algorithms you want to use), but if you'd like to make your game more visually appealing, you can use Turtle graphics, graphics.py (an object oriented graphics library that we'll practice using on Friday), or cImage.py.
- "Some level of computer intelligence": by this I mean that the computer should be able to play against a user or against itself in some kind of intelligent way. The computer doesn't need to be a world-class player (take CS 321 - Making Decisions with AI in the future if that's your goal), but you should make an effort for the computer to do something reasonable when playing.
Option 2: Create a data visualization
For this option, you'll choose a dataset that interests you along with a well-formed testable hypothesis. You'll then create data visualizations to support (or discredit) your hypothesis.
- Some example projects:
- Collect census data and public health statistics and compare with a theoretical epidemiological model.
- Process a bunch of texts written in Latin and look for allusions among them.
- Find a dataset of protein interactions in human cells and try to infer something about the network of interactions as a whole.
- You should write code that analyzes the data and presents the results in a useful and non-trivial way. Matplotlib, which we used on HW6, is a useful library for visualizing data. I'd encourage you to explore their documentation for ideas of what you can visualize.
- You should use a fairly large dataset (no strict size requirements, but it should be something that you couldn't reasonably analyze by hand).
- Your final project submission will include a short writeup (2-3 pages single spaced) that discusses the background of your problem, your hypothesis, the results, and the conclusions you draw from those results.
- Your visualization should be influenced by user input in some capacity (e.g., the user could indicate how many years of data to include, or how many graphs to display, etc.).
General requirements for both types of projects
Your code should have the following attributes:
- Use Object Oriented Programming (OOP) practices. In particular, your code should build and use multiple classes of objects.
- Use methods and functions as appropriate instead of having many pieces of identical or similar code.
- Follow the course style guidelines.
- Full attribution of any outside resources you use, both in help from people and the internet. Unlike with the
homework assignments, you may use the internet to get ideas and suggestions. However, no one other than you or
your partner should produce any code that you submit. In particular, you cannot use Python code from the internet,
chatbots/AI, or other sources. You should understand all the code you submit. You'll need to give a summary
of outside sources you used in
README.txt(described below), but you should also include citations in your code when a particular line or function was influenced by outside sources.
You'll need to submit a file called README.txt that contains the following information:
- A description of your program and its features.
- A brief description of how your program is constructed (class organization, data storage, etc.)
- A summary of the current status of your program - what works and what doesn'take
- Instructions for running your program. (E.g., type
python3 game.pyin the terminal). I'll use these instructions when running your program and evaluating it, so please make sure it's clear what I need to do!
Partner work:
- You are able to select your own partner for this project.
- If you're trying to find a partner, please post in the Project channel in Ed and include some description of the types of project you're interested in.
- You may work individually if you have a good reason to do so, but I encourage people to work with a partner if possible!
- Unlike pair programming HW assignments, you are not required to work on all aspects of the project together. It's fine to divide and conquer, but make sure you take the time when integrating the different parts of your work to understand how all the pieces fit together.
Details on deliverables/milestones
For each deliverable, only one partner needs to submit on Gradescope (then, add your partner to your group).
Partner and topic selection
Submit a PDF with the following information on Gradescope by Monday May 18 at 10PM:
- Who is working on your project? (Include your name and your partner's name, if applicable). If you're planning to work alone, please give me a short explanation of why. If you would prefer to work with a partner but were unable to find one, please let me know that too.
- Are you planning to implement Option 1 (a game) or Option 2 (a data visualization)?
- If Option 1, what game(s) are you considering?
- If Option 2, what data (or type of data) are you considering using?
The goal of this submission is to make that everyone who wants a partner has one, and to get early feedback on your project idea from Anna.
Project Proposal
Submit a PDF with the following information to Gradescope by Friday May 22 at 10PM:
- Your name and your partner's name, if applicable
- A short description of your project
- For the game option, tell me what game you're planning to implement and a brief description of how that game works. The description should be at the level of the instructions that you'd provide to a new player.
- For the data option, briefly describe the dataset you're using (including where you are accessing the data from and what information is included in the dataset). If possible, upload the dataset with your submission or include a link to it.
- A description of your planned code structure, including:
- A list of classes you plan to implement
- For each class, a list of possible instance variables along with what type of object they are
- For each class, a list of possible methods including parameters, return values, and a brief description of what the method does
- Any other functions you think you'll need to implement including parameters, return values, and a brief description of what the function does
- Anything else you think you need, but haven't figured out how to include in the design yet.
- Other details about your project
- For the game option, provide an overview of how you think the computer intelligence piece will work. You should provide enough detail so that someone else could follow the instructions and implement something that works similarly to your final product. For example, a bad computer intelligence strategy for Mastermind would be to guess a random color in each position every turn. A slightly better intelligence strategy for Mastermind is to guess all known colors (colors that were correct and in the right spot) and to choose randomly for the remaining spots.
- For the data option, describe what types of analysis you'll do and what figures you might create.
The purpose of this submission is to make sure you're thinking early about how your project will be structured. Thinking through what you need to include in your code before you start coding will make the coding process much smoother, and you'll ultimately end up with higher-quality code.
I won't hold you to the code structure that you outline here (and it's very normal to have to make small modifications to your proposed plan), but you should take this submission seriously and try to come up with something reasonable.
Progress Update
Submit the following files to Gradescope by 10PM on Monday, June 1:
- All your project code (including your dataset, if applicable). It doesn't need to be polished or even working yet, just submit what you have.
- A file called
README.txtthat includes the following information (bulleted lists is fine, this doesn't have to be a formal document):- What works so far
- What doesn't work yet and what the plan is to implement it (e.g., who is leading the implementation for each piece, if there are particular roadblocks or things you're getting stuck on)
The purpose of this submission is to force you to make progress on an ongoing basis, and for me to be able to step in and provide help to groups that are struggling.
There's no set amount of functionality you should have implemented by this date, but a good goal is to have classes implemented to the level where you can create objects and perform at least some methods on them.
Demo session
During our final exam slot (Monday, June 8 at 3:30PM) we'll have a demo session. This is a chance to show off your work, see what your classmates have done, and have a final opportunity to get feedback before the final submission. I'll provide more information on what to expect towards the end of term.
Final code submission
Submit your project to Gradescope by 9:30PM on Monday, June 8th. This is a firm deadline and I cannot accept late work without an extension from the Dean of Student's office. Gradescope allows you to resubmit assignments up until the deadline, so if you're working up until close to 9:30, I recommend turning in a draft earlier in the day as a backup plan in case of last minute technical difficulties.
Make sure to include all the files you need (all your code, your dataset if applible, your README.txt file, and the 2-3 page paper
if you're doing the data option).
Grading
In total, the final project is worth 10% of your grade. That's further broken up into these pieces:
- Project proposal (and partner selection/topic selection): 20% (graded on completion)
- Project milestone: 10% (graded on completion)
- Demo session: 10% (grading details provided closer to the date but will be a mixture of pass/fail "do you have a project to show me" and how clear your explanation is)
- Final submission: 60% (details below)
Your final project submission will be graded on the following criteria, in descending order of importance:
- Correctness: Does your program work? Are there bugs or does it crash? Does your program meet the stated
requirements? Did you submit a
README.txtwith instructions on how I can run the program? Are sources properly documented? - Complexity: How complicated is your project? How complex is the computer intelligence or visualizations?
- Style: Is the code well-organized, readable, and well-documented? Are you using classes and functions appropriately? Do you avoid duplicated code?
Correctness is the most important factor, so you should make sure the basic functionality of your program works as expected before trying to add additional features.