All Block Categories
Scratch has 9 block categories, each colour-coded. Click on any category in the Block Palette to see its blocks. Here is what each category does and the most important blocks inside it.
🏃
Motion
Move and position sprites
Motion blocks control where a sprite is and how it moves. Everything about position and direction lives here.
move 10 steps
turn ↻ 15°
go to x:0 y:0
glide 1 secs to x:0 y:0
point in direction 90
point towards mouse
change x by 10
change y by 10
if on edge, bounce
x position
y position
👁️
Looks
Change appearance and speech
Looks blocks change what a sprite looks like — its costume, size, colour effects, and whether it shows on screen.
say Hello! for 2 secs
think Hmm... for 2 secs
switch costume to
next costume
switch backdrop to
set size to 100%
change size by 10
set color effect to 0
clear graphic effects
show
hide
go to front layer
🔊
Sound
Play music and sound effects
Sound blocks play audio clips, control volume, and add pitch effects. Each sprite has its own library of sounds.
play sound Pop until done
start sound Pop
stop all sounds
change volume by -10
set volume to 100%
change pitch effect by 10
clear sound effects
⚡
Events
Trigger code when something happens
Events blocks are hats — they always sit at the top of a script and start running code when their trigger fires.
when 🚩 clicked
when [space] key pressed
when this sprite clicked
when backdrop switches to
when [loudness] > 10
broadcast [message]
broadcast and wait
when I receive [message]
🔄
Control
Loops, decisions, and timing
Control blocks are the backbone of all programs — loops, if/else decisions, timing, cloning, and stopping scripts.
wait 1 seconds
repeat 10
forever
if <> then
if <> then / else
wait until <>
repeat until <>
stop [all]
stop [this script]
when I start as a clone
create clone of [myself]
delete this clone
👀
Sensing
Detect the world around a sprite
Sensing blocks detect collisions, colours, mouse position, keyboard input, microphone volume, and the timer.
touching [Sprite]?
touching color [■]?
color [■] touching [■]?
distance to [mouse]
ask [What's your name?] and wait
answer
key [space] pressed?
mouse down?
mouse x
mouse y
loudness
timer
reset timer
current [year]
🔢
Operators
Maths, text, and logic
Operators are round reporter blocks that calculate values. Use them inside other blocks wherever a value is needed.
( ) + ( )
( ) - ( )
( ) * ( )
( ) / ( )
pick random 1 to 10
( ) < ( )
( ) = ( )
( ) > ( )
<> and <>
<> or <>
not <>
join [hello] [world]
letter 1 of [apple]
length of [hello]
[hello] contains [h]?
( ) mod ( )
round ( )
sqrt of ( )
📦
Variables
Store and track changing values
Variables are named containers. Create one with "Make a Variable". Use them to store score, lives, speed, level — anything that can change.
set [score] to 0
change [score] by 1
show variable [score]
hide variable [score]
[score]
Tip — scope
Choose "All sprites" for shared data (score, lives). Choose "This sprite only" for data private to one sprite (its own speed).
📋
Lists
Store many values in one place
A list holds multiple items — like a shopping list. Create one with "Make a List". Great for high scores, question banks, or enemy names.
add [thing] to [list]
delete 1 of [list]
delete all of [list]
insert [x] at 1 of [list]
replace item 1 of [list] with [x]
item 1 of [list]
length of [list]
[list] contains [x]?
show list [list]
hide list [list]
⚙️
My Blocks
Create reusable custom blocks
My Blocks lets you create your own custom blocks — mini programs inside your program. Useful for code you repeat in many places.
define [my block]
my block
⚠️ Note
Tick "Run without screen refresh" when you want your custom block to run instantly without animating each step.
Tips & Tricks
Habits and techniques that make building in Scratch faster, less buggy, and more fun.
🚩
Always initialise under the green flag
Set every variable to its starting value when the green flag is clicked. If you skip this, the second game starts with leftover values from the first run.
🎯
Select the right sprite first
Any block you drag goes to whichever sprite is highlighted in the Sprite Pane. Always check the blue border before adding code.
🔁
Right-click to duplicate blocks
Right-click any block (or a whole stack) and choose Duplicate to copy it instantly. Much faster than rebuilding the same pattern.
🎒
Use the Backpack
Drag scripts, costumes, or sprites into the Backpack at the bottom of the screen to carry them into another project. Great for reusing your keyboard controller.
🧪
Test after every few blocks
Click the green flag often. It is much easier to find a bug when you added two blocks than when you added twenty.
💬
Use "say" blocks to debug
Temporarily add a say (score) block to check if a variable has the value you expect. Remove it when the bug is fixed.
📢
Broadcasts connect sprites
Instead of cramming all your code into one sprite, use broadcasts to send messages between sprites. It keeps your scripts short and readable.
🏷️
Name sprites and variables clearly
Rename "Sprite1" to "Player" and "Sprite2" to "Enemy". Name variables score and lives, not s and x. Future-you will thank you.
🖱️
Double-click a block to test it
You can double-click any block in the Scripts Area to run it immediately — you don't always need the green flag. Great for checking individual actions.
🗂️
Right-click for "Add comment"
Right-click any block and choose Add comment to leave a yellow note explaining what a section does. Very helpful when revisiting old projects.
📐
Remember the coordinate system
The stage centre is (0, 0). Right is positive X, left is negative X. Up is positive Y, down is negative Y. The stage is 480 wide and 360 tall.
🌈
Let colours guide you
Blue = Motion. Purple = Looks. Orange = Events/Control. Light blue = Sensing. Green = Operators. Orange-red = Variables/Lists. Memorise the rainbow and finding blocks becomes instant.
♾️
Choose the right loop
Use forever for continuous monitoring. Use repeat N for a fixed number of times. Use repeat until when you have a clear stopping condition.
👥
Clones for multiple objects
Instead of adding 20 enemy sprites manually, hide the original and create clones with create clone of myself. Each clone runs its own when I start as a clone script.
💾
Save with Ctrl + S
Scratch auto-saves to the cloud, but it's good practice to save manually after making big changes — especially before testing risky code.
🎨
Paint your own sprites
Click the paintbrush icon in the Sprite Pane to open the built-in vector editor. Drawing your own sprites makes your project completely unique.
Keyboard Shortcuts
Learn these shortcuts and you will work twice as fast in Scratch.
Copy selected block
Ctrl+C
Paste copied block
Ctrl+V
Delete selected block / sprite
Delete
Start project (green flag)
Enter
Toggle fullscreen
Ctrl+Shift+F
Zoom in (Scripts Area)
Ctrl+=
Zoom out (Scripts Area)
Ctrl+-
Reset zoom to 100%
Ctrl+0
⚠️ Mac users
On a Mac, replace Ctrl with the ⌘ Command key for all shortcuts above.
Common Mistakes & How to Fix Them
Every Scratch programmer hits these at some point. Knowing them in advance saves a lot of frustration.
🚩
Forgetting to click the green flag
Code in Scratch does nothing until a trigger fires it. If your project seems broken, the most likely reason is you haven't clicked the green flag yet.
Fix: Always click the green flag after adding new blocks. Some blocks also need a specific trigger — check that you have a when 🚩 clicked hat at the top of each important script.
📦
Variables not reset — leftover values from last run
If your score shows 50 at the start of a new game, it's because you never set it back to 0. Variables keep their value until you change them.
Fix: Put set [score] to 0 and set [lives] to 3 under when green flag clicked, before any game logic starts.
🎯
Code added to the wrong sprite
You meant to control the player but you accidentally added blocks to the enemy sprite. Everything looks fine in the Scripts Area but nothing works as expected.
Fix: Click on the sprite you want in the Sprite Pane and look for the blue highlight border. Check the sprite's name in the info box. When in doubt, click each sprite and check its scripts tab.
♾️
Infinite loop freezing the project
A forever loop without a wait block or an exit condition can lock up Scratch. The project appears to hang or the frame rate drops to zero.
Fix: Add a wait 0 seconds inside any forever loop that does lots of work. Or use repeat until with a proper stopping condition instead of forever.
🔵
Mixing up "change x by" and "set x to"
change x by 10 moves the sprite 10 pixels from wherever it currently is. set x to 10 teleports it to x=10, no matter where it started. Mixing these causes sprites to fly off-screen.
Fix: Use change for smooth movement in a loop. Use set to snap a sprite to a specific position (e.g., resetting to the start).
🎨
Colour detection not working
The touching color block is very precise — it samples the exact pixel colour. If you picked the colour when it was slightly in shadow or at a different zoom level, it may not match.
Fix: Click the colour swatch in the block, then use the dropper tool to sample the colour directly from the stage at full size. Make sure the colour on your backdrop or sprite is a solid, flat fill.
☁️
Cloud variables storing text
Cloud variables (marked with ☁) can only store numbers. If you try to store a name or word, Scratch will silently store 0 instead.
Fix: Use cloud variables only for numeric data like high scores. Never store names, ages, or any text. Also note: cloud variables require you to be signed in to Scratch.
👥
Clone not disappearing — memory leak
If you create clone of myself inside a forever loop without deleting old clones, you will quickly have hundreds of clones on screen and the project will slow to a crawl.
Fix: Make sure every clone path ends with delete this clone. Add a wait inside the spawner loop to control how fast clones are created (e.g., wait 1 seconds).
📡
Broadcast sent but nobody receives it
You broadcast a message but nothing happens. Either no sprite has a when I receive block with the matching message name, or the message names don't match exactly (including capitalisation).
Fix: Check every sprite's scripts for when I receive blocks. Make sure the message name is spelled identically in both the broadcast and receive blocks — Scratch is case-sensitive here.