Homework: Final Project

Assigned
  • April 23, 2026
Due
  • May 15, 2026 5:00pm
Collaboration
    You may work individually or in groups of up to three on this assignment. Make sure you review and understand the policies on the syllabus before you discuss your work on this assignment with anyone other than your group members.
Submitting
    You will submit your completed final project on Gradescope. Check back for specific instructions closer to the deadline.

Project Overview

For the final project in this class, you will design and implement a program that uses many of the concepts we’ve learned over the semester. There are suggested project ideas below, but you’ll also have the option to come up with a project of your own design (as long as it meets all of the requirements). You can work in groups of up to three students on the project, but you can also choose to work individually if you prefer. We will have multiple days of class reserved to work on projects, but you will need to find time to work on your project outside of class as well.

Suggested Projects

You’re welcome to develop your own project ideas, but here are a few suggested topics you might consider:

  1. Tetris: This classic block stacking game should meet all of the project requirements, even if you leave out some of the block shapes or skip features like rotating blocks.

  2. Snake: This game seems very close to the lightcycle game you already implemented, but with some added complexity. The game generates apples randomly on the board, and the snake grows longer each time it eats an apple.

  3. Asteroids: This is another classic game that might be a bit more of a challenge, since everything in the game moves and can collide. Getting this game to display with ncurses could be difficult, so you may need to use an actual graphics library (we’ll see one soon).

  4. Platformer: You could implement a classic 2D platformer for the project, as long as you have at least some moving elements other than the player.

All of these suggested projects are classic games, but your final project doesn’t have to be a game. A physics simulation, mathematical demonstration, or some other kind of interactive software could all be acceptable projects as long as they meet the requirements below. The best project is one that you’re excited about, as long as it meets the requirements and is appropriate scale for the time we have available.

Required Elements

You are welcome to choose any of the suggested projects above, but if you are interested in doing something a little different that is also an option. Whatever your chosen topic, your project must have all of these elements:

Interactivity:
Your project must receive and respond to user inputs during the majority of its running time.
Real-time Updates:
Your project must change state over time, even if the user is not giving input. A project that only updates state in response to user input (e.g. a turn-based game) may still be acceptable if the state updates are frequent and/or complex enough.
Graphical Output:
Your project must produce graphical output during the majority of its running time. Any use of ncurses beyond just displaying lines of text would qualify as “graphical.”
State Representation:
Your project must include a non-trivial amount of state that you will represent using arrays, structs, enums, or unions. Your project must use at least two of these elements.
Dynamic Memory:
Your project must include at least one non-trivial feature that requires malloc and free. This could be a changing number of objects in a game, an algorithm that requires variable size state, or something else.

You can probably think of a project that covers all of these elements but doesn’t align with the expected scope or difficulty for an end-of-course project. To be accepted, your project must have an actual need for each of the elements above and must make non-trivial use of each element. The instructor will make the final decision about whether a proposed project meets these requirements.

There are other requirements for your project laid out in the grading section below, but any acceptable project should be able to meet them. Make sure you review all the graded elements of the project at least briefly before you commit to a project to be sure you can satisfy them.

Presentation

In addition to implementing something for your project, you’ll present it to the rest of the class during finals week. Your presentation will need to include a live demo of your project, so make sure you prioritize building something you can run and show to the class by the scheduled presentation time.

Each group will have ten minutes to present their final project, plus a minute or two for Q&A while we switch between groups.

Required Elements

  1. What did you plan to build? (1–2 minutes)
    Give us a quick overview of the program you’ve planned to create.

  2. What have you built so far? (3–5 minutes)
    Give a live demo of your project as it stands right now. It’s okay if not everything is working, but you should prioritize your implementation work so you have something to demonstrate for us.

  3. How does your project work? (2–3 minutes)
    Give us a tour of your design, and highlight one significant challenge you’ve encountered. You can show us some code if necessary, but focus on higher level design.

  4. What is left to do? (1–2 minutes)
    Tell us about the work you’re still planning to do on the project and, if there’s time, a few details about how you plan solve any remaining problems.

Grading

Your projects will be worth the equivalent of two homework assignments. To receive full credit, your project must meet all of the following requirements:

Required elements:
Every project must include all of the required elements from the description above. Projects that include partial implementations of some elements may receive partial credit.
Presentation:
You must present your project during the scheduled presentation time to receive full credit. Details about the presentation and some presentation-specific requirements will be available soon.
Completeness:
Your project must be complete. That means there should not be obvious missing gaps in functionality in the final version you submit. For example, a game project would need to detect the end of the game and show the user a clear message about their final score, a win/loss result, or whatever else makes sense for the game. You are free to adjust the scope of your project up until the deadline, so “complete” doesn’t have to mean exactly what you planned at the start of the project. Just be careful not to lose any of the requirement elements in your project as you adjust scope.
Building and Documentation:
Your project must include a README file that explains what the program does, how to use it, and gives some detail about how it works. You must also include a Makefile that compiles the project from source.
Code Style:
Your project must follow all of the code style requirements for the class. That includes comments, informative variable and function names, consistent indentation, and more. Submissions that build with compiler errors or warnings will not receive full credit.
Code Organization:
Your code must be organized into functions with a clear, sensible purpose. Your project must also be organized into at least two separate source files with a header file linking them. The organizion of code across files must follow some logical grouping. If you are unsure about whether your code is disorganized or overly complex you can ask the instructor for feedback on your design.
Safety:
Your program must not rely on unsafe or undefined behavior. Some code style expectations also relate to safety (like checking for errors from standard functions) so those issues may receive deductions in both categories. Make sure your implementation never reads from uninitialized variables, always accesses arrays in bounds, and does not access storage locations after they have gone out of scope (i.e. do not return pointers to a function’s local variables). Your program must not contain any memory leaks, use-after-free errors, or other memory management errors. Unsafe code may cause your program to crash, but unsafe programs can appear to work correctly.

Class Concepts

You are welcome to use any concepts we have covered in class on your project. If you find a C language feature, a library, or some other tool you would like to use as part of your project that may be okay. Just make sure to discuss it with the instructor before you incorporate it into your project.

Late Work

The project deadline is the latest time that work can be accepted during the semester. Late work can only be accepted if you have an approved incomplete from the registrar. If this is something you need, make sure you pay close attention to the registrar’s deadlines and discuss the possibility of an incomplete with the instructor.

Academic Honesty

As with all work you do in this course, the academic honesty policy applies to your work on this homework assignment. Unlike individual assignments, you are welcome to discuss any aspect of your project with your project group. You are also welcome to discuss your project with students who are not in your group. However, you may not share project code with anyone outside your group. Academic honesty violations will be reported to the committee on academic standing, and can result in penalties for your grade on this assignment or the entire course if you are found responsible for the violation.