- Course: Fundamentals of Programming (INHN0002) — Heilbronn — WS 25/26
- Project: FoP Project — Maze Runner
- Tech: Java + libGDX (2D / Top-Down / Desktop: LWJGL3)
Watch the gameplay demo here: https://youtu.be/0t6_lOOpR9g
- Overview
- Story & Theme
- How to Run
- How to Play (Controls, Objectives, Rules)
- Requirement Mapping (Minimal Requirements)
- Additional Features (Beyond Minimal Requirements)
- Map Specifications (properties / tmx)
- Project Structure & Design
- Assets & Credits
- Troubleshooting
- Code Entry Points (for Reviewers)
Maze Runner is a 2D top-down game in which the player explores a maze, collects a key (Keycard), avoids dangers such as traps, enemies, and various gimmicks, and aims to reach the exit.
This project was implemented to integrate object-oriented design concepts taught in the course—such as responsibility separation, inheritance, delegation, and abstraction—into a complete game project.
The game includes:
- Main Menu / Level Selection / Settings (Key Remapping) / Pause (Esc)
- HUD (Lives, Key Status, Destination Arrow)
- Maze loading from properties files (course-specified
x,y=valueformat) - Intelligent enemy movement (AI pathfinding)
- Extended features (Endless Mode, Save & Load, Achievements, Skill Tree, Developer Console, Local Leaderboard)
This README is structured in the order Launch → Controls → Requirement Mapping → Design → UML, so reviewers can evaluate the project efficiently.
The title displayed on the title screen is “Git Containment.” The game takes place in a research facility that has been sealed due to an unknown contamination (referred to in-game as the “GIT Virus”). The interior has transformed into a maze.
The player explores the facility, collects fragments of a cure, avoids hazards, and attempts to escape.
- Victory / defeat messages are shown via
EndScreen - Background music and sound effects are selected to enhance exploration and tension
- Java JDK (JDK 8 compatible recommended)
- Gradle Wrapper included (
gradlew,gradlew.bat)
From the project root:
./gradlew lwjgl3:runOn Windows:
gradlew.bat lwjgl3:runlwjgl3/.../Lwjgl3Launcher.java– Desktop launchercore/.../Main.java– libGDXGameclass managing Screens
- Obtain the Key (Keycard) inside the maze
- Locate the Exit on the outer boundary
- Escape before running out of lives
Default key bindings are defined in GamePreferences.DEFAULT_KEYS.
- Move: Arrow Keys
- Sprint: Shift + Move
- Attack: Space
- Reload: R
- Interact: E
- Console: T
- Shoot: Left Mouse Button
- Zoom:
=(Zoom In) /-(Zoom Out) - Slots:
1–4
Key bindings can be remapped in the Settings screen and are saved and applied on the next launch.
- Walls cannot be passed
- Contact with traps or enemies causes damage (life reduction)
- HUD always displays lives, key possession, and destination arrow
- Esc opens the Pause menu (gameplay stops)
This section maps assignment requirements to concrete implementations for easier grading.
-
✅ Reads
assets/maps/*.propertiesusing thex,y=valueformat- Loader:
MapLoader.load(String fileString)
- Loader:
-
✅ All
.propertiesfiles inmaps/are listed and selectable in the menuLevelsScreen.populateCustomMapList()
-
✅ 2D top-down rendering using libGDX
GameScreen,LevelWorld,GameObject.render(...)
-
✅ Walls, entry, and exit are handled as separate objects and visually distinct
- Examples:
Wall,Exit, generated by map type values
- Examples:
-
✅ Four-direction movement
-
✅ Sprint with Shift
-
✅ Life (HP) system with HUD display
- Input/Movement:
PlayerInputProcessor,Player - Display:
HUD
- Input/Movement:
- ✅ Trap (static):
Trap - ✅ Enemy (dynamic):
Zombie - ✅ Intelligent enemy movement (wall avoidance / pathfinding):
GridPathfinder(A*) - ✅ Additional gimmicks (e.g., Portal implemented as map objects)
- also having guns and ammo for far range attack**
f the assignment strictly requires the third obstacle to reduce life on contact, ensure the README and implementation match exactly.
- ✅ Exit condition checks key possession:
ExitSystem(player.hasKey())
-
✅ Lives: heart display (
HUD) -
✅ Key possession: keycard UI (
HUD) -
✅ Destination arrow:
ExitPointerSystem- Points to key before pickup, exit after pickup
- ✅ Startup menu:
MainMenuScreen - ✅ Pause menu via Esc: handled in
GameScreen - ✅ Resume / Load Map / Exit via menu transitions
- ✅ Remappable in Settings
- ✅ Loaded on startup:
GamePreferences - Saved to:
assets/config/keybinds.properties
- ✅ Follow camera:
GameCamera - ✅ Screen resize support via
resize(...)and camera update - ✅ Zoom in/out via key bindings
-
✅ Audio system:
SoundSystem -
✅ Supports BGM (menu / gameplay) and SFX
- Events such as life lost, key collected, victory, and game over
**---
- System:
FogOfWarSystem - Effect: Limits visible area around the player
- Behavior: Visibility updates dynamically as the player moves
- Purpose: Increases tension and encourages careful exploration
-
UI:
HUD -
Lives display: Heart-based life indicators
-
Key status: Key possession shown at all times
-
Navigation aid:
ExitPointerSystem- Points to the key before collection
- Points to the exit after the key is obtained
-
Design goal: Always provide orientation without revealing the full maze
- Player entity:
Player - Input handling:
PlayerInputProcessor
Ranged Combat
- Weapons:
Gun,Shotgun,IceGun - Projectiles:
Bullet - Features: Reloading, weapon switching, mouse-based aiming
Melee Combat
- Weapon:
Sword/ club-style close-range weapon - Behavior: Instant damage on contact
- Design intent: High-risk, high-reward alternative to ranged combat
- Visual feedback: Temporary color change on player sprite when damaged
- Audio feedback: Damage sound effects
- State handling: Short invulnerability window after taking damage
- Purpose: Clearly communicate damage and prevent confusion during combat
- Main menu:
MainMenuScreen - Gameplay screen:
GameScreen - Pause menu: Triggered via
ESC - Settings screen:
SettingsScreen - Loading / transition screens:
LevelIntroScreen - End states:
EndScreen(Victory / Game Over) - Design goal: Clear separation of game states and safe transitions
-
Manager:
SoundSystem -
Background music:
- Main menu
- Gameplay
- Pause
-
Sound effects:
- Damage taken
- Item pickups
- Weapon usage
- Victory / defeat
-
Purpose: Gameplay feedback and atmosphere enhancement
-
Screen:
EndlessGameScreen -
Config:
assets/maps/endless.properties -
Generation:
MazeGenerator -
Features:
- Procedural maze generation from a seed
- Gradual difficulty scaling over time
-
Purpose: Replayability and leaderboard-based challenge
- Definitions:
assets/config/achievements.properties - Manager:
AchievementManager - Display:
AchievementScreen - Triggering: Event-driven achievement unlocking
- Purpose: Encourage exploration and long-term goals
-
UI:
DevConsole -
Command handling:
com.console.CommandManager -
Features:
- Runtime command execution
- Debugging and state inspection
-
Theme: Git-style command interface aligned with game concept
-
Manager:
SkillManager -
UI:
SkillScreen -
Progression:
- XP-based leveling
- Permanent upgrades
-
Purpose: Long-term character development beyond a single run
- Display:
LeaderboardScreen - Score source: Endless / Survival mode
- Storage:
GamePreferences(local preferences) - Purpose: Track high scores and encourage replayability
-
Manager:
GameSaveManager -
Data model:
GameSaveData -
Storage format: JSON serialization
-
Saved state:
- Player stats
- Current level
- Progress and inventory
-
Purpose: Allow session persistence and safe recovery
-
Collectible item:
Paper -
Behavior:
- Papers can be picked up inside the maze
- Each paper contains partial hints or encrypted information
-
Puzzle mechanic:
- The player must collect and interpret the papers
- Clues lead to discovering a hidden code
- The correct code is required to restore electricity in the facility
-
Environmental effect:
- Activating electricity lights up dark areas
- Improves visibility and reveals previously hidden paths
-
Purpose:
- Encourage exploration beyond direct navigation
- Add narrative-driven puzzle solving
- Integrate world interaction beyond combat and movement
This puzzle mechanic is optional for progression in some levels and reinforces the game’s investigation and containment theme.
GameSaveManager,GameSaveData- JSON-based full game state saving (player, level, progress)
EndlessGameScreen- Config:
assets/maps/endless.properties - Generation:
MazeGenerator
- Definitions:
assets/config/achievements.properties - Manager:
AchievementManager - Display:
AchievementScreen
- UI:
DevConsole - Command handling:
com.console.CommandManager - Git-style commands for debugging and navigation
- Display:
LeaderboardScreen - Score shown on:
EndScreen - Storage:
GamePreferences(Preferences)
- Manager:
SkillManager - UI:
SkillScreen
- Example:
5,6=3 - Coordinate system: bottom-left
(0,0), +x right, +y up
| value | object |
|---|---|
| 0 | Wall |
| 1 | Entry |
| 2 | Exit |
| 3 | Trap |
| 4 | Enemy |
| 5 | Key |
| also, having other object, these are just example |
Loader: MapLoader.load(String fileString)
- Loader:
MapLoader.loadFromTMX(...) - Level intro:
LevelIntroScreen
core/: Game logic, UI, systemslwjgl3/: Desktop launcher (LWJGL3)
core/src/main/java/com/GitLost/MazeRunner/:
ui/: Screens, HUD, Menus, Settings, Overlayssystems/: Per-frame game logic (camera, collision, exit, pickup, combat, fog, etc.)objects/: Static & dynamic maze objects (walls, exits, traps, bullets, weapons, pickups, gimmicks)entities/: Player and enemiesmap/: Map loading and coordinatesgame/: Settings, difficulty, save, achievements, skills, inventorypath/: Pathfinding (A*)com.console/: Developer console commands
- Clear separation between Screens (UI) and Systems (game logic)
- Maze state managed by
LevelWorld, updated by systems - Maze elements centered around
GameObjectto avoid duplication
Clearly list all used assets and licenses when submitting.
- Graphics: (Author / Website / URL / License)
- Music: (Author / Website / URL / License)
- SFX: (Author / Website / URL / License)
- Fonts: (Author / Website / URL / License)
- Ensure the IDE’s Gradle JVM points to a correct JDK (see assignment instructions)
- Remove
-XstartOnFirstThreadfrom run configuration if present
- Ensure files are under
assets/maps/ - Check
x,y=valueformat - Verify encoding and line endings
- Startup & screen flow:
Main - Normal gameplay:
GameScreen - Endless mode:
EndlessGameScreen - Map loading:
MapLoader - World generation:
LevelWorldFactory - Exit logic:
ExitSystem - Input:
PlayerInputProcessor - Enemy AI / pathfinding:
Zombie,GridPathfinder - HUD:
HUD,ExitPointerSystem - Save system:
GameSaveManager - Achievements:
AchievementManager - Skills:
SkillManager - Console:
DevConsole,CommandManager
-- Thank you for reviewing our project
(End of document)