CS 111 Checklist
Completed checklist for CS 111 course alignment rubric evidence.
CS 111 Course Alignment Rubric
This chart focuses on how GameLevelBasketball.js demonstrates each concept in a concrete way.
| Concept | How I completed it in GameLevelBasketball |
Complete |
|---|---|---|
| Writing Classes | I created the custom GameLevelBasketball class to control the full basketball minigame. |
✓ |
| Methods & Parameters | I used methods like updateProjectiles(now, lebron), spawnProjectileFromPlayer(player, now), and isHitboxCollision(a, b). |
✓ |
| Instantiation & Objects | I instantiate the level objects through this.classes with GameEnvBackground, Player, Npc, Coin, and Barrier. |
✓ |
| Inheritance (Basic) | The level uses engine classes that extend the game object hierarchy, including Player, Npc, Coin, and Barrier. |
✓ |
| Method Overriding | The level defines its own lifecycle methods such as initialize(), update(), and destroy() to customize runtime behavior. |
✓ |
| Constructor Chaining | The basketball level composes engine objects that use constructor chaining internally when created from this.classes. |
✓ |
| Iteration | I loop through projectile arrays in updateProjectiles() and through filtered coins in reset/spawn logic. |
✓ |
| Conditionals | I use if conditions for caught state, pregame lock, stun, projectile cooldowns, collision checks, and win conditions. |
✓ |
| Nested Conditions | The update() method layers multiple conditions like timer checks, caught state, stun state, and collision outcomes. |
✓ |
| Numbers | The code uses positions, cooldowns, speed, survival time, projectile radius, and score math. | ✓ |
| Strings | The code uses sprite IDs, dialogue text, HUD text, localStorage keys, and direction names. | ✓ |
| Booleans | State flags include caught, preGameLocked, scoreSubmittedThisRound, levelCompleted, and completionTriggered. |
✓ |
| Arrays | Arrays are used for this.classes, this.projectiles, and filtered collections of coins or game objects. |
✓ |
| Objects (JSON) | Player, chaser, barrier, and coin setup all use object literals for configuration. | ✓ |
| Mathematical Operators | The chase system uses subtraction, division, multiplication, and addition with dx, dy, dist, and speed scaling. |
✓ |
| String Operations | Template literals build HUD text and dynamic CSS positions like `${projectile.x - projectile.radius}px`. |
✓ |
| Boolean Expressions | Compound comparisons and && logic are used in hitbox collision and input/state checks. |
✓ |
| Keyboard Input | keydown listeners handle restart with R and shooting with E. |
✓ |
| Canvas Rendering | drawProjectileSprite() renders the basketball projectile directly on a canvas with arc and curve drawing commands. |
✓ |
| GameEnv Configuration | The level uses gameEnv.innerWidth, gameEnv.innerHeight, gameEnv.path, gameEnv.container, and gameEnv.stats. |
✓ |
| API Integration | The level submits a score through the leaderboard system using submitScore(...). |
✓ |
| Asynchronous I/O | Score submission is handled as an async promise with .catch(...). |
✓ |
| JSON Parsing | The level works with structured game config objects and stats objects; API response handling is delegated through the leaderboard module. | ✓ |
| Code Comments | The file includes explanatory comments around chase behavior, fairness, and hitbox alignment. | ✓ |
| Mini-Lesson Documentation | I created the Basketball concepts breakdown page and linked it from my portfolio. | ✓ |
| Code Highlights | The portfolio now includes highlighted snippets and explanations for Basketball logic. | ✓ |
| Console Debugging | The Kirby project includes strategic logs in the broader lesson flow and can be debugged through stateful methods in this level. | ✓ |
| Hit Box Visualization | The level uses custom hitbox rectangle logic in getHitboxRect() and isHitboxCollision() to refine collisions. |
✓ |
| Source-Level Debugging | The level is broken into named methods, which makes it straightforward to inspect with DevTools breakpoints. | ✓ |
| Network Debugging | Leaderboard submission can be inspected in the Network tab when scores are posted. | ✓ |
| Application Debugging | localStorage is used for best time and best coins with loadBestTime(), saveBestTime(), loadBestCoins(), and saveBestCoins(). |
✓ |
| Element Inspection | The HUD and projectile canvases are created dynamically in the DOM, making them inspectable in the Elements panel. | ✓ |
| Gameplay Testing | The level supports repeated playthroughs with reset, caught, and completion flows. | ✓ |
| Integration Testing | Leaderboard behavior can be tested by playing the level and submitting a score. | ✓ |
| API Error Handling | submitRoundScore() catches failed leaderboard submissions with .catch((err) => console.warn(...)). |
✓ |
GameLevelBasketball Final Project Rubric Alignment
| Concept / Rubric Requirement | How I Applied It in My Game | Actual Code Example |
|---|---|---|
| Object-Oriented Programming (OOP) | I created a custom game level class that controls the entire basketball level logic, state management, collisions, projectiles, HUDs, and gameplay systems. | js class GameLevelBasketball { constructor(gameEnv) { this.gameEnv = gameEnv; } } |
| Classes Extending Base Classes | I used multiple classes that extend Game Engine base classes like Player, Npc, Coin, Barrier, and GameEnvBackground. | js import Player from '@assets/js/GameEnginev1.1/essentials/Player.js'; import Npc from '@assets/js/GameEnginev1.1/essentials/Npc.js'; |
| Instantiation & Objects | I instantiated game objects using object literals inside the GameLevel configuration array. | js this.classes = [ { class: Player, data: sprite_data_player }, { class: Npc, data: sprite_data_chaser }, { class: Coin, data: coin_1 } ]; |
| Inheritance | My game uses inheritance through Game Engine classes like Player, Npc, Coin, and Barrier which inherit from parent game object classes. | js import Barrier from '@assets/js/GameEnginev1.1/essentials/Barrier.js'; |
| Methods & Parameters | I created methods with parameters to control gameplay systems like collisions, projectiles, and spawning. | js isHitboxCollision(a, b) { const ar = this.getHitboxRect(a); const br = this.getHitboxRect(b); } |
| Method Overriding | The imported classes override engine lifecycle methods like update(), draw(), and handleCollision() internally. My GameLevelBasketball also manages update() behavior for the level. | js update() { const player = this.findById('BasketballPlayer'); const lebron = this.findById('LeBron'); } |
| Constructor Chaining | The imported engine classes use constructor chaining with super(data, gameEnv) when extending engine objects. My GameLevelBasketball constructor initializes all level data. | js constructor(gameEnv) { this.gameEnv = gameEnv; } |
| Numbers Data Type | I used numbers for positions, timers, projectile speed, score systems, cooldowns, and movement calculations. | js this.projectileSpeed = 9; this.shootCooldownMs = 5000; this.targetSurvivalSeconds = 20; |
| Strings Data Type | I used strings for IDs, messages, directions, dialogue, and leaderboard names. | js id: 'BasketballPlayer', greeting: 'Ball handler ready.' |
| Booleans Data Type | I used booleans to manage game states like caught, levelCompleted, preGameLocked, and completionTriggered. | js this.caught = false; this.preGameLocked = true; this.levelCompleted = false; |
| Arrays Data Type | I used arrays for game objects, projectiles, dialogue lists, and level configuration. | js this.projectiles = []; dialogues: ['LeBron is in the gym.'] |
| JSON Objects / Object Literals | I used object literals for sprites, hitboxes, positions, barriers, and coins. | js const coin_1 = { id: 'coin_1', INIT_POSITION: { x: 200, y: 300 }, value: 1 }; |
| Mathematical Operators | I used math operators for movement physics, projectile motion, collision detection, and scaling difficulty. | js const dx = player.position.x - lebron.position.x; const dy = player.position.y - lebron.position.y; |
| Boolean Expressions | I used boolean logic for cooldowns, collisions, and game conditions. | js if (event.key.toLowerCase() !== 'e' || event.repeat) return; |
| String Operations | I used template literals and string concatenation for HUD displays and navigation URLs. | js this.timeHud.textContent = `Time: ${this.currentTime.toFixed(1)}s`; |
| Conditionals | I used if statements throughout the game to manage collisions, cooldowns, resets, and win conditions. | js if (this.currentTime >= this.targetSurvivalSeconds) { this.completeLevel(); } |
| Nested Conditions | I used nested conditionals for more advanced gameplay logic like collisions combined with stun states and cooldown systems. | js if (lebron && this.isCircleHittingObject(projectile, lebron)) { this.lebronStunUntil = now + this.lebronStunDurationMs; } |
| Iteration / Loops | I used loops to update projectiles, coins, and game object arrays. | js for (let i = this.projectiles.length - 1; i >= 0; i -= 1) { projectile.x += projectile.vx; } |
| Keyboard Input | I implemented keyboard controls for movement, restarting, and shooting basketball projectiles. | js document.addEventListener('keydown', this.handleShootKey); |
| Canvas Rendering | I used the Canvas API to render custom basketball projectiles. | js const ctx = projectile.canvas.getContext('2d'); ctx.arc(cx, cy, r, 0, Math.PI * 2); |
| GameEnv Configuration | I configured game environment dimensions, object spawning, and level setup using GameEnv. | js const width = gameEnv.innerWidth; const height = gameEnv.innerHeight; |
| API Integration | I integrated the Leaderboard API to submit player scores to the backend. | js this.leaderboard.submitScore(username, score, 'Basketball') |
| Asynchronous I/O | I used asynchronous promises with .catch() for leaderboard API requests. | js this.leaderboard.submitScore(username, score, 'Basketball').catch((err) => console.warn(err)); |
| JSON Parsing / Object Access | I accessed and modified JSON-style game objects throughout the level. | js this.gameEnv.stats.coinsCollected = 0; |
| Single Responsibility Principle | I separated gameplay systems into focused methods like updateProjectiles(), createHud(), completeLevel(), and resetRound(). | js updateProjectiles(now, lebron) { } createHud() { } resetRound() { } |
| State Management | I managed game states like caught, stunned, completed, pregame lock, and timers. | js this.caught = true; this.lebronStunUntil = now + this.lebronStunDurationMs; |
| Collision Detection | I created hitbox collision systems for player-vs-enemy and projectile-vs-enemy collisions. | js return ( ar.left < br.right && ar.right > br.left ); |
| Hitbox Visualization Logic | I customized hitboxes using width and height percentages for accurate collision balancing. | js hitbox: { widthPercentage: 0.45, heightPercentage: 0.5 } |
| Physics & Movement | I implemented directional movement and normalized chase movement using vector math. | js lebron.position.x += (dx / dist) * speed; |
| Enemy AI / Chase Logic | I programmed LeBron to dynamically chase the player based on relative position. | js const dx = player.position.x - lebron.position.x; |
| Dynamic Difficulty Scaling | I increased enemy speed over time to make survival progressively harder. | js const speed = Math.min(2.1 + this.currentTime * 0.03, 2.8); |
| Projectile System | I created a custom projectile system where the player can shoot basketballs to stun the enemy. | js this.spawnProjectileFromPlayer(player, now); |
| Cooldown System | I added cooldown timing to prevent projectile spam. | js if (now - this.lastShotAt < this.shootCooldownMs) return; |
| DOM Manipulation | I dynamically created HUD elements and updated their styles during gameplay. | js this.timeHud = document.createElement('div'); |
| HUD / UI System | I created a timer HUD and message system that updates during gameplay. | js this.timeHud.textContent = `Time: ${this.currentTime.toFixed(1)}s`; |
| Local Storage Persistence | I used localStorage to save best survival time and coin records between sessions. | js localStorage.setItem('basketball_best_time', String(this.bestTime)); |
| Event Systems | I used CustomEvent dispatching for level completion and gameplay progression triggers. | js window.dispatchEvent(new CustomEvent('characters:level-complete')); |
| Dialogue System | I implemented an intro dialogue system before gameplay starts. | js this.introDialogue = new DialogueSystem({ dialogues: ['Foreign explorer?'] }); |
| Randomization | I randomized coin spawning positions using Math.random(). | js coin.position.x = xMin + Math.random() * (xMax - xMin); |
| Error Handling | I used try/catch and promise catch statements to prevent crashes from API or browser errors. | js try { localStorage.setItem(...) } catch (_) {} |
| Debugging Practices | I used console warnings and logs for debugging events and API issues. | js console.warn('Leaderboard score submit failed:', err); |
| Gameplay Testing | I tested player movement, collisions, timers, stun mechanics, and leaderboard integration to ensure the level was fully playable. | js if (this.isHitboxCollision(player, lebron)) { this.caught = true; } |
| Complete Custom Level | I built a complete basketball survival game level with enemies, coins, barriers, UI, AI, projectiles, collisions, and win conditions. | js export default GameLevelBasketball; |