深入理解「區域變數」
在「全域變數、區域變數」教學裡已經認識了全域變數和區域變數的用法,這篇教學會針對「區域變數」進行更深入的介紹,透過靈活操作區域變數,就能讓程式運作得更加有效率以及更有彈性。
請先閱讀:全域變數、區域變數
快速導覽:
定義區域變數名稱
新增變數或清單時,只要勾選「僅適用當前角色」,就能夠建立「區域變數」( 清單名稱也屬於變數的一種 )。
不過如果只是單純建立區域變數,在清單積木裡「無法馬上看出」變數是區域變數還是全域變數,以下圖的例子而言,變數 a、b、c 裡只有 b 是區域變數,清單 list 和 list2 的 list 是區域變數,但無法直接從名稱區隔,只能從舞台裡進行區分。
為了讓開發程式更有效率,可以運用「命名」的方法,從變數名稱進行全域變數和區域變數的區隔,常見的做法可以在變數前方加上「$」或「_」符號,或者直接加入「local」名稱作為識別。
將識別符號加在名稱前方,可以讓區域變數在積木清單排序裡「排在一起」,減少尋找時間與出錯機會。
區域變數的作用範圍
變數的「作用範圍」表示「可以在哪裡讀取這個變數的內容」,以「全域變數」而言,不論是任何角色、舞台、分身、函式,讀取的變數內容都是「同一個」,因此只要變數在某個地方被更改內容,讀取到的內容就會是新的數值,以下圖為例,變數 a 是全域變數,執行後點擊貓咪會將 a 增加 1,但點擊螃蟹時,仍然會講出目前變數 a 實際的數值,因為兩個角色可以讀取同一個變數。
有別於全域變數,「區域變數」的作用範圍僅止於「角色本身」,以下圖為例,如果在貓咪角色建立了區域變數 $_a,螃蟹的積木清單裡將看不到 $_a 變數,這表示區域變數 $_a 只有貓咪可以使用。
區域變數作用的「角色」除了舞台上的不同角色,「不同分身」也屬於「不同角色」,以下圖為例,雖然本尊和分身都有使用名 $_a 區域變數,但因為 Scratch 的區域變數作用範圍僅止於角色本身,所以分身和本尊的 $_a 數值並不相同,不同分身之間的 $_a 數值也不相同。
獨立事件:分身產生
延續上述區域變數的作用範圍,將程式改成下圖,執行後點擊貓咪,本尊貓咪會講 0,分身貓咪都會講 1,這時可能會有個疑問:「為什麼分身可以修改本尊的區域變數?」。
會造成這個狀況,是因為分身在一開始沒有定義 $_a,為了定義 $_a 變數,程式邏輯會產生一個類似「變數 $_a 設為 $_a」的積木區塊,所以會造成分身的 $_a 初始值與本尊相同的狀況 ( 所以改變 1 之後就會從 0 變成 1 )。
因為 Scratch 的區域變數定義原則,如果將「$_a 改變 1」的積木放在「本尊」的重複迴圈裡,就會影響到每一個分身的 $_a 初始數值,以下圖為例,產生的三個分身各自的 $_a 數值都不同。
雖然可以順利讓不同分身具有不同區域變數數值,但「非常不建議」此用這種作法,因為如果在不同的作用範圍裡使用「相同區域變數名稱」,非常容易搞錯邏輯,未來在進行程式除錯時也不容易處理,所以盡可能避免這種「相同名稱」的做法。
如果要進行改良,可以仿照下圖的模式,新增一個全域變數 n,當分身產生時將 n 增加 1,接著把分身各自的區域變數等於當下的 n,就能做到同樣的效果,程式積木也更加容易的閱讀和管理。
獨立事件:點擊角色
「點擊角色」的事件屬於個別角色的「獨立事件」,因此如果將區域變數放在點擊角色的積木裡,該區域變數屬於「被點擊角色」的區域變數,以下圖為例,本尊和分身各自擁有自己的區域變數 $_a,這個變數互不影響,當角色被點擊時,只有將所屬該角色的 $_a 的數值增加 1。
完成後執行程式,點擊本尊和分身,就會講出各自的數值,彼此之間不會互相影響。
共用事件:鍵盤、廣播、背景、響度
Scratch 裡的「當鍵盤按下、當收到廣播、當背景換成、當聲音響度大於」這四個事件積木,屬於共用事件的積木,只要共用事件發生時,角色的本尊和分身同時都會開始動作。
以下圖為例,如果將上述的程式碼加入「當按下空白鍵時把 $_a 區域變數的數值增加 1」的程式區塊。
程式執行後按下空白鍵,本尊和分身就會各自改變自己的區域變數數值,彼此之間不會互相影響。
函式裡的區域變數
如果在函式裡使用區域變數,這個區域變數等於「有使用函式」角色的區域變數,以下圖為例,將點擊角色的程式改用 test 函式。
執行後點擊角色,會發現點擊本尊和分身時,會進行各自區域變數 $_a 的運算,彼此之間互不干擾。
小結
「區域變數」是實作「進階」Scratch 範例必備的技巧之一,透過熟練的操作區域變數,就能大幅減少程式積木的使用,也能讓程式更加容易閱讀和維護,是非常實用的高級技巧!
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~