Stage 10: Puzzle Room
Make sure you've finished Stage 9: Kinetic KillWall. This is the final stage!
a button-code puzzle room and finish area
how sequences and clues create game logic
a complete 10-stage obby with a celebration room

Preview the final button-code puzzle room and celebration finish area.
Build this stage belowThe big idea
For nine stages, every challenge has been reflex — jump, time, dodge, look. Today's final stage is a puzzle: the player has to think before they move. The wall blocking the exit doesn't react to being touched — it reacts to a sequence of button presses in a specific order.
The new design lesson is clues and consequences. A puzzle without a clue is just guessing; a puzzle with a clue is solving. We write the answer on a side wall — the player reads, then presses. That tiny act of looking-then-doing is what makes a puzzle feel earned instead of frustrating.
This stage also reuses every pattern from earlier in the course. A new checkpoint with a Team and SpawnLocation. A wall that disappears when the puzzle is solved (same idea as the moving wall in Stage 9, just triggered by code instead of time). By Stage 10 you've quietly become fluent in the obby toolkit — and the puzzle room is just one more arrangement of pieces you already know.
Build it
Step 1 — Build the puzzle room
A floor, two side walls, and a back wall the puzzle will eventually remove. Front is open so the player can walk in from the Stage 10 checkpoint.

Build this partPuzzleFloor
BlockOpen recipe
PuzzleFloor
Block- Size
- 12 × 1 × 12
- Color
- Dark stone grey
- Material
- Concrete
- Anchored
- ✓ Yes
- Place
- Right in front of the Stage 10 checkpoint, stretching forward 12 studs
Build this partPuzzleWall_Left
BlockOpen recipe
PuzzleWall_Left
Block- Size
- 1 × 8 × 12
- Color
- Brick yellow
- Material
- Brick
- Anchored
- ✓ Yes
- Place
- Along the left edge of PuzzleFloor
Build this partPuzzleWall_Right
BlockOpen recipe
PuzzleWall_Right
Block- Size
- 1 × 8 × 12
- Color
- Brick yellow
- Material
- Brick
- Anchored
- ✓ Yes
- Place
- Along the right edge of PuzzleFloor (mirror of the left wall)
Build this partPuzzleWall_Back
BlockOpen recipe
PuzzleWall_Back
Block- Size
- 12 × 8 × 1
- Color
- Really red
- Material
- Neon
- Anchored
- ✓ Yes
- Place
- At the FAR end of the room (opposite the open front)
Solid red so players know 'this is the goal wall.' The script finds it by name — leave it named exactly `PuzzleWall_Back`.
Step 2 — Build the three buttons
Three colored buttons on the floor: Green, Red, Blue. Each one is a flat cylinder.
Build this partButton_Green
CylinderOpen recipe
Button_Green
Cylinder- Size
- 1 × 2 × 2
- Color
- Lime green
- Material
- Neon
- Anchored
- ✓ Yes
- Place
- On PuzzleFloor, leftmost of three buttons
Cylinder with X = 1 looks like a flat disc — like a real arcade button.
Build this partButton_Red
CylinderOpen recipe
Button_Red
Cylinder- Size
- 1 × 2 × 2
- Color
- Really red
- Material
- Neon
- Anchored
- ✓ Yes
- Place
- On PuzzleFloor, middle of three buttons
Build this partButton_Blue
CylinderOpen recipe
Button_Blue
Cylinder- Size
- 1 × 2 × 2
- Color
- Bright blue
- Material
- Neon
- Anchored
- ✓ Yes
- Place
- On PuzzleFloor, rightmost of three buttons
Step 3 — Make each button clickable
A button can't be clicked unless it has a ClickDetector inside it. No script for this step — we just add a built-in object.
- Right-click Button_Green in Explorer → Insert Object → ClickDetector.
- Do the same for Button_Red and Button_Blue.
Each ClickDetector lets a player click the button from up to 32 studs away. That means the player has to walk into the room to press a button — exactly what we want.
Step 4 — Add the script that runs the puzzle
The script lives in PuzzleWall_Back — the wall it eventually destroys. Right-click PuzzleWall_Back → Insert Object → Script. Delete the placeholder.
PuzzleWall_Back
The Script goes inside PuzzleWall_Back. It looks up each button by name, so the buttons MUST be named exactly `Button_Green`, `Button_Red`, and `Button_Blue` in Explorer.
local wall = script.Parent
local greenButton = workspace:WaitForChild("Button_Green")
local redButton = workspace:WaitForChild("Button_Red")
local blueButton = workspace:WaitForChild("Button_Blue")
-- The correct sequence: press these in this order to win
local correctOrder = {"Green", "Red", "Blue"}
local currentIndex = 1
local function handleButton(buttonName)
local expected = correctOrder[currentIndex]
print(buttonName, "pressed. Expected:", expected)
if buttonName == expected then
currentIndex = currentIndex + 1
if currentIndex > #correctOrder then
print("PUZZLE SOLVED!")
wall:Destroy()
end
else
print("Wrong! Resetting sequence.")
currentIndex = 1
end
end
greenButton.ClickDetector.MouseClick:Connect(function()
handleButton("Green")
end)
redButton.ClickDetector.MouseClick:Connect(function()
handleButton("Red")
end)
blueButton.ClickDetector.MouseClick:Connect(function()
handleButton("Blue")
end)
Press ▶ Play. Walk into the room. Click Green, Red, Blue in that order — the back wall disappears. Click in the wrong order and the puzzle resets.
Tune it
The puzzle's two big knobs are right at the top of the script:
correctOrder = {"Green", "Red", "Blue"}— change this list to set the answer.{"Red", "Blue", "Green"}makes it Red-then-Blue-then-Green. You can repeat colors:{"Green", "Red", "Green"}is a different puzzle entirely.- The three
WaitForChild(...)lines — these find the buttons by name. If you renamed any button, update the matching string here.
Step 5 — Write the clue on a side wall
Without a clue, the puzzle is a guessing game. With a clue, it's a solvable problem. The clue is the difference between fair and unfair.
On one of the side walls, place three small flat parts in the answer order — green first, red second, blue third. Use the same colors as the buttons. Players who notice the wall pattern get the answer.
- Green → 2. Red → 3. Blue
Press ▶ Play and try your puzzle.
Step 6 — Add the finish-line checkpoint
This is the last checkpoint — it marks the end of the Obby. Place it just past the back wall so it only appears after the puzzle is solved.
2.1 Add a SpawnLocation
In Explorer, right-click Workspace → Insert Object → SpawnLocation.
2.2 Set its properties
- BrickColor → a celebration color! Gold, rainbow, whatever feels like a finish line.
- AllowTeamChangeOnTouch → checked.
- Neutral → unchecked.
- TeamColor → matches the BrickColor.
2.3 Tag it with its stage number
In the Attributes section of Properties, add a StageNumber attribute (number type) and set its value to 11. We use 11 for the finish pad so future scripts know "this is the one past Stage 10 — the win pad."
2.4 Add a Team
- In Teams, insert a new Team named Finished.
- Uncheck AutoAssignable.
- Set TeamColor to match.
Place the SpawnLocation behind where the back wall stood, so it appears only after the puzzle is solved.
Step 7 — Throw a party
You're done with the obstacles. Now build a celebration room behind the finish-line checkpoint.
7.1 Lay down the celebration floor
Make a wide platform behind the finish pad. This is where players land, look around, and feel like winners.
- In Workspace, click + → Part.
- Set Size to
[20, 1, 20]— big enough to run around in. - Set BrickColor to something bright and celebratory.
- Set Material to Neon or Marble — anything that feels different from the obby.
- Set Anchored to checked.
- Rename it ExtensionPad.
- Drag it behind your finish-line SpawnLocation so a player who steps off the pad lands on it.
The ExtensionPad name matters because every later Roblox course in this series builds the same pad in the same spot. It's the room where new endings live — a boss fight, a victory cam, an upgrade billboard, whatever your next course adds. Using the same name everywhere means the shape of an obby world stays familiar no matter which course you take next.
7.2 Decorate
Now the fun part. Make this room feel like a party:
- Decorate it however you want — banners, fireworks (search the Toolbox), confetti, themed parts.
- Add rewards for players who made it — gear, badges, anything fun.
- Take screenshots and share your finished Obby with friends!
Understand it
A puzzle is just a hazard that asks for thinking instead of reflex. The button sequence is dangerous in a different way than a fireball — get it wrong and you lose progress (the press counter resets) instead of falling off a platform. Same idea (you took a wrong action, the game punished you), different shape.
The clue on the side wall is the part that makes the puzzle solvable. Take it away and the puzzle becomes pure guessing — that's the hard stretch. Adding it back is what turns "guessing" into "reading and solving." Every good puzzle game does this: it gives you information and a problem and asks you to put them together.
The script's state variable (currentIndex) is the puzzle's memory. It remembers how far through the sequence the player has gotten. A correct press advances it; a wrong press resets it. The whole puzzle works because that one number remembers what happened on previous clicks. This pattern — one variable that tracks "where am I in this process?" — runs the entire saving system in every real game.
The wall:Destroy() line is the simplest possible "win" mechanic in Roblox. It removes the back wall from the game. The player can now walk through where it used to be. There's no respawn — once Destroy is called, the part is gone. Real games use this exact line for doors, breakable crates, and "win" walls.
The celebration room is the most important room in the whole obby. After ten stages of being challenged, the player needs to feel the win. Bright colors, fireworks, an open space to run around in — that's what tells the player "you did it." Without the celebration, the finish line is just one more pad.
Try this
Try this
Three short experiments. Predict before you run, then test your guess.
Hide the side-wall clue (move it out of view, or make it Transparency = 1). Without changing the puzzle, predict how long it takes a brand-new player to solve it. Try it on a friend. Were you close?
Open the Script and change correctOrder to {"Red", "Red", "Red"} (press the same button three times). Compare to the original {"Green", "Red", "Blue"}. Which one feels like a real puzzle? Why does repetition feel cheaper than sequence?
Look back across all 10 stages. Pick the stage where the most clicked — where you suddenly understood the toolkit. Was it the first checkpoint (Stage 1)? The first KillBrick script (Stage 4)? The narrow path with the spinner (Stage 8)? The reason it clicked is worth knowing about yourself.
Test your finished Obby
Before you call the course complete:
- Press ▶ Play and start from the beginning of the Obby.
- Check that every checkpoint sends you to the correct stage.
- Solve the puzzle without using the editor.
- Walk into the celebration room and make sure the finish feels clear.
- Ask a Code Coach for one final playthrough check before you show the Obby to someone else.
- Design check. Have a friend or coach play the whole obby start to finish. Does the difficulty climb smoothly, or are there sudden spikes?
If it breaks
- Clicking does nothing. A ClickDetector is missing from the button. Expand the button in Explorer — there should be a ClickDetector indented inside it. If not, right-click the button → Insert Object → ClickDetector.
- Output shows
attempt to index nil with 'MouseClick'. Same problem — one of the buttons is missing its ClickDetector. - Output shows
WaitForChild "Button_Green" never finished(or similar). The script can't find a button with that exact name. Check Explorer — the buttons must be named exactlyButton_Green,Button_Red, andButton_Blue(case-sensitive, underscore, no spaces). - The wall disappears the moment I press any button. Your
correctOrderis probably set to a one-item list like{"Green"}. Open the script and confirm it has all three colors. - Players can solve the puzzle without reading the clue. That's a sign your
correctOrderis too short (three buttons gives only six possible orders, and players try them all in 30 seconds). Use the medium stretch to extend it to five or six. - My finish-line SpawnLocation isn't visible when I solve the puzzle. It's behind the wall — drag it slightly past the wall's old position so it appears the moment the wall is destroyed.
- The celebration room is boring. That's a content problem, not a code problem. Take 10 minutes to make it feel like a finish line — banners, confetti from the Toolbox, a sign that says "YOU DID IT."
Save your work and see what's next
You just finished a complete game world. Save it.
- In Roblox Studio, click File → Save to File As...
- Name it
MyObby.rbxland put it somewhere you'll find it again (a folder on your desktop is fine).
You'll build this same obby again — but every time with a new twist. In Roblox Makers, you'll rebuild the whole world from scratch in Lua, writing every script yourself. In Roblox Tycoon, you'll build it stage-by-stage with coins dropping every time a player clears a checkpoint. In Roblox Combat, you'll add a sword and a boss in the ExtensionPad. In Roblox & YouTuber Studio, you'll wire up particles, sound effects, and a victory cam to make it look like a streamer's highlight reel.
Same shape — Start Platform, ten stages, ExtensionPad — different theme layer each time. Holding onto your finished MyObby.rbxl means you can always look back at the version you made first.