本工具使用的开源库

本工具代码中捆绑了 1 个开源库。

Scratch 速查 — 简明参考

Scratch 3 积木式编程速查手册:变量、列表、克隆体、广播与九大积木分类,覆盖初学者游戏 / 动画 / 故事构建。

S3

Scratch Scratch 3.0 (online editor)

Scratch 3 (积木式) · 事件驱动 · 可视化 · 单线程协作 · 动态(弱类型变量)

学习路径

先拼第一个程序:绿旗开始 + 说积木 → 掌握变量与列表、流程控制(如果 / 重复)→ 用侦测积木读键盘鼠标、用广播让角色对话 → 再用自制积木整理代码、用克隆体做多角色 → 最后看 FAQ 节避坑,学会用计时器做计时、云变量存纪录。

1.Hello World 与起点

从绿旗开始的第一个程序:让角色说话、切换造型与背景,认识九大积木分类。

最小程序

点绿旗让角色说话,是每个 Scratch 项目的起点。最小程序只需要事件与外观两类积木。

1
2
when green flag clicked
say (Hello, world!) for (2) seconds

绿旗开始

绿旗积木是整个项目的启动开关。点击舞台上方的绿旗,所有从它开始的脚本同时运行;点红色停止按钮可全部停下。

1
2
3
4
5
when green flag clicked
forever
move (10) steps
if on edge, bounce
end

角色说话

说与思考积木让角色在气泡中显示文字,是最直观的输出方式。指定秒数会停留后消失,不指定则一直显示。

1
2
3
4
when green flag clicked
say (你好,我是小猫!) for (2) seconds
think (接下来要做什么呢…) for (2) seconds
say (点击我开始!)

切换造型

每个角色可以有多套造型,切换造型就能做出走路、眨眼等动画。下一个造型积木按顺序轮换。

1
2
3
4
5
when green flag clicked
forever
next costume
wait (0.2) seconds
end

切换背景

舞台背景相当于场景,可随情节切换。搭配「当背景切换成」积木让不同背景执行不同脚本。

1
2
3
4
when green flag clicked
switch backdrop to (森林)
wait (3) seconds
switch backdrop to (城堡)

九大积木分类

积木按功能分成九类,颜色各不相同:运动蓝、外观紫、声音粉、事件黄、控制橙、侦测青、运算绿、变量橙、自制积木。

1
2
3
4
5
// 事件(黄) 控制(橙) 运动(蓝) 外观(紫) 声音(粉)
// 侦测(青) 运算(绿) 变量(橙) 自制积木(紫)
// 把积木从左边面板拖到中间脚本区拼起来
when green flag clicked
say (欢迎来到 Scratch!)

脚本从上到下

同一段脚本从上往下逐块执行,前面的积木完成后才轮到后面的,顺序决定动作先后。

1
2
3
4
5
when green flag clicked
move (100) steps
turn right (90) degrees
move (100) steps
// 先直行,再右转,再直行

保存与分享

登录后项目会自动保存到云端。「文件」菜单可下载到电脑,点右上角「分享」可发布到网站供大家在线玩。

1
2
3
4
// 文件菜单里可以「保存到你的电脑」或「从电脑上传」
// 登录后项目会自动保存到云端
// 点右上角「分享」即可发布到 Scratch 网站
// 别人运行你的作品就是在线运行,无需下载

2.变量与常量

建立变量、设定与改变数值、显示隐藏,以及云变量与局部变量。

建立变量

在「变量」分类点「建立一个变量」,输入名字(如 分数)。变量像盒子,可以存数字、文字或布尔值。

1
2
3
4
// 变量分类 > 建立一个变量 > 输入名称:分数
set [分数 v] to (0)
set [姓名 v] to (小猫)
set [胜利 v] to (false)

设定与改变

设定把变量设成某个值;改变在此基础上加或减。积分、生命值都靠改变积木更新。

1
2
3
4
set [分数 v] to (0)
change [分数 v] by (10) // 分数变成 10
change [分数 v] by (-5) // 分数变成 5
set [分数 v] to (100) // 直接设定为 100

显示与隐藏

变量默认显示在舞台左上角,可拖动位置。不想要的变量用隐藏积木藏起来,保持画面干净。

1
2
3
4
set [分数 v] to (0)
show variable [分数 v]
wait (2) seconds
hide variable [分数 v]

列表变量

列表是能装很多条数据的变量,像一串盒子。可添加、删除、读取指定位置的元素。

1
2
3
4
5
6
add (苹果) to [水果 v]
add (香蕉) to [水果 v]
add (西瓜) to [水果 v]
// 水果 = [苹果, 香蕉, 西瓜]
item (2) of [水果 v] // 香蕉
length of [水果 v] // 3

常量与固定值

积木里直接填写的数字或文字就是常量,运行中不会变化。需要可变的数据才用变量。

1
2
3
4
move (10) steps // 10 是常量
wait (1) seconds // 1 是常量
say (固定提示文字) // 文字常量
set [速度 v] to (10) // 把常量存进变量

云变量

云变量把数据存到服务器,所有打开该项目的用户共享同一份。适合做排行榜,但只支持数字。

1
2
3
4
5
// 建立变量时勾选「云变量」(需登录,仅数字)
set [最高分 v] to (分数)
if <(分数) > (最高分)> then
set [最高分 v] to (分数)
end

局部变量

默认变量全项目共享;建变量时勾选「仅适用于当前角色」就变成该角色独有。克隆体还会拥有各自独立的副本。

1
2
3
// 建立变量时选择「仅适用于当前角色」
when green flag clicked
set [私有值 v] to (0)

滑块变量

右键舞台上的变量显示器可设为滑块,用鼠标拖动实时改变数值,适合做音量、速度等可调参数。

1
2
3
4
// 右键变量显示器 > 滑块
// 设定范围(最小值/最大值)后拖动
set [音量 v] to (slider value)
set volume to (音量) %

3.数据形式

Scratch 的数据分数字、字符串与布尔三种形式,变量自动推断类型。

数字

数字直接填在积木的白色圆孔里,可正可负可有小数。四则运算积木返回数字。

1
2
3
4
5
set [分数 v] to (100)
set [步长 v] to (0.5)
(10) + (5) // 15
(7) * (8) // 56
((分数) / (2)) // 50

字符串

文字(字符串)放在白色圆孔或椭圆孔里。说、思考、列表内容都可以是字符串。

1
2
3
set [名字 v] to (小猫)
say (你好,我的名字是小猫)
join (苹果) (香蕉) // 苹果香蕉

布尔值

比较和逻辑积木返回真(true)或假(false),只能填进六边形孔里,用来做判断条件。

1
2
3
4
<(分数) > (99)> // true 或 false
<(分数) = (100)>
<<(a) > (0)> and <(b) > (0)>> // 两者都真才为真
<not <(分数) < (0)>>

列表元素

列表元素可以是数字也可以是文字,读取时按序号取第 n 条。元素类型不固定,可混存。

1
2
3
4
add (100) to [数据 v]
add (小猫) to [数据 v]
item (1) of [数据 v] // 100
item (2) of [数据 v] // 小猫

类型自动推断

Scratch 不强制声明类型:变量存什么就是什么,可随时改存不同类型。运算时数字与文字会自动转换。

1
2
3
set [x v] to (10) // 数字
set [x v] to (文字) // 换成字符串
set [x v] to (<(1) > (0)>) // 布尔

输入格式

提问积木让用户输入,回答积木拿到的是字符串。要当数字用可借助运算积木转换。

1
2
3
4
5
ask (你的年龄是几岁?) and wait
set [年龄 v] to (answer)
if <(年龄) > (6)> then
say (可以玩更复杂的游戏)
end

输出格式

说、思考积木把数据变成可见文字。运算结果、列表元素都可直接放进输出积木。

1
2
3
say (join (得分:) (分数))
say (join (item (1) of [排名 v]) ( 获得了第一名))
set volume to (音量) %

数值与文字转换

round 四舍五入取整、mod 取余;数字参与文字拼接时自动变成文字。

1
2
3
4
5
round (3.7) // 4
round (3.2) // 3
((10) mod (3)) // 1
// 数字直接拼进文字会自动转换
say (join (分数:) (分数))

4.变量与数据存储

用变量与列表存取数据,通过克隆体、广播与云变量在角色间传递数据。

变量存储

变量是数据的「家」:先设值再使用。脚本之间通过读写同一个变量共享数据,但要注意读取时机。

1
2
3
4
when green flag clicked
set [金币 v] to (0)
when this sprite clicked
change [金币 v] by (1)

列表存储多条

列表一次存多条数据,像数组。按序号读写,适合记录一局里所有得分、敌人坐标等。

1
2
3
4
5
delete (all) of [得分 v]
repeat (5)
add (pick random (0) to (100)) to [得分 v]
end
item (1) of [得分 v]

克隆体携带数据

克隆体会复制角色的全部脚本与变量。每个克隆体的「仅适用于当前角色」变量独立,可用序号区分彼此。

1
2
3
4
5
when green flag clicked
create clone of (我自己)
create clone of (我自己)
when I start as a clone
go to x: (pick random (-200) to (200)) y: (pick random (-150) to (150))

私有变量

勾选「仅适用于当前角色」的变量在每个克隆体里各有一份,改一个不影响其他克隆体,是区分克隆体的关键。

1
2
3
4
5
6
7
8
when green flag clicked
set [编号 v] to (0)
repeat (3)
change [编号 v] by (1)
create clone of (我自己)
end
when I start as a clone
say (join (我是克隆体) (编号))

云变量

云变量把数字同步到服务器,所有玩家共享同一份数据。适合排行榜、在线对战,但值只能是数字。

1
2
3
// 建立变量时勾选「云变量」
when green flag clicked
set [在线人数 v] to (0)

广播传递数据

广播本身只传「消息名」,要传数据可以把值写进全局变量再广播,接收方读取变量。

1
2
3
4
5
when green flag clicked
set [得分 v] to (100)
broadcast (游戏结束)
when I receive (游戏结束)
say (join (最终得分:) (得分))

全局与局部变量

默认变量全局可见:任何角色的脚本都能读写。选「仅适用于当前角色」则该变量只属于此角色或某个克隆体。

1
2
3
4
// 全局变量:所有角色共享
set [总分 v] to (100)
// 局部变量:仅当前角色可见
set [自身速度 v] to (5)

数据持久化

变量只在项目运行时存在,刷新页面或关闭项目就清空。要长期保存可用云变量,或把数据整理导出。

1
2
3
4
5
6
// 云变量:登录后数据存在服务器,长期保留
// 导出数据:把列表内容整理后复制到记事本
ask (要载入之前的记录吗?) and wait
if <(answer) = (是)> then
say (读取云变量最高分)
end

5.流程控制

用条件判断与循环控制脚本走向:如果、重复、重复直到、等待与停止。

如果判断

「如果…那么」满足条件才执行里面的积木。条件是六边形孔,放比较或逻辑积木。

1
2
3
if <(分数) > (99)> then
say (满分!)
end

如果否则

「如果…那么…否则」二选一:条件成立走前段,否则走后段。适合判断输赢、开关状态。

1
2
3
4
5
if <key (空格 v) pressed?> then
say (跳)
else
say (蹲下)
end

重复执行 n 次

「重复执行 N 次」把里面的积木按次数循环,常用于逐格移动、重复画图、播放多次音效。

1
2
3
4
repeat (10)
move (5) steps
end
// 移动 10 次 × 5 步 = 共 50 步

无限循环

「重复执行」永不停止,配合停止积木或条件结束。角色巡逻、背景滚动这类持续行为放里面。

1
2
3
4
forever
move (10) steps
if on edge, bounce
end

重复直到

「重复执行直到…」先执行后判断,满足条件就停下。适合等用户按键、等分数达标。

1
2
3
4
repeat until <key (空格 v) pressed?>
wait (0.1) seconds
end
say (终于按了空格!)

等待

「等待 1 秒」暂停当前脚本;「等待直到」暂停到条件成立。注意:等待会卡住当前脚本,其他脚本照常运行。

1
2
3
4
5
when green flag clicked
say (预备)
wait (1) seconds
say (开始!)
wait until <(计时器) > (10)>

停止脚本

「停止全部」结束所有脚本;「停止这个脚本」只停当前这段;「停止该角色的其他脚本」保留这段。

1
2
3
4
5
6
when green flag clicked
forever
if <(生命值) < (1)> then
stop (all)
end
end

组合逻辑

与、或、非把多个条件组合成一个。与要求都真,或要求至少一真,非取反。

1
2
3
4
5
6
if <<key (w v) pressed?> or <key (上 v) pressed?>> then
change y by (10)
end
if <<(分数) > (0)> and <(分数) < (100)>> then
say (分数在范围内)
end

6.自制积木(函数)

自制积木把重复代码包成可复用块,可带参数、可返回数值,相当于函数。

制作积木

在「自制积木」分类点「制作新的积木」取名并添加参数,脚本区出现 define 积木,把逻辑写进去。

1
2
3
4
define 跳跃
change y by (50)
wait (0.2) seconds
change y by (-50)

带参数

制作时添加数字或文本输入,调用时填入不同值。参数是局部变量,只在块内有效。

1
2
3
4
5
6
7
define 画正方形 (边长)
repeat (4)
move (边长) steps
turn right (90) degrees
end
画正方形 (50)
画正方形 (100)

返回数值

自制积木默认无返回值。要「返回」结果,可用一个变量装结果,调用后读取。

1
2
3
4
define 计算平方 (n)
set [平方 v] to ((n) * (n))
计算平方 (7)
say (join (7 的平方是) (平方))

调用自制积木

定义好后在需要的地方直接放上调用块即可执行。调用一次就运行一遍块内脚本。

1
2
3
4
5
define 打招呼 (名字)
say (join (你好,) (名字))
when green flag clicked
打招呼 (小猫)
打招呼 (小狗)

递归

自制积木可以调用自己(递归)。Scratch 有栈深度限制,别写太深的递归,建议改用循环。

1
2
3
4
5
6
define 数数 (n)
if <(n) > (0)> then
say (n)
数数 ((n) - (1))
end
数数 (3)

不刷新屏幕

编辑自制积木时勾选「运行时不刷新屏幕」,块会一次性瞬间执行完,适合大规模列表运算与快速计算。

1
2
3
// 编辑 define 块 > 勾选「运行时不刷新屏幕」
define 批量处理
// 循环里的大量计算不再一帧一帧慢慢画

参数局部性

自制积木的参数在块内有效,但块内新建的变量默认全局可见,注意别与外部同名变量互相覆盖。

1
2
3
define 加分 (amount)
change [分数 v] by (amount) // 修改全局变量
加分 (10)

复用与拆分

把一段逻辑抽成自制积木后,可在多个事件里反复调用,代码更整洁也更好调试。

1
2
3
4
5
6
7
define 重新开始
set [分数 v] to (0)
switch backdrop to (开始界面)
when green flag clicked
重新开始
when I receive (失败)
重新开始

7.字符串

连接、取字符、长度、包含等字符串运算,支持简单文本处理。

连接文本

「连接」把两段文字首尾相接成一个新字符串,常用于拼提示语、拼坐标。

1
2
3
join (你好,) (小猫) // 你好,小猫
join (X=) (x position) // 把数字拼进文字
say (join (得分:) (分数))

提取字符

「第 N 个字符」取出字符串中指定位置的字符。中文按字算,空格也算一个字符。

1
2
3
letter (1) of (Scratch) // S
letter (2) of (Scratch) // c
length of (你好) // 2

字符串长度

「字符串长度」返回字符个数,英文空格中文都各算一个。判断空串、限制输入长度会用到。

1
2
3
4
5
length of (Scratch) // 7
length of (你好世界) // 4
if <(length of (answer)) > (10)> then
say (太长了!)
end

判断包含

「包含」判断一个字符串里是否含另一段,返回布尔值。可做关键词检测。

1
2
3
4
<(Scratch 真有趣) contains (有趣)?> // true
if <(answer) contains (猫)> then
say (你喜欢猫)
end

查找位置

结合「第 N 个字符」与「字符串长度」可手工实现查找:逐位比较,找到后返回位置。

1
2
3
4
5
6
7
set [位置 v] to (0)
repeat (length of (文本))
change [位置 v] by (1)
if <(letter (位置) of (文本)) = (目标)> then
say (join (找到位置:) (位置))
end
end

拆成列表

把字符串逐字符存进列表,便于逐字处理。配合重复执行遍历。

1
2
3
4
5
6
delete (all) of [字符表 v]
set [i v] to (1)
repeat (length of (文本))
add (letter (i) of (文本)) to [字符表 v]
change [i v] by (1)
end

空串判断

「长度 = 0」即空串。输入框留空时 answer 是空串,先判断再使用避免出错。

1
2
3
4
5
6
ask (输入你的名字) and wait
if <(length of (answer)) = (0)> then
say (名字不能为空)
else
say (join (你好,) (answer))
end

拼接长文本

Scratch 的文字积木是单行输入,长文本可用多个连接积木逐段拼起来。逗号、空格都会原样保留。

1
say (join (第一行,) (join (第二行,) (第三行)))

8.列表与数据结构

列表是 Scratch 的核心数据结构,支持增删改查、遍历与二维模拟。

建立列表

在「变量」分类点「建立一个列表」,像变量一样出现在脚本面板。舞台上的列表可显示或隐藏。

1
2
3
// 变量分类 > 建立一个列表 > 输入名称:背包
add (苹果) to [背包 v]
show list [背包 v]

添加与删除

添加把新元素放队尾;删除指定序号或全部清空。删除后序号自动前移。

1
2
3
4
5
add (苹果) to [背包 v]
add (盾牌) to [背包 v]
delete (1) of [背包 v]
// 背包 = [盾牌]
delete (all) of [背包 v]

读取元素

「第 N 个元素」按序号取值,序号从 1 开始。越界序号不会报错,但返回空。

1
2
3
4
5
add (金) to [宝箱 v]
add (银) to [宝箱 v]
item (1) of [宝箱 v] // 金
item (2) of [宝箱 v] // 银
item (5) of [宝箱 v] // 空

替换元素

「替换第 N 个元素为」改掉指定位置的值,长度不变。适合更新某一格的物品。

1
2
3
add (旧药水) to [背包 v]
replace item (1) of [背包 v] with (新药水)
item (1) of [背包 v] // 新药水

插入元素

「在第 N 个位置插入」把新元素插到指定位置,后面的元素自动顺延。

1
2
3
4
add (苹果) to [背包 v]
add (梨) to [背包 v]
insert (西瓜) at (2) of [背包 v]
// 背包 = [苹果, 西瓜, 梨]

查找元素

「列表包含」判断某元素是否存在,返回布尔值。先查再用,避免读空值。

1
2
3
4
5
if <[背包 v] contains (钥匙)> then
say (你有一把钥匙)
else
say (没有钥匙,去找找吧)
end

遍历列表

用「重复执行直到」加序号变量逐条处理列表,这是模拟循环遍历的通用写法。

1
2
3
4
5
set [i v] to (1)
repeat until <(i) > (length of [背包 v])>
say (item (i) of [背包 v])
change [i v] by (1)
end

二维数据模拟

列表是一维的,可用「编号 = 行 × 列数 + 列」模拟二维表格,做地图、棋盘。

1
2
3
4
// 4 行 3 列网格,格子编号 1-12
set [编号 v] to (((行) * (3)) + (列))
add (格子内容) to [地图 v]
item (编号) of [地图 v]

9.项目与资源管理

管理角色数量、列表大小与克隆体上限,优化项目性能避免卡顿。

克隆体上限

Scratch 每个项目最多同时存在 300 个克隆体。超过上限会自动删除最早的克隆体。

1
2
3
4
5
6
// 克隆体上限 300 个,避免无限克隆
when green flag clicked
set [计数 v] to (0)
repeat (10)
create clone of (我自己)
end

列表大小控制

列表无限增长会拖慢项目。用完的数据及时删除,或限制最大条数。

1
2
3
4
add (新成绩) to [成绩 v]
if <(length of [成绩 v]) > (100)> then
delete (1) of [成绩 v]
end

角色数量

角色(精灵)越多,每帧要计算的任务越重。同类型对象优先用克隆体而不是复制多个角色。

1
2
3
4
5
// 50 个敌人:1 个角色 + 克隆 50 次,比建 50 个角色快
when green flag clicked
repeat (50)
create clone of (敌人)
end

广播风暴

频繁大量广播(如每帧都广播)会让所有接收脚本不断重启,拖慢项目。把广播放到条件变化时。

1
2
3
4
5
// 不要在 forever 里无脑广播
// 位置发生变化时才广播,减少消息风暴
if <not <(x position) = (上一帧x)>> then
broadcast (位置)
end

变量缓存

把重复计算的结果存进变量,避免每次都用复杂运算。多次用到的值提前算好存起来。

1
2
3
4
5
// 一次计算,多处复用
set [距离 v] to ((x position) - (目标x))
if <(距离) < (50)> then
say (快到了)
end

精灵列表管理

舞台右下角的角色列表显示全部精灵。拖动调整顺序,右键可复制、导出、删除角色。

1
2
// 右键角色缩略图 > 复制/导出/删除
// 复制出的角色带相同脚本,可改造型变新角色

性能优化

减少每帧重绘、避免海量列表运算、限制克隆体与粒子数量,项目就更流畅。

1
2
3
4
5
6
7
// 减少闪烁:先隐藏角色再批量移动
hide
repeat (20)
change x by (5)
end
show
// 大量计算放「运行时不刷新屏幕」的自制积木里

造型与声音资源

每个造型、声音都是资源,越多项目文件越大、加载越慢。删无用资源、导入前压缩图片。

1
2
// 删除不用的造型与声音,减小 .sb3 体积
// 图片在导入前压缩尺寸,减少加载时间

10.角色即对象

每个角色都是对象:自带变量与脚本,克隆体就是多实例。

角色即对象

角色封装了造型、变量与脚本,本身就是一个小对象。舞台则相当于全局容器。

1
2
3
4
// 角色「猫」:变量 名字 + 脚本
when green flag clicked
set [名字 v] to (小猫)
say (join (你好,) (名字))

克隆体即实例

克隆体是角色的副本实例,共享造型与全局脚本,但有自己的位置、大小与私有变量。

1
2
3
4
5
6
when green flag clicked
repeat (3)
create clone of (我自己)
end
when I start as a clone
go to x: (pick random (-200) to (200)) y: (0)

广播即方法调用

广播相当于向其他「对象」发消息,接收积木处理消息。类似面向对象里的消息调用。

1
2
3
4
5
when this sprite clicked
broadcast (受伤)
when I receive (受伤)
say (啊!)
change [生命 v] by (-1)

私有属性

「仅适用于当前角色」的变量就是对象的私有属性,克隆体各自独立,互不干扰。

1
2
3
4
5
6
when green flag clicked
set [编号 v] to (1)
create clone of (我自己)
when I start as a clone
set [编号 v] to (2) // 只改这个克隆体
say (编号)

克隆复用

克隆一个角色就得到同款「模板」,再改脚本或变量就能派生出行为不同的实例,类似继承。

1
2
3
4
5
6
7
// 克隆敌人模板 → 每份设置不同速度
when I start as a clone
set [速度 v] to (pick random (1) to (5))
forever
move (速度) steps
if on edge, bounce
end

状态与行为

对象的状态存在变量里,行为是脚本。通过判断状态变量决定执行哪套行为。

1
2
3
4
5
6
7
8
9
if <(状态) = (巡逻)> then
move (5) steps
if on edge, bounce
else
if <(状态) = (追踪)> then
point towards (玩家)
move (8) steps
end
end

事件驱动模型

Scratch 是事件驱动:绿旗、按键、点击、消息都触发对应脚本。没有主函数,一切从事件开始。

1
2
3
4
5
6
7
8
when green flag clicked
启动游戏
when this sprite clicked
播放音效
when key (空格 v) pressed
跳跃
when I receive (过关)
进入下一关

消息传递

角色之间不直接访问对方变量,而是通过广播消息 + 读取共享变量协作,解耦更清晰。

1
2
3
4
5
6
7
// 玩家得分 → 广播给记分板角色
when this sprite clicked
change [分数 v] by (1)
broadcast (加分动画)
// 记分板角色接收
when I receive (加分动画)
set [显示分数 v] to (分数)

11.调试与错误处理

Scratch 没有异常机制,靠监视变量、说积木与边界检查来发现问题。

没有异常机制

Scratch 不会抛异常,程序只会按错误逻辑悄悄运行。所以提前检查数据、主动防错很重要。

1
2
3
// 不会报错,只会得到奇怪的结果
// 越界读列表返回空,比较可能总为假
// 提前检查数据是唯一防线

监视变量

右键舞台上的变量显示器可切换正常读法、大字读法、滑块或隐藏,方便实时观察数值。

1
2
3
4
// 右键舞台上的变量显示器:
// 正常读法 / 大字读法 / 滑块 / 隐藏
set [分数 v] to (0)
change [分数 v] by (1)

用说积木调试

在可疑位置放「说 (某变量)」把中间值打出来,排查逻辑。查完记得删除。

1
2
3
define 计算得分
set [总分 v] to ((a) + (b))
say (总分) // 临时调试输出

边界检查

读取列表元素前先判断序号是否在范围内,避免读到空值。范围是 1 到长度。

1
2
3
4
5
if <<(i) > (0)> and <(i) <= (length of [背包 v])>> then
say (item (i) of [背包 v])
else
say (序号越界)
end

空值检查

answer 为空、列表为空时先判断再使用,防止拿空值参与运算产生奇怪结果。

1
2
3
4
5
if <(length of [背包 v]) = (0)> then
say (背包是空的)
else
say (item (1) of [背包 v])
end

列表越界

列表序号从 1 开始,删除元素后序号会自动前移。用「长度」做上限就不会越界。

1
2
3
4
5
delete (1) of [背包 v]
// 删除后原第 2 个变第 1 个
if <(i) > (length of [背包 v])> then
set [i v] to (length of [背包 v])
end

分步调试

把大脚本拆成小块逐段测试,或用等待积木放慢节奏,观察每一步发生了什么。

1
2
3
4
5
6
when green flag clicked
初始化
wait (0.5) seconds // 放慢观察
计算得分
wait (0.5) seconds
显示结果

常见错误清单

错误常源于变量没初始化、条件写反、序号越界、广播没人接收。按清单逐项排查。

1
2
3
4
5
// 检查变量是否先赋值再用
// 检查比较方向是否正确
// 检查列表序号是否在范围内
// 检查广播与接收名字是否一致
// 检查克隆体是否超出上限

12.输入与输出

用侦测积木读键盘、鼠标与问答,用说、造型与背景输出,云变量存数据。

键盘输入

「按下空格键?」侦测按键是否被按住,配合循环实现持续移动,配合单次判断实现跳跃。

1
2
3
4
5
6
7
8
forever
if <key (右移 v) pressed?> then
change x by (5)
end
if <key (左移 v) pressed?> then
change x by (-5)
end
end

鼠标输入

侦测鼠标位置与按下状态,让角色跟随鼠标或响应点击。

1
2
3
4
5
6
7
8
forever
go to (mouse-pointer)
if <mouse down?> then
set size to (120) %
else
set size to (100) %
end
end

问答输入

「询问…并等待」弹出输入框,用户回答存进「回答」积木。回答永远是字符串。

1
2
3
4
ask (你叫什么名字?) and wait
say (join (你好,) (answer))
ask (你今年几岁?) and wait
set [年龄 v] to (answer)

碰触侦测

侦测角色是否碰到鼠标、其他角色或颜色。做碰撞检测、抓取物品都会用到。

1
2
3
4
5
6
7
8
forever
if <touching (敌人 v)?> then
change [生命 v] by (-1)
end
if <touching (mouse-pointer v)?> then
say (抓到我了)
end
end

侦测值输出

x 坐标、y 坐标、方向、响度、计时器等都是可读取的侦测值,可直接进运算。

1
2
3
say (join (x=) (x position))
say (join (y=) (y position))
say (loudness) // 麦克风响度 0-100

广播输出

广播让其他角色同步动作,是角色间的主要输出通道,接收方做响应。

1
2
3
4
5
when this sprite clicked
broadcast (开门)
when I receive (开门)
switch costume to (门开了)
play sound (咔嗒 v)

云变量存储

云变量把数字存到服务器,所有玩家共享。适合做最高分、在线统计。

1
2
3
4
when green flag clicked
if <(分数) > (云_最高分)> then
set [云_最高分 v] to (分数)
end

输出到画面

说、思考显示文字,造型切换显示图像,播放声音输出音频。组合它们做出反馈。

1
2
3
4
5
6
when this sprite clicked
say (嗷呜!) for (1) seconds
play sound (咆哮 v)
switch costume to (张嘴)
wait (0.3) seconds
switch costume to (闭嘴)

13.常见坑

新手最常踩的八个坑,BAD 是错误写法,GOOD 是正确做法。

无限循环卡住

在 forever 循环里写等待,若条件永远不满足,脚本就卡住。循环里要有能改变条件的积木。

1
2
3
4
5
6
7
8
// BAD 等待一个永远不满足的条件
forever
wait until <(x position) > (1000)>
end
// GOOD 循环内推进条件或让循环能退出
repeat until <(x position) > (240)>
change x by (5)
end

广播时序

广播是异步的:发完立刻继续执行,接收脚本同时启动。需要顺序时用「广播并等待」。

1
2
3
4
5
6
// BAD 发完广播立即读接收方设置的值,可能还没更新
broadcast (开始动画)
say (动画结束)
// GOOD 用「广播并等待」等接收方完成
broadcast (开始动画) and wait
say (动画结束)

克隆体变量混乱

全局变量在克隆体间共享,改一个全变。要区分克隆体,用「仅适用于当前角色」的私有变量。

1
2
3
4
5
6
7
8
9
// BAD 用全局变量做编号,所有克隆体读到同一个值
set [编号 v] to (0)
repeat (3)
change [编号 v] by (1)
create clone of (我自己)
end
// GOOD 私有变量在克隆时复制给克隆体
when I start as a clone
say (编号)

等待永不满足

wait until 条件由另一段脚本设置时,那段脚本可能没运行。确保有脚本能改变该条件。

1
2
3
4
5
// BAD 条件只可能由被停止的脚本改变
wait until <(加载完成) = (1)>
// GOOD 用事件等待,而不是轮询变量
when I receive (加载完成)
say (加载好了)

空值参与运算

answer 或列表元素为空时参与比较、运算会得到假或奇怪结果。先判断长度再使用。

1
2
3
4
5
6
7
8
9
10
11
ask (输入数字) and wait
// BAD 空输入当数字比较,永远为假
if <(answer) > (10)> then
say (大于10)
end
// GOOD 先检查是否为空
if <(length of (answer)) > (0)> then
say (join (你输入了) (answer))
else
say (你没有输入)
end

列表序号越界

列表序号从 1 开始,最大是长度。用 0 或超过长度的序号读不到内容,还容易出错。

1
2
3
4
5
6
7
add (苹果) to [背包 v]
// BAD 用 0 号或超大号读列表
say (item (0) of [背包 v])
say (item (9) of [背包 v])
// GOOD 用 1..长度 内的序号
say (item (1) of [背包 v])
say (item (length of [背包 v]) of [背包 v])

造型名不一致

切换造型时名字必须与造型面板里的完全一致,多一个空格或少一个字切换都不会生效。

1
2
3
4
// BAD 造型名多打了一个空格,切换不生效
switch costume to (新造型 )
// GOOD 造型名与面板完全一致
switch costume to (新造型)

递归过深

Scratch 对递归调用有栈深度限制,太深会悄悄停止或异常。用循环代替深度递归。

1
2
3
4
5
6
7
8
9
// BAD 深度递归可能超过 Scratch 栈限制
define 数到 (n)
数到 ((n) + (1))
数到 (0)
// GOOD 用循环计数,无深度限制
set [n v] to (0)
repeat (10000)
change [n v] by (1)
end

14.多脚本与并发

多个事件脚本并行运行,用广播与等待协调它们的执行顺序。

并行脚本

同一个角色可以有多段独立脚本,它们从各自的触发事件开始并行执行,互不等待。

1
2
3
4
5
6
7
8
9
10
when green flag clicked
forever
move (5) steps
if on edge, bounce
end
when green flag clicked
forever
play sound (节拍 v)
wait (1) seconds
end

事件即线程

每个事件(绿旗、按键、点击、接收消息)都启动一条独立脚本,相当于一个线程。

1
2
3
4
5
6
when green flag clicked
say (开始了)
when key (空格 v) pressed
say (按了空格)
when this sprite clicked
say (被点击)

共享变量

所有脚本共享全局变量。多段脚本同时改一个变量时,结果可能互相覆盖。

1
2
3
4
5
6
7
when green flag clicked
forever
change [分数 v] by (1)
wait (0.1) seconds
end
when this sprite clicked
change [分数 v] by (10)

竞态条件

两段脚本同时对同一个变量做「读-改-写」,可能丢失一次更新。关键逻辑尽量放在同一段脚本里。

1
2
3
// 两段脚本同时 change 同一变量
// 读取旧值→加→写回 的中间可能被穿插
// 解决:把关键计数集中到一段脚本处理

广播同步顺序

「广播并等待」会等所有接收脚本执行完再继续,可用于安排多步动画的先后顺序。

1
2
3
broadcast (第一幕) and wait
broadcast (第二幕) and wait
broadcast (第三幕) and wait

停止线程

停止积木能停掉指定脚本:全部、这个脚本、或该角色的其他脚本。常用于重置。

1
2
3
4
5
when green flag clicked
broadcast (重新开始)
when I receive (重新开始)
stop (other scripts in sprite)
set [分数 v] to (0)

协调多角色

多个角色并行行动时,用共享变量加等待,让它们齐步走或按顺序行动。

1
2
3
4
5
6
7
when green flag clicked
set [信号 v] to (0)
when I receive (齐步走)
set [信号 v] to (1)
when green flag clicked
wait until <(信号) = (1)>
say (开始前进)

单线程协作

虽然脚本并行,但每个脚本内部仍按顺序逐块执行,同一时刻只执行一块积木。长循环会卡住同角色其他脚本。

1
2
3
4
5
// 一个脚本里的长循环会阻塞该角色其他脚本
// 用「广播」把任务拆到不同事件里
repeat (100)
复杂计算
end

15.网络与扩展

云变量让项目联网共享数据,扩展积木提供翻译、朗读等在线能力。

云变量联网

云变量把数字实时同步到服务器,多个用户运行同一项目时数据互通,适合排行榜和简单对战。

1
2
3
4
5
// 建立变量时勾选「云变量」(仅数字)
when green flag clicked
if <(分数) > (云_最高分)> then
set [云_最高分 v] to (分数)
end

翻译扩展

「翻译」扩展调用在线翻译,把文字译成目标语言并返回字符串。

1
2
3
// 添加扩展 > 翻译
say (translate (你好) to (英语 v))
say (translate (Hello) to (中文 v))

文字转语音

「文字朗读」扩展把文字读出来,可切换语言与音色,需联网调用语音服务。

1
2
3
// 添加扩展 > 文字朗读
speak (欢迎来到我的游戏)
set voice to (Kitty v)

视频侦测

「视频侦测」扩展用摄像头捕捉动作,让玩家挥手控制角色。首次使用需授权摄像头权限。

1
2
3
// 添加扩展 > 视频侦测
when video motion > (50)
say (有动作!)

分享到网站

点右上角「分享」发布项目到 Scratch 官网,任何人可在线运行、点赞与评论。

1
2
// 登录账号 → 点右上角「分享」
// 发布后可复制链接分享给朋友

改编作品

在网站上点「改编」复制别人项目,改成自己的版本。改编会保留原作者署名。

1
2
// 打开他人项目 → 点「改编」(Remix)
// 改编后编辑脚本再分享,成为你的作品

云变量限制

云变量有使用限制:每个项目数量有限,值只能存数字且不能太长,频繁更新会被服务器限流。

1
2
3
4
// 每个项目云变量数量有限
// 云变量只能存数字,不能存文字
// 频繁更新会被服务器限流
// 使用云变量前要先登录账号

网络安全与隐私

在线项目会公开分享。不要把真实姓名、住址、电话等个人信息写进作品。

1
2
3
// 不在作品里透露真实身份信息
// 不要下载或运行陌生人发来的可疑文件
// 使用化名,保护个人隐私

16.时间与计时

用计时器、等待与天数积木做倒计时、秒表与限时关卡。

计时器

「计时器」从项目运行开始计时,单位秒,可精确到小数,是秒表和倒计时的核心。

1
2
3
4
5
when green flag clicked
say (计时器)
forever
say (join (已用:) (timer))
end

计时器归零

「计时器归零」把计时器重置为 0,用于开始新一段计时。

1
2
3
4
when green flag clicked
reset timer
wait (5) seconds
say (join (用时:) (timer))

天数计时

「自 2000 年以来的天数」返回从 2000-01-01 起的天数,可用于跨天计时或记录上次打开时间。

1
2
say (days since 2000)
// 返回带小数的天数,如 9678.5 表示半天

等待秒数

「等待 N 秒」暂停当前脚本 N 秒,用来做节奏、延迟与动画帧率。

1
2
3
4
5
when green flag clicked
say (3) for (1) seconds
say (2) for (1) seconds
say (1) for (1) seconds
say (起飞!)

倒计时

用计时器与减法做倒计时,归零后触发结束事件。

1
2
3
4
5
6
7
8
9
10
when green flag clicked
set [剩余 v] to (30)
forever
set [剩余 v] to ((30) - (timer))
if <(剩余) < (0)> then
set [剩余 v] to (0)
broadcast (时间到)
stop (this script)
end
end

秒表

用计时器差值测量一段操作的用时,适合做反应测试小游戏。

1
2
3
4
5
when green flag clicked
wait until <key (空格 v) pressed?>
reset timer
wait until <key (空格 v) pressed?>
say (join (你的反应:) (join (timer) ( 秒)))

限时关卡

限定时间内完成任务,超时则失败。把倒计时与胜利条件结合。

1
2
3
4
5
6
7
8
9
10
11
when green flag clicked
set [倒计时 v] to (10)
repeat until <(倒计时) < (1)>
wait (1) seconds
change [倒计时 v] by (-1)
if <(通关) = (1)> then
say (过关!)
stop (this script)
end
end
say (时间到!)

计时动画

用计时器让动画与时间挂钩,而不是依赖帧率,保证不同电脑上速度一致。

1
2
3
4
forever
go to x: ((timer) * (100)) y: (0)
end
// 角色随时间匀速移动,不依赖机器快慢

17.脚本生命周期

脚本是 Scratch 的最小执行单元,理解它的启动、运行与停止,就理解了整个项目流程。

脚本即过程

一段从事件积木开始、到末尾结束的脚本,就是一个小过程。多段脚本组成完整程序。

1
2
3
when green flag clicked // 起点
say (第一步)
say (第二步) // 顺序执行

绿旗启动

绿旗是标准启动入口:点击后所有「当绿旗被点击」脚本同时开始,相当于主程序入口。

1
2
3
when green flag clicked
初始化所有变量
显示开始界面

事件处理器

事件积木是脚本的「头」,触发时才运行。没有触发条件,脚本不会自己启动。

1
2
3
4
5
6
when key (空格 v) pressed
跳跃
when this sprite clicked
打招呼
when I receive (过关)
next backdrop

原子执行过程

自制积木勾选「运行时不刷新屏幕」后,整个块一次性执行完,中间不渲染画面,适合快速批量计算。

1
2
3
define 大量计算
// 勾选「运行时不刷新屏幕」
// 一帧内完成,不逐块刷新画面

并行生命周期

各脚本独立启动与停止。停止积木可以精确控制:全部、这个脚本或该角色其他脚本。

1
2
3
4
5
6
when green flag clicked
主循环
when I receive (暂停)
stop (other scripts in sprite)
when I receive (继续)
主循环

停止的作用域

「停止这个脚本」只影响当前段;「停止该角色的其他脚本」停掉同角色其余脚本;「停止全部」清场。

1
2
3
stop (this script)
stop (other scripts in sprite)
stop (all)

状态机过程

用变量记录当前状态,让脚本在状态间切换,实现菜单、游戏、结束等场景流转。

1
2
3
4
5
6
7
if <(场景) = (菜单)> then
switch backdrop to (菜单背景)
else
if <(场景) = (游戏中)> then
switch backdrop to (游戏背景)
end
end

项目生命周期

一个项目从加载资源、点击绿旗启动,到停止按钮结束,再到保存分享,构成完整生命周期。

1
2
3
4
5
// 加载:读取造型、声音、变量
// 启动:点击绿旗,各脚本开始
// 运行:事件、循环持续执行
// 停止:点红圆钮停止全部
// 保存:自动保存或手动下载 .sb3

18.文本模式匹配

Scratch 没有正则,用包含、字符判断与列表拆分做简单匹配。

没有正则

Scratch 没有正则表达式积木。复杂文本匹配需要自己用运算积木模拟,或交给扩展处理。

1
2
// Scratch 没有正则表达式
// 用「包含」「第 N 个字符」等积木自己实现

包含匹配

「包含」做最简单的子串匹配,判断文本里是否出现某个词。

1
2
3
if <(台词) contains (危险)> then
say (出现危险词!)
end

判断开头

取第 1 个字符判断是否以某字开头,做前缀检测。

1
2
3
if <(letter (1) of (命令)) = (跳)> then
say (执行跳跃指令)
end

判断结尾

取最后一个字符判断结尾,做后缀检测。最后一位的序号就是字符串长度。

1
2
3
if <(letter (length of (命令)) of (命令)) = (!)> then
say (语气强烈)
end

字符类别

判断单个字符是数字还是字母,可先做一张数字表,再用「包含」查询。

1
2
3
4
// 数字表 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
if <[数字表 v] contains (letter (i) of (文本))> then
say (这是数字)
end

模式查找

用循环逐字符扫描文本,查找满足条件的片段,如找出一串数字。

1
2
3
4
5
6
7
set [i v] to (1)
repeat (length of (文本))
if <[数字表 v] contains (letter (i) of (文本))> then
say (join (找到数字) (letter (i) of (文本)))
end
change [i v] by (1)
end

拆分解析

按分隔符把文本拆进列表再逐段处理,实现简单的解析。

1
2
3
4
5
6
7
8
9
10
11
set [i v] to (1)
repeat (length of (文本))
if <(letter (i) of (文本)) = (,)> then
add (当前段) to [段落 v]
set [当前段 v] to ()
else
set [当前段 v] to (join (当前段) (letter (i) of (文本)))
end
change [i v] by (1)
end
add (当前段) to [段落 v]

通配符模拟

用「包含」加多重条件模拟通配符,例如判断文本是否匹配任一关键词。

1
2
3
if <<(文本) contains (开始)> or <(文本) contains (结束)>> then
say (匹配到关键词)
end

19.保存发布与调试

保存、导出、分享项目与调试技巧,让作品更流畅可玩。

保存项目

登录后项目自动保存到云端。「文件」菜单可手动保存或下载到电脑做备份。

1
2
3
4
// 登录后自动保存到云端
// 文件 > 保存到你的电脑,备份 .sb3
when green flag clicked
say (放心,已经自动保存了)

.sb3 文件格式

项目文件后缀 .sb3,是一个压缩包:内含 project.json 与造型、声音等素材,可离线打开。

1
2
3
// .sb3 是 zip 压缩包
// 里面包含 project.json 与素材文件
// 双击 .sb3 可离线打开项目

分享发布

点右上角「分享」发布作品,设置标题、说明与标签,帮助更多人找到它。

1
2
3
// 起一个有趣的项目标题
// 写清玩法说明,添加合适标签
// 点「分享」发布,复制链接给朋友

改编再创作

在网站上改编他人项目作为学习起点,改脚本、加关卡,发布自己的版本。

1
2
3
// 打开项目 → 点「改编」(Remix)
// 修改脚本与造型后分享
// 保留原作者署名,遵守社区规则

调试工具

用监视变量、说积木、放慢等待等技巧定位问题,逐段验证脚本。

1
2
3
// 监视可疑变量实时看值
// 临时加 say 输出中间结果
// 加 wait 放慢观察每一步

备份与版本

下载 .sb3 到本地做备份,改名保存多个版本,改坏了大不了退回上一版。

1
2
// 重要作品定期下载 .sb3 备份
// 用「另存为」保存多个版本

发布前检查

发布前测试各入口:绿旗、按键、点击、广播;确认无死循环、无越界、画面不卡。

1
2
3
// 测试:绿旗、空格、点击角色、接收广播
// 检查:循环能退出、列表不越界
// 检查:克隆体不超上限、画面流畅

持续学习

从官方教程、Scratch Wiki 与社区项目学习更多技巧,不断改进你的作品。

1
2
3
// 官方教程:scratch.mit.edu 的「创意与学习」
// Scratch Wiki:en.scratch-wiki.info
// 多玩社区优秀作品,边看边学

官方链接

直达官方文档与资源。

关于本速查

Scratch 是麻省理工学院媒体实验室开发的免费可视化编程语言,专为 5–16 岁学习者设计。它用「积木」拼搭代替敲代码:把运动、外观、声音、事件、控制、侦测、运算、变量、自制积木九大分类的积木拖到脚本区,就能做出角色动画、互动游戏与创意故事。 本页是 Scratch 3 的自包含速查手册,覆盖初学者在游戏、动画与故事构建中约 80% 的常见用法。19 个章节各聚焦一个主题:从第一个程序(hello)、变量与数据存储(vars / types / pointers)、流程控制(control)、自制积木(funcs)、字符串与列表(strings / collections)、项目与资源管理(mem)、角色对象模型(oop)、调试与常见坑(errors / faq)、输入输出与并发脚本(io / threads)、云变量与扩展(net)、时间与计时(time)、脚本生命周期(proc)、文本模式匹配(regex)到保存发布与调试(build)。每节拆成 8 个带示例的小节,每个示例 5–20 行,方便边读边抄。 与其他编程语言不同,Scratch 没有文本语法,这里用积木的可读文本表示,方便离线查阅与回忆。全部内容在你的浏览器内渲染——不上传、不追踪,隐私安全。本页是 GuruToolkit 免费开发者工具集的一部分;代码片段可自由使用,不提供任何担保。

版本 2.1.0