100-point rubric for the Pellet Pursuit final project. Students implement core engine methods, three ghost personalities, difficulty tuning, a custom bonus item, and file I/O, and deliver a short in-class demo. Extension tasks are a bonus.
Short but critical methods spread across the phase guides. Each one has a visible, testable consequence when missing.
| Method | File | Points | Broken state without it |
|---|---|---|---|
handleKey() + isWall() + canMove |
Player.java, GameMap.java |
10 | Player sits still, ignores input, phases through walls once moving |
draw() tile loop + eatDot() |
GameMap.java |
5 | Maze invisible; dots never disappear and level never ends |
collidesWith() |
Ghost.java |
5 | Ghosts never kill or get eaten |
updateBonusItems() |
GameApp.java |
5 | Bonus items never collected or removed |
saveToFile() + loadFromFile() |
ScoreTree.java |
10 | Scores reset every run |
insert() + collectDescending() |
ScoreTree.java |
15 | Leaderboard never populates |
All three ghosts (Patrol, Shy, Ambush) must behave distinctly from
each other and from the chase-only placeholder. collidesWith() (category 1)
must be working for ghost interactions to be gradeable.
Per-ghost breakdown (use to allocate partial credit):
| Ghost | Full | Partial | None |
|---|---|---|---|
| Patrol (pink) — patrol corner + chase when close | 10 | 5 | 0 |
| Shy (cyan) — flee until cornered, then attack | 10 | 5 | 0 |
| Ambush (orange) — target ahead of player’s heading | 10 | 5 | 0 |
| Item | Points |
|---|---|
| Maze is visibly different from the default layout | 5 |
Custom bonus item works, differs from Cherry (points, color, label), and has a custom draw() with a time-based visual feature |
5 |
LevelConfig tuning is not separately scored but is part of the In-Class Demo
— students should be prepared to explain what values they changed, why, and how
the game feel differs between level 1 and later levels.
Two minutes at the projector. Run your game and explain one design decision (ghost personality, maze layout, bonus item, or difficulty tuning).
| Score | Criteria |
|---|---|
| 5 | Game runs, student explains their choice clearly |
| 3 | Game runs but explanation is vague or incomplete |
| 0 | No-show, game crashes, or explanation is absent |
Students are expected to comment their own implementations, not the pre-existing engine code.
Base tasks are worth 100 points. Extension points are a bonus (max 5).
Students choose one of the three extension paths:
| Task | Points |
|---|---|
Per-level layouts (getLayout() returns different maze per level) |
+1 |
| Player movement re-implemented (all directions + tunnel wrapping) | +2 |
| BFS replaced with a different pathfinding strategy (must behave differently) | +2 |
Custom sprite images (PNG in resources/game/images/, loaded via loadImage()) |
+1 |
Student completed all four phases and built an additional project of their own choosing with remaining class time.
No data-structure requirements — base tasks already cover them.
Student completed Phase 1, submitted an approved proposal, and built a different project for Phases 2–4. Graded against the same four rubric categories as Pellet Pursuit — see mapping below.
Apply the standard rubric categories (sections 1–5) to the custom project, with these translations:
| Standard category | Custom project equivalent |
|---|---|
| Engine implementations | The method groups named in the approved proposal |
| Ghost personalities | Three concrete subclasses with visibly distinct behavior |
| Difficulty & game feel | Something tuned/designed that affects the experience |
| Demo | Run and explain one decision |
The custom project earns the same base 100 points as Pellet Pursuit; there are no additional extension points for doing Option 3.
Use this before submitting. Each item should be verifiable by running the game.
Engine implementations
isWall() returns true for wall tilescanMove in Player.update() uses isWall()handleKey() responds to all four arrow keys and WASDGhost personalities
Difficulty, maze & bonus item
Personalization
GAME_TITLE changed from “Pellet Pursuit”getName()Code & documentation
return statement left in a finished methodisWall() or collidesWith() are
missing, ghost behavior cannot be fairly assessed.Custom project track: