目前,Scratch 3.X不支持多维数组。但是,有一些方法可以使用当前的列表(一维数组)来模拟实现它们。
二维数组方法1:
假设有如下一个二维数组:
其中,简单变量row和col分别用来表示将来访问该数组的行索引与列索引。于是,可以定义如下的一个Scratch向量array2d来表示上述的二维数组:
Scratch向量array2d来表示上述的二维数
于是,看下面代码:
访问二级数组
最后一句代码意思是访问上面数组中的第row行第col列中的元素。因此,输出结果是8。
**
[原理]易见,上面表示中“item row of array2d”是基本的列表操作积木,意思是访问列表的第row项——对应于二维数组表示中的第row行;而“letter col of …”是字符串操作积木,意思是检索这个字符串(列表中的第row项)中的第col个字符——对应于二维数组表示中的第row行的第col列位置处的元素。**
因此,很明显:这种表示方法的局限性之一是,二维数组(或者说是一个矩阵)中的元素只能是长度为1的单个字符或者数字。
还有一个局限性:很难再修改此矩阵中的某位置的元素。当然,可以直接使用这个数组中的某一行——即要修改的话把一行全部修改,这个操作通过最基本的列表积木(replace item x of array2d with newvalue)即可完成。再分析下去,使用这种思路,可以先把不需要修改的位置的元素使用上面方法逐个提取出来,然后按该行中元素原来的顺序使用字符串连接运算积木再连接起来。通过这种繁琐的操作也可以最终实现修改一个二维数组(矩阵)中某位置的元素的值的目的。
只支持只读操作的话,说使用列表能够表示一个二维数组比较勉强。下面,我们基于上面的算法分析来创建一个修改二维数组的自定义积木。
使用自定义积木来模拟二维数组修改操作
模拟二维数组修改操作的自定义积木
下面我们来测试一下,为此,定义如下图所示的列表和辅助变量:
测试用变量
在上图中,我们定义了一个二维数组阵列(3行7列,且根据前文介绍,每一个数组元素是长度为1的字符),再用图更直观地描述一下的话,如下所示:
二维数组矩阵
Scratch中的变量支持功能非常有限。在上面例子中,为了实现自定义积木,使用会使用到一些临时变量,这些也需要显示于舞台上(当然也可以隐藏它们)。还好,在目前的3.10.2版本中,变量名前由系统自动添加一个显示作用域的角色名称,比较于以前已经有一定进步了。
下面的自定义积木的调用:
调用自定义积木
上面这一句调用的意思是,把上面二维数组的第3行第4列的元素修改为新元素5。通过前面积木代码中的say积木你能够很容易检测这一结果。
关于删除二维数组元素
因为本文方案表达的特殊要求,所以,要想使用这种方式实现二维数组元素的彻底删除的话是不可能的。但是,我们仍然可以“委婉”地实现——例如通过上面的替换式修改方法把某个指定元素修改为例如“-1”、某一个极大值或者极小值或者某一个特殊字符等便可以暗示此位置的上元素被删除了。
小结
在本文介绍的这种二维数组表示方法中,**最大的弱点是数组每一位上的内容的长度只能为1!**在接下来的文章中,我会介绍另一种更为通用的、功能更为强大的使用Scratch中列表表示一个二维甚至是多维数组的方法。