CSE 498

Logo

MSU
Spring 2026

Home

Schedule

Projects

Quizzes

Weekly Updates

Code from Class

Resources

Project and Review Guidelines

Company-specific Project Pages

Project Overview

The largest chunk of the work for this course will be developing C++ code, first some useful tools and then a module (ideally using those tools) for a larger class-level project. It will be worth a total of 40 points, plus an additional 12 points associated with turning in weekly updates. The three code check-ins will be worth 10, 10, and 20 points respectively, with the first and last requiring accompanying video presentations.

Due Date Deliverable Value
Every Friday Weekly updates (1 point each) 12 points (updates)
Wed, Jan 28 Fri, Jan 30 Specs for initial C++ classes and team agreements Set project expectations
Mon, Feb 16 Code for working C++ classes (5 pts) and status video (5 pts) 10 points (project)
Mon, Feb 23 Peer reviews (5 pts) 5 points (peer review)
Fri, Feb 27 Code fixes based on peer reviews Improved code for grading
Wed, Mar 25 Code for advanced C++ classes (5 pts) and initial module (5 pts) 10 points (project)
Wed, Apr 1 Peer reviews (5 pts) 5 points (peer review)
Mon, Apr 6 Code fixes based on peer reviews Improved code for grading
Mon, Apr 20 Code for final module (15 pts) and project video (5 pts) 20 points (project)
Sun, Apr 26 Peer reviews (5 pts) 5 points (peer review)
Wed, Apr 29 Code fixes based on peer reviews Improved code for grading

Your project code grades will be based on three factors. The first two of these will be weighted evenly:

1. Functionality

Did you develop the full set of features for your project, ensure reliability and efficiency, and provide a proper user experience? The points for functionality will be independent of what your code looks like, only that the module you developed meets its goals.

Throughout the semester we will develop C++ classes and use them as the bases for a larger application. You will earn points based on how well you meet each set of project goals. We will have a series of milestones over the course to help you meet the project goals. The instructors will be in regular communication about your progress and you will be heavily involved in the setting of goals.

2. Code Quality

Is your code easy to understand and for other programmers to use?

While the ultimate functionality of your code is clearly important, being able to write code that is reusable, easy to understand by other programmers, and that you can be confident in its reliability is also a goal for this course. Code quality will be judged based on:

In addition to functionality and code quality, we will also be assessing your specific contributions and use this as a multiplier applied to the other points:

3. Individual Contribution

It is important that each group member provides a meaningful contribution to the overall group effort and to the course-level project as a whole. Based on ratings by your teammates and your role on the team (and audited by the instructors, if needed, using progress reports, git logs, and the work agreement) you will receive a qualification for how effective of a contributor you were to the project.

Additionally, we reserve the right to give out:

You will be getting regular in-class advice and feedback on your projects throughout the semester, including peer reviews from fellow students.

Project Groups

You will be in a group of five people to work on a semester-long project. Students will have the opportunity to discuss potential project ideas with each other and propose groups to the instructors. The instructors will form groups as needed, trying to match appropriate skill combinations and interests.

Once groups are formed, members will devise a working agreement with a plan for how they will all contribute to the project and support one another. Here is an example agreement.

Project License

To simplify working together and allowing all students in the course to be able to use the code we develop after the course is over, all communal code will be created under the MIT Public License. This license allows others to use the provided code however they want as long as they include the Copyright notice with it. Once you contribute to the project, make sure to add your own name to the license.

Project Topics

Initially, each group will be assigned a set of C++ classes to develop, one per student in that group. While each student should take the lead on one of the classes, they should help in the development of all of them. Indeed, some of the classes may be fairly easy to get an initial version working, and others will require more of the skills that you will develop over the course of the semester.

Some example classes include:

While developing these classes, you will also be designing a module for a large software project. To provide a real-world experience, sets of 7 to 8 groups (which we will call “companies”) will collaboratively produce a single, over-arching software framework. Each group will work on a single module to come together into a larger, agent-based system. Each component you build will serve as a piece of a larger puzzle. Sets of modules will interact through an API that company collectively establishes, allowing for some very different executables, depending on which modules are used. By the end of our course, our goal is for each company to have a functioning system where each module, be it a world, an agent, or an interface, seamlessly integrates with the others.

What might these larger agent-based systems be? You will work with your classmates and the instructors to decide, but some example possibilities include:

Module Types

Each company will be building modules that will plug together into full systems. Each system will include a subset of the modules with at least three different types: A world module, one or more agent modules, and one or more interface modules. Some systems will have user interfaces that behave more like agents (for example, a game or a social system), while others will focus on data collection and analysis with an overview interface (for example, a scientific simulation).

Each type of module should have specific functionality:

World Modules will need to track all of the areas, objects, and agents within that World, as well as handle any interactions between them and any changes that need to happen over time. The nature of what’s in the World and what interactions/events should occur will be determined by each World team. The World may specify a set of possible actions that agents can take, but the agents themselves will decide which of those actions they actually do take and when they take them. Furthermore, the World module may need to respond to requests for information from interface modules, but the World itself is not responsible for displaying that information to a human user.

Example: If we were to make a simple Pac-Man game, the World module would specify where the walls are, how many agents are needed, and the locations where those agents would start. As agents move around, the World must determine what should happen. For example, no agents should be allowed to move through walls. When agents collide, the World has to identify the collision and determine the outcome; if Pac-Man collides with a ghost, Pac-Man will usually die, but if he recently ate a power-up, the ghost will be sent home. (If two ghosts collide, nothing should happen). They must also track the locations of the dots are that can be consumed, power-ups, fruit, etc. and track the main agent (Pac-Man) to identify when those consumables are eaten and removing them.

We can also imagine a more complicated game World like a dungeon-crawler game where the World has many other things to track such as multiple types of monsters, a range of items (that can be part of an agent’s inventory), environmental effects, and what other locations each agent can see; at the same time it should facilitate appropriate agent-agent interactions (such as fighting or trading) and agent-world interactions (such as opening a chest, searching for a secret door, or falling into a trap). Similarly a World could be a realistic simulation, such as a stock-market where the World must allow agents to interact to be able to buy and sell, stocks, bonds, commodities, etc., as well as to collect data in order to be able to make informed decisions.

Agent Modules are the actual “brains” behind autonomous agents. These modules need to be able to request a set of possible actions from the World and decide which of those actions to take at each time step. Each action will have a name associated with it (such as, “turn left”, “go forward”, or “attack”) and the agent module will decide when to trigger these. The Agent behaviors might be hard coded, scripted, or fully AI controlled.

Example: In the Pac-Man game, we would likely want Agent controllers for the four ghosts. On easy mode, these might be manually written Agents that follow a simple set of rules, as was done in the original arcade game. On hard mode, these might be AI-agent modules that were trained to always head toward Pac-Man or otherwise surround or intercept him. The basic set of Agent behaviors should be easy to customize to whichever World they are placed in. In a more complex dungeon crawler World, there might be many additional actions (e.g., “shoot bow”, “drink potion”, etc) and the agent would be provided with only the limited portion of the World that they can actually sense (i.e., they might not be given the option to shoot a bow if they do not have a bow; if they are given the option nothing should happen if they pick it when they don’t have a bow and they should be notified that their action failed).

Interface Modules should provide humans with an ability to interact with the World, either directly or indirectly. Some basic Interfaces may use a similar API to the Agents. In such a case, rather than code dictating the actions of the associated Agent, humans will be able to use on-screen buttons, keymaps, or other carefully crafted Interface mechanisms with useful visual feedback. Many other types of Interfaces are possible. For example, a network Interface, simplicity may be key, allowing multiple users to connect with a basic Interface and only limited extra features (like group chat). A similar functionality can be provided with a single database that each World draws from in order to have many different instances of a World interacting (albeit slower than with a proper network Interface.) Some interfaces will be even more indirect, merely focused on collecting and analyzing data (see below)

Example: In Pac-Man, the Interface would need to show the entire World (as provided by the World) and allow players to steer Pac-Man, presumably with the arrow keys. In a more complicated World, however, the Interface would need to do more. In a more intricate setting like a dungeon-crawler, the Interface might need to offer functionalities like inventory checks, item equipping, and more.

Data-Collection/Analysis Module: These modules are specialty Interfaces that will extract insights from the system’s dynamics. Their primary function is data collection and visualization. As a World progresses over time, the analysis module should diligently track agent activities, World alterations, or other significant events or metrics. Beyond mere data collection, the modules should also offer intuitive visualizations to help make sense of the data. These might come in the form of graphs, heat maps, or an interactive dashboard, depending on the complexity and the data type. The ultimate aim is to allow for a post-run analysis that provides insights into the behaviors of agents, the interaction dynamics within the World, and potentially, areas for optimization or adjustment. In a simulation, this type of Interface will allow a use to disentangle what actually happened during the simulation, perhaps identifying informative dynamics. In a game, this analyses can be used to fine-tune the game, identifying where players got stuck, what obstacles where overcome too easily, and how long each level takes to play through. Even in a social interaction system, these analyses can log interactions and be used to record data for later (perhaps to-do lists or other records.)

Example: In the context of Pac-Man, the Analysis Module might track the routes taken by the ghosts, highlighting high-frequency paths with heatmaps. It might also document areas within the maze where Pac-Man is most frequently caught. Other metrics could include the average time taken to consume all dots, the frequency of power-up consumption versus ghost confrontations, or even Pac-Man’s movement patterns in relation to ghost proximity. By visualizing these metrics, players and developers can gain a clearer understanding of gameplay dynamics and strategize better for subsequent runs.

Write-up for Initial C++ Class Development and Module Ideas

Due: Jan 28 30, 2026

For each of the five C++ classes that your group will be developing, you should include in your writeup:

1) A class description, including what its goals are, and what its high-level functionality should look like. This does not need to perfectly match the description you were given, but it should be in the same general spirit unless you confirm any changes with the instructors ahead of time.

2) A list of similar classes in the standard library that you should be familiar with or use to inform the functionality you will be developing.

3) A list of key functions that you plan to implement. This does not need to be an exhaustive list, but it should give a strong indication of how the class should be used.

4) A set of error conditions that you will be responsive to. For each, indicate if its source was (1) programmer error, such as invalid arguments to a function, which should be caught by an assert, (2) a potentially recoverable error, such as a resource limitation, which should trigger an exception, or (3) a user error, such as invalid input, which needs to simply return a special condition for the programmer to respond to (note: these can usually be handled with exceptions as well if you prefer.)

5) Any expected challenges that you will be facing, an especially any extra topics you need to learn about. This information will help me make sure to cover topics early in the course or else provide your group with extra guidance on the project.

6) A list of any other group’s C++ classes that you think you may want to coordinate with (e.g., to have a compatible interface).

You can make some refinements to these specifications later, but will need to consult with the instructors before making wholesale changes.

In addition to the write-ups for your five C++ classes, you should also include a paragraph about your vision for the main module that you will develop. This description can be fairly high-level at this point, but will provide a concrete starting point to work with the other groups in your company on the bigger picture.

You will hand these in to your GitHub repository (full details coming soon).

Video Overview

Due: Feb 16 18, 2026

Your group needs to submit a video overview describing what your five C++ classess do and how they might be used.

Requirements:

Company Roles

In order to improve communication at each company, we are going to have have the Integration Lead for each team have a officer role for the company that highlights an area of integration that they will coordinate.

The seven officer roles we suggest are:

Role Integration goals
Product Design Officer Coordinate the high-level ideas for the software being produced, adjusting goals as the semester progresses.
API Officer Record API decisions for module coordination
Data Management Officer Record data type decisions to facilitate the API; for example, classes like Location or stats for agents, items, or grid cells
Serialization Officer Ensure consistent serialization techniques and that saving and loading work correctly
Integration Officer Ensures that integration tests exist and are included in automated testing
Documentation Officer Organizes documentation created by individual teams in to a consistent and accessible structure
Build System Officer Works with teams to make sure the build system uses the correct options to compile all of the modules

Most of the work will be performed by the individual teams, but these officers will ensure that the decisions made across groups are recorded, and that the entire project functions correctly when all of the modules come together.

Rubric for initial code reviews (Round 1)

Below are the topics that the C++ classes should be reviewed on during the first round of reviews.

Class Design

Implementation

Testing and Error Checking

In the future we will also be considering code optimization as a component of the reviews. If you see serious optimization issues at this point, however, you should still make sure to identify them.

Rubric for Code Reviews Round 2: Revised C++ Classes and Initial Working Modules

During this second round of code reviews, you will have a more specific assignment for what aspects of the target code you need to review.

The five areas where review needs to be done are:

  1. Code Design
  2. Implementation Quality
  3. Testing and Error Checking
  4. Use of Advanced C++ Features
  5. Interoperability and API

Items 1 through 3 are the same as the first review round (see above!), but this time we will have higher expectations. If you do not find any issue with a particular topic area, you should comment in your writeup about what you believe the developers did particularly well with their code.

For Item 4, you should comment on how well the developers incorporated some of the more advanced course topics into their code. While not every advanced topic needs to be represented, at least two (done very well) or three newer techniques should be there. The specific topics we are looking for are templates, lambdas, ranges, constexpr, and/or value semantics.

For Item 5, you should make sure that the classes and modules have appropriate interfaces for use by other groups, that are well documented and linked in. The code should have an example driver called source/GroupXX_main.cpp (with XX replaced with your group number) that, when compile and run, shows how the group’s module plugs in with others – even if it just uses example stubs.

Writing your Reviews

For these reviews, you should look at the appropriate pull request and comment on the specific areas that you are assigned. Any review comments that you can place directly on the code, that’s where it should go (note that code that has not changed will not be able to be commented on in place). All other comments (and review summaries) should be placed in a general review comment.

Keep a tab on the comments and please engage with any questions or comments the developers have, as appropriate, especially if clarifications are requested.