深入理解区域变数
在“全域变数、区域变数”教学里已经认识了全域变数和区域变数的用法,这篇教学会针对“区域变数”进行更深入的介绍,透过灵活操作区域变数,就能让程序运作得更加有效率以及更有弹性。
请先阅读:全域变数、区域变数
快速导览:
定义区域变数名称
新增变数或清单时,只要勾选“仅适用当前角色”,就能够建立“区域变数”( 清单名称也属于变数的一种 )。
不过如果只是单纯建立区域变数,在清单积木里“无法马上看出”变数是区域变数还是全域变数,以下图的例子而言,变数 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 范例必备的技巧之一,透过熟练的操作区域变数,就能大幅减少程序积木的使用,也能让程序更加容易阅读和维护,是非常实用的高级技巧!
微信扫码关注
抖音扫码关注