CS 161 Final Project
Overview
You will be implementing a final programming project to demonstrate all of the programming and computer science skills you've mastered throughout the course. This is a chance to work on something that is of interest to you, while also reinforcing what you've learned. You should aim to make a project that you'd be proud to show off to your friends and family--an awesome "look what I made!" program that will make you the envy of everyone you know.
- You can work on this project individually or in pairs (of your choosing). Groups of three are allowed with special permission, though 3-person groups will be expected to create projects that are larger in scope (since there are extra person-hours involved).
- Note that this project is intended to be around the size of two larger homework assignments--you have almost four weeks, but also have multiple people and will be able to use lab time to work.
-
Also note that unlike homework assignments, the steps to complete this project are not being organized or spelled out for you. Part of this assignment is to practice creating a Java program from scratch, using what you know about object-oriented programming and algorithm design. I am of course happy to answer questions and help you out (particularly with newer concepts), but the high-level design needs to come from you.
- That said, there are a couple of intermediate deadlines you will need to meet, described under "Schedule".
Schedule
You have until Wednesday, Dec 18 at 11:59pm to complete your project. (This is two days after the final exam, so you will have a chance to make some final changes without getting in the way of studying). However, there will be some deadlines along the way to help keep you on track:
-
Mon Nov 25, 5:00pm - Project Proposal
On Mon Nov 25, you will need to submit a short written proposal explaining what project you will complete. This proposal should contain a couple of parts:
- Names Include your name and who you are working with, if anyone. Note that each pair only needs to turn in one copy of this proposal.
- Project Description: Briefly (about a paragraph) explain what the project is. If you pick one of the suggested projects below, this should be easy. If you are choosing your own project, you will need to explain to me what the system is in some detail. Think about the user interaction: what will someone running the program see and do?
-
Class Diagrams: In addition to the above description, you should include a class diagram detailing the structure of each program in your class. This diagram should include the name of the class, the names and data types of instance variables, and the method signatures for each method in your class. Below is an example diagram of the
TicTacToeGame
class from Homework 8:You can easily make these diagrams as tables in Word; you will want one diagram for each class. It should be clear how your classes interact--for example, if one class is an attribute or a method parameter of another,
Note: it is perfectly fine to change your attributes and methods later! This is simple a sketch of a first pass through your design--a way for you to get started thinking about what your classes will need to look like!
- Schedule: Finally, you should include a brief description (a sentence or two) of what you intend to have completed for each of the alpha and beta demos (see below).
Overall, this proposal should be around a page or two in length. Be sure and proofread your proposal at least once--syntax and spelling is important in computer science, and so let's apply that to written English as well!
I will read this over and get it back to you ASAP (like the next day), so that you can get some feedback on whether the project will work out or not. You are also welcome to check in with me about your idea before your proposal is due (but you still need to write it up)!
-
Thur Dec 05 during lab - Alpha Demo
During lab on Dec 05, you will be showing me an "alpha" version of your project---what you have completed so far. This version should have basic functionality: you should have something showing up on the screen, and probably some basic logic. I'm looking to see that you've gotten started and are making progress on the assignment. Since this will be about two weeks in, you should be a bit over 50% done.
-
Wed Dec 11 during class - Beta Demo
For our final class meeting, you should be ready to show off a "beta" version of your project to your classmates (like in small groups, not to the entire class!). This means your program should be basically functional, but might lack more advances features or polish. You should be 75-80% done at this point.
-
Wed Dec 18, 11:59pm - Final Project Due
Your final project is due at midnight on Wednesday, Dec 18 (the Wedneday of finals week, two days after the final exam).
Once more, in case you missed it: the project is due Wednesday, Dec 18 at 11:59pm.
Project Requirements
You are welcome to design your own project for this assignment. Pick something that you think would be fun to create, useful to use, or neat to show off!
However, no matter what you choose, your project should meet a few basic requiremnts:
- Your project should include a Graphical User Interface (GUI). This can either be a window with buttons and labels, or a painted graphical image. But it shuold not be just a command-line program [unless you can make a really good argument for it in your project proposal!]
- Along those lines, your project should include user interaction with the GUI: mouse and/or keyboard interaction, interaction with buttons, etc. Be sure and think about what makes the program easy and pleasant to use!
- Your project should include multiple classes. This means the project should be large enough that it has more than one component. Of course, giving the program a GUI means that you'll likely need at least two classes (one for the UI and one for the program model).
- ...that's about it really. :)
We have included a couple of suggestions for suitable projects below. You are encouraged to choose one of these projects, but are welcome to come up with your own idea!
Some Project Options
At this point you have the ability (the power!) to create full if simple applications. One enjoyable program that you can use to show off your computer skills is to implement a computerized version of a classic board game. These games have relatively simple rules (since people need to be able to play them!), so are quite feasible to put together. Note that these would be games played by two players at the same keyboard--creating a computer opponent would be an extra challenge! Some examples are discussed below.
- I have also included some advice for getting started, as well as potential targets for the Alpha and Beta demos. You are of course welcome to modify the targets (or the projects!), explaining the differences in your proposal.
Othello
Othello (also known as Reversi) is a board game that involves two players. Players take turn placing disks so that their pieces flank a line of their opponent's pieces--thereby flipping the disks to that players' color. The player with the most disks showing his or her color wins.
Your game should could allow two humans to play against one another using the same keyboard: players would take turn clicking on the GUI to place a disk. The game should disallow illegal moves, and be able to report the winner at the end of the game (note that the game should be able to automatically determine when the game is over).
Getting started: Start by creating a GUI that draws the board and responds to mouse clicks. You'll need to be able to determine which "cell" the player clicked inside. Add in the ability to switch between players, so that each person can put down a different colored disk. Next, add in the ability to automatically flip disks, so that a proper game can be played. Finally, add in the ability to detect the winner (and possibly start a new game).
Alpha Demo: A program GUI that has all required components. Players can take turns selecting cells, which draws a placed disk as appropriate.
Beta Demo: The game validates moves (makes sure the players don't cheat!) and automatically flips disks.
Checkers
Checkers is one of the all time clasic board games. Your checkers game should allow players to select a piece, and then select where that piece can move to. Being able to select and "drag" a piece would be a nice way to go, though you'll need to have the piece "snap" to the grid. You'll also want to be able to select to jump over opponent's pieces.
Note: The really ambitious could even make a Chess game, playable by two humans. Keeping track of Chess moves is much more complicated, but still doable.
Getting started: Start by creating the GUI that draws the board and responds to mouse clicks. You'll then want to add the ability to "move" a piece, either by selecting the start and end squares, or by dragging the piece. Once you have the interaction in, you can add in the game logic to make sure players don't move illegally and to support jumping over pieces.
Alpha Demo: A program GUI that has pieces that can be selected (though not necessarily dragged). Being able to determine when the user has clicked on a piece is nontrivial, but not too difficult!
Beta Demo: The game allows the user to move pieces, as well as jump over opponent pieces.
Backgammon (Challenging!)
As an alternative to grid-based board games, you could make a computer version of Backgammon. In this game, players take turn rolling dice and then selecting a number of "slots" (called points) to move their pieces along that matches the die rolls. The goal is to move all your pieces to the other end of the track and off the board--the first player off wins!
You program could let players roll dice (picking random numbers!), and then select which pieces to move between points. Note that having the ability to "undo" a move (if you didn't use up all your points and so want to change your mind) might be nice.
This game is more complicated than the others, since there are more choices for the player to make (and you need to keep track of all that information). But it's a fun game ;)
Getting started: Start by drawing out your board, but don't get bogged down. Next you'll want to set up your data structure to keep track of how many stones are on each point--this will likely be more complicated than the simple arrays, ArrayLists, and 2D arrays we've used. Make sure you can draw stones as they correspond to the data in your game logic program. Once you have that, you can start adding interaction, with players able to select points to move between. Finally, add in the rest of the game logic.
Alpha Demo: A program GUI that can display the stones on the points--you should be able to "hard code" a board position (by adjusting the contents of your data structure) in order to make the points move!
Beta Demo: The game shoulw allow the user to move pieces around, possibly based on a die roll
Other Options
There are of course many other options for projects--you are not required to make a board game! Instead, you might consider making a classic arcade game, such as Pong, Snake, or Space Invaders. Maybe you want to extend a previous homework or lab in an interesing way (making GuitarPlayer into GuitarHero or a full-featured synthesizer; or making a Graphical Evil/Cheating Hangman). Or maybe you have another idea in mind--feel free to be creative! You can pick any project that sounds interesting to you. Come up with an application that seems fun and impressive and make that.
Submitting
There are multiple compents and requirements in submitting your project: be sure to read them carefully!
- First, your project proposal should be uploaded to the ProjectProposal folder on the submission folder on hedwig. Please submit this either in
.doc
,.docx
, or.pdf
format. Your proposal is due at 5:00pm on Mon Nov 25. -
Your will need to upload your entire final project folder (including all source code) to the ProjectFinal folder on the submission folder on hedwig.
- Include a README.txt that explains what your program is and how it works (from a user's perspective). This is like an instruction manual.
- In addition, you will need to include a .jar executable file that can be used to run your program outside of BlueJ. We will talk about how to produce these files in class (it is really simple). Simply put this file inside your project directory when you upload your work.
- Be sure that your code is extensively documented so I can follow what is going on! Since you're making your own program, I'm coming at it fresh; help me understand the work you did!
Grading
This project will be graded based on roughly the following components:
- Project Proposal and check-ins [10%]
- Project is completed and functions as intended, without errors [35%]
- Code is well organized into proper classes and methods, with good cohesion and coupling [25%]
- Project interface is usable and polished [10%]
- Code documentation is thorough and precise (explains the "why" of the code, not the "what") [20%]