本工具使用的開源套件

本工具程式碼中捆綁了 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