搜尋

深入理解「區域變數」

在「全域變數、區域變數」教學裡已經認識了全域變數和區域變數的用法,這篇教學會針對「區域變數」進行更深入的介紹,透過靈活操作區域變數,就能讓程式運作得更加有效率以及更有彈性。

請先閱讀:全域變數、區域變數

快速導覽:

定義區域變數名稱

新增變數或清單時,只要勾選「僅適用當前角色」,就能夠建立「區域變數」( 清單名稱也屬於變數的一種 )。

Scratch 教學 - 深入理解「區域變數」 - 僅適用當前角色

不過如果只是單純建立區域變數,在清單積木裡「無法馬上看出」變數是區域變數還是全域變數,以下圖的例子而言,變數 a、b、c 裡只有 b 是區域變數,清單 list 和 list2 的 list 是區域變數,但無法直接從名稱區隔,只能從舞台裡進行區分。

Scratch 教學 - 深入理解「區域變數」- 無法馬上看出變數是區域變數還是全域變數

為了讓開發程式更有效率,可以運用「命名」的方法,從變數名稱進行全域變數和區域變數的區隔,常見的做法可以在變數前方加上「$」或「_」符號,或者直接加入「local」名稱作為識別

將識別符號加在名稱前方,可以讓區域變數在積木清單排序裡「排在一起」,減少尋找時間與出錯機會。

Scratch 教學 - 深入理解「區域變數」- 運用一些「命名」的方法區隔

區域變數的作用範圍

變數的「作用範圍」表示「可以在哪裡讀取這個變數的內容」,以「全域變數」而言,不論是任何角色、舞台、分身、函式,讀取的變數內容都是「同一個」,因此只要變數在某個地方被更改內容,讀取到的內容就會是新的數值,以下圖為例,變數 a 是全域變數,執行後點擊貓咪會將 a 增加 1,但點擊螃蟹時,仍然會講出目前變數 a 實際的數值,因為兩個角色可以讀取同一個變數

Scratch 教學 - 深入理解「區域變數」 - 變數的「作用範圍」表示「可以在哪裡讀取這個變數的內容」

有別於全域變數,「區域變數」的作用範圍僅止於「角色本身」,以下圖為例,如果在貓咪角色建立了區域變數 $_a,螃蟹的積木清單裡將看不到 $_a 變數,這表示區域變數 $_a 只有貓咪可以使用。

Scratch 教學 - 深入理解「區域變數」 - 「區域變數」的作用範圍僅止於「角色本身」

區域變數作用的「角色」除了舞台上的不同角色,「不同分身」也屬於「不同角色」,以下圖為例,雖然本尊和分身都有使用名 $_a 區域變數,但因為 Scratch 的區域變數作用範圍僅止於角色本身,所以分身和本尊的 $_a 數值並不相同,不同分身之間的 $_a 數值也不相同

Scratch 教學 - 深入理解「區域變數」 - 「不同分身」也屬於「不同角色」

獨立事件:分身產生

延續上述區域變數的作用範圍,將程式改成下圖,執行後點擊貓咪,本尊貓咪會講 0,分身貓咪都會講 1,這時可能會有個疑問:「為什麼分身可以修改本尊的區域變數?」。

Scratch 教學 - 深入理解「區域變數」- 為什麼分身可以修改本尊的區域變數?

會造成這個狀況,是因為分身在一開始沒有定義 $_a,為了定義 $_a 變數,程式邏輯會產生一個類似「變數 $_a 設為 $_a」的積木區塊,所以會造成分身的 $_a 初始值與本尊相同的狀況 ( 所以改變 1 之後就會從 0 變成 1 )。

Scratch 教學 - 深入理解「區域變數」- 分身在一開始沒有定義區域變數

因為 Scratch 的區域變數定義原則,如果將「$_a 改變 1」的積木放在「本尊」的重複迴圈裡,就會影響到每一個分身的 $_a 初始數值,以下圖為例,產生的三個分身各自的 $_a 數值都不同。

Scratch 教學 - 深入理解「區域變數」- 會影響到每一個分身的區域變數初始數值

雖然可以順利讓不同分身具有不同區域變數數值,但「非常不建議」此用這種作法,因為如果在不同的作用範圍裡使用「相同區域變數名稱」,非常容易搞錯邏輯,未來在進行程式除錯時也不容易處理,所以盡可能避免這種「相同名稱」的做法。

如果要進行改良,可以仿照下圖的模式,新增一個全域變數 n,當分身產生時將 n 增加 1,接著把分身各自的區域變數等於當下的 n,就能做到同樣的效果,程式積木也更加容易的閱讀和管理。

Scratch 教學 - 深入理解「區域變數」- 新增一個全域變數 n,當分身產生時將 n 增加 1

獨立事件:點擊角色

「點擊角色」的事件屬於個別角色的「獨立事件」,因此如果將區域變數放在點擊角色的積木裡,該區域變數屬於「被點擊角色」的區域變數,以下圖為例,本尊和分身各自擁有自己的區域變數 $_a,這個變數互不影響,當角色被點擊時,只有將所屬該角色的 $_a 的數值增加 1。

Scratch 教學 - 深入理解「區域變數」- 該區域變數屬於「被點擊角色」的區域變數

完成後執行程式,點擊本尊和分身,就會講出各自的數值,彼此之間不會互相影響。

Scratch 教學 - 深入理解「區域變數」- ,點擊本尊和分身,就會講出各自的數值

共用事件:鍵盤、廣播、背景、響度

Scratch 裡的「當鍵盤按下、當收到廣播、當背景換成、當聲音響度大於」這四個事件積木,屬於共用事件的積木,只要共用事件發生時,角色的本尊和分身同時都會開始動作

Scratch 教學 - 深入理解「區域變數」- 當鍵盤按下、當收到廣播、當背景換成、當聲音響度大於

以下圖為例,如果將上述的程式碼加入「當按下空白鍵時把 $_a 區域變數的數值增加 1」的程式區塊。

Scratch 教學 - 深入理解「區域變數」- 將上述的程式碼加入程式區塊

程式執行後按下空白鍵,本尊和分身就會各自改變自己的區域變數數值,彼此之間不會互相影響。

Scratch 教學 - 深入理解「區域變數」- 本尊和分身就會各自改變自己的區域變數數值

函式裡的區域變數

如果在函式裡使用區域變數,這個區域變數等於「有使用函式」角色的區域變數,以下圖為例,將點擊角色的程式改用 test 函式。

Scratch 教學 - 深入理解「區域變數」- 這個區域變數等於「有使用函式」角色的區域變數

執行後點擊角色,會發現點擊本尊和分身時,會進行各自區域變數 $_a 的運算,彼此之間互不干擾。

Scratch 教學 - 深入理解「區域變數」- ,點擊本尊和分身,就會講出各自的數值

小結

「區域變數」是實作「進階」Scratch 範例必備的技巧之一,透過熟練的操作區域變數,就能大幅減少程式積木的使用,也能讓程式更加容易閱讀和維護,是非常實用的高級技巧!

意見回饋

如果有任何建議或問題,可傳送「意見表單」給我,謝謝~

Scratch 教學

基本介紹

關於 Scratch 使用 Scratch 3 註冊與登入 操作介面 我的東西

圖形與聲音

繪製造型&背景 編輯音效

程式積木

積木種類 動作 外觀 音效 事件 控制 偵測 運算 變數 清單 函式積木

擴充功能

音樂 畫筆 視訊偵測 文字轉語音 翻譯

技巧&觀念

全域變數、區域變數 深入理解區域變數 控制指定分身 控制所有分身的方法 雲端變數 雲端變數記錄文字 變數串接文字 判斷英文字母大小寫 中斷與停止程式 廣播訊息並等待 鍵盤與滑鼠 滑鼠點擊與長按 偵測所有鍵盤按鍵 點擊隱藏的角色 突破角色尺寸限制 角色與舞台邊界 重複積木的等待時間 音樂暫停與繼續播放 使用造型名稱建立清單 使用造型代替變數 文字轉清單 清單合併為文字 判斷兩個清單是否相同 複製清單、反轉清單 清單數字排序 清單最大值最小值

入門範例

鍵盤控制貓咪 指向中間的箭頭 水果音樂鋼琴 貓咪的影分身之術 貓咪的細胞分裂 螃蟹跑來跑去 吃水果 摸蝴蝶 小狗追棒球 魚兒水中游 小鳥往前飛 舞棍阿伯 小時鐘 搖骰子 轉動的眼球 抽獎輪盤 大樂透電腦選號 卡牌抽籤 ( 20 中 1 ) 移動到邊緣切換場景 人物依序跳舞 ( 廣播 ) 按鈕控制貓咪 ( 廣播 )

進階範例

貓咪跑步 ( 連續背景 ) 貓咪跑步 ( 超長背景 ) 大型數字 ( 圖形數字 ) 拖拉怪獸碰撞牆壁 鍵盤鋼琴 ( 記錄音符 ) 中文字逐字稿 英文字逐字稿 計算機 1 ( 顯示數字 ) 計算機 2 ( 加減乘除 ) 雲端聊天室 音樂播放器 推貓咪 ( 視訊偵測 ) 圍捕小魚 ( 視訊偵測 ) 戳泡泡 ( 視訊偵測 )

視覺特效範例

視差效果 水中吐泡泡 雪花隨風飄 鍵盤鋼琴 ( 音符動畫 ) 無限循環畫中畫 水底探照燈 狙擊望遠鏡 ( 兩倍變焦 ) 貓咪萬花筒 仙女棒 ( 光跡效果 ) 駭客任務背景特效 放煙火 1 ( 往上發射 ) 放煙火 2 ( 爆炸效果 )

繪圖範例

鏡射畫圖 ( 對稱圖形 ) 小畫家 ( 舞台上畫圖 ) 記錄畫圖軌跡 繪製圓形 繪製橢圓形 繪製立方體 ( 會動 ) 繪製正多邊形 繪製正多角星形 ( 單純 ) 繪製正多角星形 ( 多線 ) 繪製拋物線 繪製折線圖 繪製圓餅圖 繪製圓餅圖 ( 指示線 ) 蜘蛛結網 ( 八邊形網 ) 繪製舞台方格 繪製正弦波形 ( sin ) 正弦波毛毛蟲動畫 顯示聲波圖形

物理&模擬範例

鐘擺運動 簡單磁鐵效果 兩個磁鐵的磁力線 立體空間 ( 三度空間 ) 循跡移動 拋物線發射炮彈 地球繞著太陽轉 彈跳的籃球 電風扇 ( 控制強度 ) 拉不走的彈力球 慣性移動 ( 滑鼠 ) 慣性移動 ( 鍵盤 )

入門遊戲範例

猴子接香蕉 打地鼠 打地鼠 ( 體感視訊偵測 ) 刮刮樂 吹風機吹頭髮 太空狗閃躲隕石 九九乘法測驗 英文單字測驗 釣魚遊戲 拍西瓜 ( 儲存最高分 ) 寶可夢猜猜我是誰 ( 基本 ) 形狀配對拼圖 台灣地圖拼圖 英文打字機 英文打字機 ( 判斷大小寫 ) 射擊外星人 猜數字 ( 猜大小 ) 猜數字 ( 幾 A 幾 B ) 連連看 ( 產生器 ) 連連看

進階遊戲範例

青蛙過河 青蛙過馬路 反彈球 ( 乒乓球 ) 打磚塊 狙擊氣球 ( 兩倍變焦 ) Flappy Bird Flappy Bird ( 聲控版 ) 走迷宮 ( 基本 ) 大型迷宮 ( 鍵盤控制 ) 大型迷宮 ( 滑鼠控制 ) 翻卡記憶遊戲 翻卡記憶遊戲 ( 改良版 ) 井字棋 ( 圈圈叉叉 ) 九宮格拼圖 九宮格拼圖 ( 改良版 ) 音階記憶 貪吃蛇 ( 分身版 ) 貪吃蛇 ( 畫筆版 ) 小雞下樓梯 拉霸機

團康遊戲範例

搖骰子 ( 1~3 個 ) 比手畫腳 ( 猜動物 ) 音樂傳球遊戲 大聲公 ( 比賽誰的氣長 ) 抽籤 ( 可調整中籤數量 ) 轉盤指針 ( 指到誰就當鬼 ) 倒數計時器 ( 基本版 ) 倒數計時器 ( 大數字版 )

遊戲設計技巧

角色 ( 地上移動 ) 角色 ( 蹲下、左右轉 ) 角色 ( 跳耀、兩段跳 ) 角色 ( 牆壁、爬牆 ) 地圖 ( 清單轉換 ) 地圖 ( 二維陣列 ) 地圖 ( 控制移動 ) 地圖 ( 牆壁碰撞偵測 ) 地圖 ( 吃東西偵測 ) 俄羅斯方塊 ( 角色與背景 ) 俄羅斯方塊 ( 移動與碰撞 ) 俄羅斯方塊 ( 放置方塊 ) 俄羅斯方塊 ( 消除完成方塊 ) 俄羅斯方塊 ( 下個形狀 )