For Instructors

Instructor Guide & Answer Key

Teaching guidance for every pathway, plus collapsible answer keys for the typed-code lessons. Answer keys stay folded until you click them, so this page is safe to have open on a projector β€” mostly. πŸ˜‰

Reference 3 Pathways Playground Answer Keys

How the site works

The lesson pattern

Most levels come in three parts: Learn (example + concept art), Build (modify working code), and Challenge (write it from scratch). Completing each part earns a star.

Stars & XP

Progress is saved in the browser on that device (no accounts). Each completed activity = 1 star = 10 XP, shown in the quest strip on lesson pages and the quest map on pathway pages. Clearing the browser's site data resets progress β€” useful between class periods on shared machines.

The robot console

Typed-code lessons use a safe mini-console: say("...") prints output and the robot speaks it. Real JavaScript syntax rules apply β€” quotes, parentheses, semicolons. Errors make the robot look confused and show a friendly message.

Sound & music

Every page has a πŸ”Š button (sound effects) and most have a 🎡 button (background music) in the bottom-right corner. Both remember their setting per device β€” mute once for a quiet classroom. Music starts after the first click on the page (a browser rule).

Foundations Studio (ages 6–9 Β· no typing required)

Interactive drag-and-drop lessons. There are no typed answer keys β€” success is built into each activity β€” so this section is teaching guidance plus the Bug Detective key.

Sequence (Lessons 1–8)

Covers: Steps in the right order make a program. From the Space Rescue drag-and-drop through Syntax Sandwich, Debug Lab, Repeat patterns, and the Mini Program Builder with its animated character stage.

Teach it: Always predict before running. On builder stages, students pick a character and watch their program act β€” ask β€œwhat will happen?” before every Run.

Watch for: Drag-and-drop order mistakes are the lesson, not a failure. On the Syntax Sandwich, the order of layers maps to order of code lines.

Variables (Lessons 1–8)

Covers: A variable is a labeled box. Name Box β†’ Score Keeper β†’ Mood Machine β†’ Character Card β†’ Inventory Backpack β†’ Color Switcher β†’ Light Switch β†’ Mini Game State.

Teach it: Use physical boxes with sticky-note labels for the youngest learners. Each lesson is one kind of value: words, numbers, lists, true/false.

Watch for: Students changing the label instead of the value. The Light Switch lesson is true/false β€” connect it to If/Then later.

Loops (Lessons 1–8)

Covers: Repeat without rewriting. Repeat Dance β†’ Two-Step Pattern β†’ Loop Counter β†’ Repeat Until β†’ Nested Loops β†’ Loop Debugger β†’ Choose the Loop β†’ Loop Mini Program.

Teach it: Clap the patterns out loud (β€œstomp-clap, stomp-clap”) β€” rhythm is how kids feel loops. Nested loops = a dance inside a dance.

Watch for: Counting how many times something repeats vs how many commands are inside the loop β€” keep asking β€œhow many TOTAL claps?”

If / Then (Lesson 1)

Covers: Choose the Condition, Decision Builder, and Choice Challenge β€” programs make choices based on conditions.

Teach it: Play β€œif the music stops, freeze” first. Conditions are familiar from games β€” code just writes them down.

Watch for: β€œWhat happens if the condition is false?” β€” students expect something; nothing is the answer.

Bug Detective πŸ” (Lesson 5)

Covers: Watch a buggy program run, spot the evidence, tap the broken step, fix it, and re-run. Three cases.

Teach it: Bugs are clues, not mistakes. The wrong run is intentional β€” celebrate finding the bug as loudly as fixing it.

Watch for: See the answer key below if a case has the class stuck.

πŸ”‘ Bug Detective answer key
  • Case 1: step 2 is the bug β€” the robot walks into the rock. Fix: it should be jumpOver().
  • Case 2: step 1 is the bug β€” the repeat count is wrong. Fix: repeat 3 times:.
  • Case 3: step 1 is the bug β€” the steps run in the wrong order. Fix: pick up the pizza must come before walk to the star.

Code Studio (ages 9–12 Β· real JavaScript)

Twelve levels, each with Learn / Build / Challenge. Answer keys show the example solutions β€” any student code meeting the challenge requirements counts. Accept creative variations!

Level 1 Β· First JavaScript Command / Message Builder / Challenge

Goal: Run a real say() command and understand strings (text in quotes).

Teach it: Read the line out loud: β€œsay, open parenthesis, quote…” Punctuation IS the lesson. Let students make the robot say silly things β€” engagement does the rest.

Watch for: Missing quotes or the semicolon; curly β€œsmart quotes” if they paste from a doc. The robot looks confused when code has an error β€” that's the debugging cue.

πŸ”‘ Answer key
say("Hello Class");

Challenge needs at least two say() lines. Any strings are correct.

say("My first JavaScript challenge:");
say("I can make the computer show my words.");

Level 2 Β· Real JavaScript Variables / Variable Builder / Challenge

Goal: Store values in named variables and use them in output. Builder adds numbers and joining with +.

Teach it: Use the labeled-box picture on the page: label outside, value inside. Have students swap "Mia" for their own name first β€” instant ownership.

Watch for: Quotes around variable names (say("heroName") prints the label, not the value); forgetting let; spaces in variable names.

πŸ”‘ Answer key
let heroName = "Mia";
let power = "moon jump";

say(heroName);
say(power);

Builder:

let playerName = "Ari";
let score = 10;
let badge = "Star Coder";

say(playerName + " earned " + score + " points.");
say(playerName + " unlocked: " + badge);

Challenge needs two variables used in say():

let petName = "Pixel";
let petPower = "laser purr";

say(petName);
say(petPower);

Level 3 Β· Real If / Then / Builder / Challenge

Goal: Use a boolean condition to decide whether code runs.

Teach it: Act it out as the guard at the treasure door (the page's metaphor). Then flip true β†’ false and run again β€” the silence is the β€œaha.”

Watch for: Students expect false to print something. Nothing happening IS correct β€” say it before they run it. Also = vs === if they improvise.

πŸ”‘ Answer key
let hasKey = true;

if (hasKey) {
  say("Open the treasure door.");
}

Builder uses a comparison:

let playerScore = 12;
let hasEnoughPoints = playerScore >= 10;

say("Score: " + playerScore);

if (hasEnoughPoints) {
  say("Unlock the rainbow shield.");
}

Challenge:

let hasMagicMap = true;

if (hasMagicMap) {
  say("Show the secret path.");
}

Level 4 Β· Real JavaScript Loops / Builder / Challenge

Goal: Write a for loop that repeats output with a counter.

Teach it: Translate the loop header into words first: β€œstart at 1, keep going while ≀ 5, add 1 each time.” Change one number at a time and predict the output count.

Watch for: Off-by-one confusion (< vs <=); editing i in one place but not the others; infinite-loop worry β€” the console caps output.

πŸ”‘ Answer key
for (let i = 1; i <= 5; i++) {
  say("Jump number " + i);
}

Challenge needs a loop that prints β‰₯ 3 messages:

for (let step = 1; step <= 3; step++) {
  say("Robot step " + step);
}

Level 5 Β· Real JavaScript Functions / Builder / Challenge

Goal: Define a function once, call it many times. Builder adds parameters.

Teach it: Use the page's bottled-spell metaphor: writing the function bottles it, calling it pours it out. Two calls to the same function = the payoff moment.

Watch for: Defining but never calling (nothing prints!); mixing up the parameter name inside vs the value passed in.

πŸ”‘ Answer key
function cheer() {
  say("You can code!");
}

cheer();
cheer();

Builder with parameters:

function introduce(name, power) {
  say(name + " uses " + power);
}

introduce("Nova", "spark jump");
introduce("Milo", "shield glow");

Challenge: any function called twice:

function celebrate(item) {
  say("The robot found " + item + "!");
}

celebrate("a star");
celebrate("a badge");

Level 6 Β· Real JavaScript Arrays / Builder / Challenge

Goal: Store a list in one variable and read items by index; Builder loops over the array.

Teach it: The backpack metaphor is on the page β€” lean on slot numbers starting at 0. Ask β€œwhat's in slot 0?” before they run.

Watch for: Index 0 confusion is universal β€” expect backpack[1] to be β€œthe first one.” Also .length vs the last index.

πŸ”‘ Answer key
let backpack = ["map", "snack", "flashlight"];

say(backpack[0]);
say(backpack[1]);
say(backpack[2]);

Builder:

let badges = ["helper", "debugger", "builder"];

for (let i = 0; i < badges.length; i++) {
  say("Badge " + (i + 1) + ": " + badges[i]);
}

Challenge: own array, show β‰₯ 3 items:

let missionItems = ["star", "key", "rocket"];

for (let i = 0; i < missionItems.length; i++) {
  say("Pack the " + missionItems[i]);
}

Level 7 Β· Real JavaScript Objects / Builder / Challenge

Goal: Group related values into one object and read them with dot notation.

Teach it: Frame it as a character card (the page does too): one card, many facts. Compare with juggling three separate variables.

Watch for: Dot vs bracket mix-ups; forgetting commas between properties; quotes around property names (not needed here).

πŸ”‘ Answer key
let robot = {
  name: "Bolt",
  power: "star scanner",
  score: 10
};

say(robot.name);
say(robot.power);
say(robot.score);

Builder passes the object to a function:

let hero = {
  name: "Nova",
  tool: "debug wand",
  level: 3
};

function showHero(character) {
  say(character.name + " carries a " + character.tool);
  say("Level " + character.level);
}

showHero(hero);

Challenge: own object, β‰₯ 3 properties:

let game = {
  title: "Star Rescue",
  goal: "pick up the star",
  lives: 3
};

say(game.title);
say("Goal: " + game.goal);
say("Lives: " + game.lives);

Level 8 Β· Real JavaScript Classes / Builder / Challenge

Goal: Write a class (blueprint), construct objects with new, call methods.

Teach it: Cookie-cutter metaphor: the class is the cutter, each new stamps a cookie. Making TWO objects from one class is the point β€” don't skip it.

Watch for: Forgetting this. inside the class; calling the class instead of the object (Robot.introduce()); missing new.

πŸ”‘ Answer key
class Robot {
  constructor(name, power) {
    this.name = name;
    this.power = power;
  }

  introduce() {
    say(this.name + " uses " + this.power);
  }
}

let helper = new Robot("Bolt", "star scanner");
helper.introduce();

Builder β€” two objects from one blueprint:

class Character {
  constructor(name, tool, level) {
    this.name = name;
    this.tool = tool;
    this.level = level;
  }

  showCard() {
    say(this.name + " carries a " + this.tool);
    say("Level " + this.level);
  }
}

let nova = new Character("Nova", "debug wand", 3);
let milo = new Character("Milo", "loop boots", 4);

nova.showCard();
milo.showCard();

Challenge:

class GameLevel {
  constructor(title, goal) {
    this.title = title;
    this.goal = goal;
  }

  start() {
    say("Level: " + this.title);
    say("Goal: " + this.goal);
  }
}

let levelOne = new GameLevel("Star Rescue", "pick up the star");
levelOne.start();

Level 9 Β· Mini Game Engine / Game Builder / Challenge

Goal: Combine class + array + methods into a tiny game; the page renders a live game screen from their say() output (β€œBolt collected star” shows the item on screen).

Teach it: Point at the game screen, not the code: β€œmake something appear on screen.” Output phrased like β€œName collected item” or β€œScore: 15” drives the visuals.

Watch for: Students who say() random text and wonder why nothing appears β€” the screen reacts to collected/found/score patterns.

πŸ”‘ Answer key
class Player {
  constructor(name) {
    this.name = name;
    this.items = [];
  }

  collect(item) {
    this.items.push(item);
    say(this.name + " collected " + item);
  }
}

let player = new Player("Bolt");
player.collect("star");
player.collect("key");

Builder adds score + status:

class Player {
  constructor(name) {
    this.name = name;
    this.score = 0;
    this.inventory = [];
  }

  collect(item, points) {
    this.inventory.push(item);
    this.score = this.score + points;
    say(this.name + " found " + item);
  }

  showStatus() {
    say("Score: " + this.score);
    say("Items: " + this.inventory.join(", "));
  }
}

let explorer = new Player("Nova");
explorer.collect("star", 10);
explorer.collect("badge", 5);
explorer.showStatus();

Level 10 Β· Game Rules / Rules Builder / Challenge

Goal: Write conditional rules (the β€œreferee”): methods that return true/false and an if/else that announces the result.

Teach it: Have students state the rule in English first (β€œyou win if you have the star AND 10 points”), then translate. && = β€œand” reads naturally.

Watch for: Returning a string instead of a boolean; testing only the happy path β€” ask β€œwhat should happen WITHOUT the key?”

πŸ”‘ Answer key
class Player {
  constructor(name) {
    this.name = name;
    this.items = [];
  }

  collect(item) {
    this.items.push(item);
  }

  hasItem(item) {
    return this.items.includes(item);
  }
}

let player = new Player("Bolt");
player.collect("star");

if (player.hasItem("star")) {
  say("Mission complete!");
} else {
  say("Keep searching for the star.");
}

Challenge β€” win rule with two requirements:

class Game {
  constructor(title) {
    this.title = title;
    this.score = 0;
    this.items = [];
  }

  earn(item, points) {
    this.items.push(item);
    this.score += points;
  }

  checkWin() {
    if (this.items.includes("star") && this.score >= 10) {
      say(this.title + " won!");
    } else {
      say("Keep playing.");
    }
  }
}

let game = new Game("Star Rescue");
game.earn("star", 10);
game.checkWin();

Level 11 Β· Debugging Game Rules / Debug Builder / Challenge

Goal: Test rules with multiple cases, including ones that should fail.

Teach it: Frame tests as β€œfiring questions at the rule.” Predict each test's answer (true/false) before running β€” prediction is the whole skill.

Watch for: Students only write passing tests. Require one test that SHOULD return false; that's also the challenge requirement (β‰₯ 3 cases, one failing).

πŸ”‘ Answer key
function canWin(items, score) {
  return items.includes("star") && score >= 10;
}

say("Test 1: " + canWin(["star"], 10));
say("Test 2: " + canWin(["key"], 10));
say("Test 3: " + canWin(["star"], 5));

Challenge:

function canFinishLevel(items, score) {
  return items.includes("star") && items.includes("key") && score >= 15;
}

function check(name, actual, expected) {
  if (actual === expected) {
    say(name + ": pass");
  } else {
    say(name + ": needs debugging");
  }
}

check("all requirements", canFinishLevel(["star", "key"], 15), true);
check("missing key", canFinishLevel(["star"], 15), false);
check("low score", canFinishLevel(["star", "key"], 5), false);

Level 12 Β· Capstone Mini Game / Builder / Challenge

Goal: One tiny complete game: class, array, methods, score, and a win rule β€” every tool from Levels 1–11.

Teach it: Treat it as a project, not an exercise: students pick the title, hero, items, and points. Rubric: does it run, does it use a class + array + if, can they explain each line?

Watch for: Scope creep! Encourage finishing a small game over starting a big one. Copy-paste from earlier levels is allowed β€” that's real programming.

πŸ”‘ Answer key
class MiniGame {
  constructor(title) {
    this.title = title;
    this.score = 0;
    this.items = [];
  }

  collect(item, points) {
    this.items.push(item);
    this.score += points;
    say("Collected " + item);
  }

  finish() {
    if (this.items.includes("star") && this.score >= 10) {
      say(this.title + " complete!");
    } else {
      say("Keep building your game.");
    }
  }
}

let game = new MiniGame("Robot Star Quest");
game.collect("star", 10);
game.finish();

Challenge β€” a full example students can model on:

class AdventureGame {
  constructor(hero) {
    this.hero = hero;
    this.score = 0;
    this.items = [];
  }

  collect(item, points) {
    this.items.push(item);
    this.score += points;
  }

  play() {
    this.collect("star", 10);
    this.collect("shield", 5);

    if (this.items.includes("star") && this.score >= 15) {
      say(this.hero + " wins the adventure!");
    } else {
      say(this.hero + " keeps exploring.");
    }
  }
}

let finalGame = new AdventureGame("Nova");
finalGame.play();

OOP Studio (ages 9–15 Β· objects & classes)

Six concept lessons plus the Critter Factory game. The arc: blueprint β†’ state β†’ collections β†’ inheritance β†’ polymorphism β†’ encapsulation.

Lesson 1 Β· Blueprint to Object (+ Object Builder / Challenge)

Goal: A class is a blueprint; new builds one real object from it.

Teach it: Use the page's blueprint art: you can't pet a blueprint. Build two creatures from one class so they see the blueprint reused.

Watch for: Confusing the class name with the object name; missing new.

πŸ”‘ Answer key
class Creature {
  constructor(name, sound) {
    this.name = name;
    this.sound = sound;
  }

  speak() {
    say(this.name + " says " + this.sound);
  }
}

let pixel = new Creature("Pixel", "beep");
pixel.speak();

Challenge β€” own class, two objects, one method each:

class PowerUp {
  constructor(name, points) {
    this.name = name;
    this.points = points;
  }

  activate() {
    say(this.name + " gives " + this.points + " points");
  }
}

let star = new PowerUp("Star", 10);
let shield = new PowerUp("Shield", 5);

star.activate();
shield.activate();

Lesson 2 Β· Methods Change State (+ State Builder / Challenge)

Goal: Methods change the values stored inside an object (energy, health, score).

Teach it: Run play() twice and track the energy number dropping β€” the battery art on the page mirrors it. β€œThe object remembers.”

Watch for: Expecting the variable to reset between calls; forgetting this. when changing the property.

πŸ”‘ Answer key
class RobotPet {
  constructor(name) {
    this.name = name;
    this.energy = 3;
  }

  play() {
    this.energy = this.energy - 1;
    say(this.name + " played. Energy: " + this.energy);
  }
}

let pixel = new RobotPet("Pixel");
pixel.play();
pixel.play();

Challenge β€” property changed by a method called twice:

class GameCharacter {
  constructor(name) {
    this.name = name;
    this.health = 5;
  }

  takeHit() {
    this.health -= 1;
    say(this.name + " health: " + this.health);
  }
}

let hero = new GameCharacter("Nova");
hero.takeHit();
hero.takeHit();

Lesson 3 Β· Object Collections (+ Collection Builder / Challenge)

Goal: Put many objects in an array and loop over them so every object acts.

Teach it: The kennel-shelf art: each slot holds a whole pet. for (let pet of pets) reads as plain English β€” read it aloud.

Watch for: Mixing up the loop variable (pet) with the array (pets); calling the method on the array instead of each item.

πŸ”‘ Answer key
class RobotPet {
  constructor(name, energy) {
    this.name = name;
    this.energy = energy;
  }

  status() {
    say(this.name + " has " + this.energy + " energy.");
  }
}

let pets = [
  new RobotPet("Pixel", 3),
  new RobotPet("Bolt", 5),
  new RobotPet("Zara", 4)
];

for (let pet of pets) {
  pet.status();
}

Challenge β€” β‰₯ 3 objects, loop calls one method on each:

class PowerUp {
  constructor(name, points) {
    this.name = name;
    this.points = points;
  }

  activate() {
    say(this.name + " gives " + this.points + " points");
  }
}

let powerUps = [
  new PowerUp("Star", 10),
  new PowerUp("Shield", 5),
  new PowerUp("Key", 3)
];

for (let powerUp of powerUps) {
  powerUp.activate();
}

The Critter Factory 🐾 (game lesson)

Goal: Hands-on payoff for Lessons 1–3: build a Critter class, spawn critters with new, call methods, watch the code log write itself.

Teach it: Let students play freely for 5 minutes, THEN point at the code log: β€œeverything you clicked was a line of code.” The mission bar tracks progress β€” ticks earn star bursts.

Watch for: It saves nothing between visits; missions reset on reload. That's fine β€” replaying is fast.

Lesson 4 Β· Inheritance (+ Builder / Challenge)

Goal: A child class extends a parent: it inherits everything and adds its own powers.

Teach it: The family-tree art on the page is the script: Wizard IS a GameCharacter, so it can introduce() without writing it again.

Watch for: Re-writing parent methods in the child unnecessarily; thinking the parent can use the child's methods (it can't β€” powers flow down).

πŸ”‘ Answer key
class GameCharacter {
  constructor(name) {
    this.name = name;
  }

  introduce() {
    say("I am " + this.name + ".");
  }
}

class Wizard extends GameCharacter {
  castSpell() {
    say(this.name + " casts a sparkle spell!");
  }
}

let hero = new Wizard("Nova");
hero.introduce();
hero.castSpell();

Builder β€” one parent, two children:

class Creature {
  constructor(name) {
    this.name = name;
  }

  move() {
    say(this.name + " moves across the map.");
  }
}

class Dragon extends Creature {
  breatheFire() {
    say(this.name + " breathes a tiny practice flame.");
  }
}

class Unicorn extends Creature {
  heal() {
    say(this.name + " shares healing light.");
  }
}

let dragon = new Dragon("Ember");
let unicorn = new Unicorn("Luna");

dragon.move();
dragon.breatheFire();
unicorn.move();
unicorn.heal();

Challenge β€” parent + one child adding a method:

class Tool {
  constructor(name) {
    this.name = name;
  }

  use() {
    say("Using " + this.name + ".");
  }
}

class MagicTool extends Tool {
  glow() {
    say(this.name + " glows with extra power!");
  }
}

let wand = new MagicTool("Star Wand");
wand.use();
wand.glow();

Lesson 5 Β· Polymorphism (+ Builder / Challenge)

Goal: Different classes share the same method name but each responds its own way.

Teach it: The speak() button art: same button, cat says meow, dog says woof. The loop is the magic β€” it calls speak() without knowing which animal it has.

Watch for: This is the most abstract lesson β€” if it wobbles, run the example and just ask β€œwhy did the same line print two different things?”

πŸ”‘ Answer key
class Animal {
  constructor(name) {
    this.name = name;
  }

  speak() {
    say(this.name + " makes a sound.");
  }
}

class Cat extends Animal {
  speak() {
    say(this.name + " says meow.");
  }
}

class Dog extends Animal {
  speak() {
    say(this.name + " says woof.");
  }
}

let animals = [new Cat("Pixel"), new Dog("Bolt")];

for (let animal of animals) {
  animal.speak();
}

Challenge β€” two children overriding the same method:

class Power {
  constructor(name) {
    this.name = name;
  }

  use() {
    say(this.name + " is used.");
  }
}

class SpeedPower extends Power {
  use() {
    say(this.name + " makes the hero zoom!");
  }
}

class ShieldPower extends Power {
  use() {
    say(this.name + " blocks the next hit!");
  }
}

let powers = [
  new SpeedPower("Lightning Boots"),
  new ShieldPower("Bubble Shield")
];

for (let power of powers) {
  power.use();
}

Lesson 6 Β· Encapsulation (+ Builder / Challenge)

Goal: Keep data inside the object and change it only through methods that enforce rules (health never below 0, can't spend coins you don't have).

Teach it: The safe art: health lives in the safe, takeDamage() is the only door. Try to break it β€” deal 99 damage and watch the rule hold at 0.

Watch for: Students bypassing methods by setting hero.health = 999 directly β€” great discussion: the door works, but you have to choose to use it.

πŸ”‘ Answer key
class Player {
  constructor(name) {
    this.name = name;
    this.health = 10;
  }

  takeDamage(amount) {
    this.health -= amount;
    if (this.health < 0) {
      this.health = 0;
    }
  }

  heal(amount) {
    this.health += amount;
    if (this.health > 10) {
      this.health = 10;
    }
  }

  status() {
    say(this.name + " has " + this.health + " health.");
  }
}

let hero = new Player("Nova");
hero.takeDamage(3);
hero.heal(1);
hero.status();

Challenge β€” a protected value with sensible rules:

class BankAccount {
  constructor(owner) {
    this.owner = owner;
    this.balance = 0;
  }

  deposit(amount) {
    if (amount > 0) {
      this.balance += amount;
      say(this.owner + " deposited " + amount + " coins.");
    }
  }

  spend(amount) {
    if (amount <= this.balance) {
      this.balance -= amount;
      say(this.owner + " spent " + amount + " coins.");
    } else {
      say("Not enough coins.");
    }
  }

  report() {
    say(this.owner + " has " + this.balance + " coins.");
  }
}

let account = new BankAccount("Kai");
account.deposit(8);
account.spend(3);
account.report();

Playground games

Free-play with a learning spine. These have no single right answer β€” the guidance below tells you what β€œgood” looks like.

Obstacle Course

Covers: Sequencing + debugging with movement commands. Easy/Medium build with blocks; Hard is typed code (loops allowed); Level 1 is a fixed designed course.

Teach it: Courses are randomly generated but always solvable. Reset replays the same course (great for debugging); New Course rolls a new one. On the Pond, the water is out of bounds: walk on touching stones, and every gap is exactly one stone wide β€” jump it with the matching direction (jumpRight(), jumpUp()…). Snacks must be picked up with pickUp() while standing on them, or the star won't count.

Watch for: There is no single right answer β€” any program that reaches the star and collects every snack wins. Ask students to find a SHORTER program once they've solved it; on Hard, ask for a loop.

Robot Recipe

Covers: The robot follows the recipe exactly β€” including its bugs. Students fix the layer order to match the customer's order.

Teach it: β€œThe robot did exactly what the recipe said” is the line of the day. The bug step gets highlighted after a wrong run.

Watch for: Answers vary with each surprise order β€” match the order card top to bottom.

Mood Machine

Covers: Functions with arguments control a mini website: background, message, character, animation. Challenge mode gives a target to match; Hard mode requires typing the four calls.

Teach it: One argument at a time: change just the background, run, observe. That isolation habit is real programming.

Watch for: Hard mode answer shape: setBackground("sunset"); setMessage("Hello!"); setCharacter("πŸ€–"); setAnimation("bounce"); β€” values must match the target card exactly.

Button Blaster

Covers: A clicker game about variables and game state: score, points-per-click, upgrades. Then students rebuild the logic with code blocks in the lab.

Teach it: Connect every upgrade to a variable change: β€œDouble Power” just means perClick = perClick * 2.

Watch for: Bombs subtract 3 points β€” that's intentional. The win is owning all 5 upgrades.

Choose-Your-Path Story & Decision Tree

Covers: The Moon Base Mystery as a playable branching story, then the same story as a decision tree β€” conditionals as structure.

Teach it: Play the story once for fun, once with a map: have students draw the branches, then compare with the Decision Tree page.

Watch for: Every path is a valid ending β€” the answer key is the tree itself.

Classroom tips

A 45-minute session

5 min: play the related playground game. 10 min: Learn page together (read the concept art aloud). 15 min: Build page in pairs. 10 min: Challenge solo. 5 min: two students demo their output.

Predict, run, explain

Before every Run: β€œwhat will happen?” After: β€œwas it what you expected, and why?” This single habit carries more learning than any lesson content.

Bugs are the curriculum

When code fails, resist fixing it. Ask: what did you expect, what happened, what's the smallest change to test? The confused robot is a feature β€” it makes errors funny instead of scary.

Pair programming

Driver types, navigator reads instructions and spots typos. Swap on every Run. Works especially well in Code Studio levels 5–8 where punctuation errors spike.