Scratch中間接實現多維數組支持(一)

目前,Scratch 3.X不支持多維數組。但是,有一些方法可以使用當前的列表(一維數組)來模擬實現它們。

二維數組方法1:

假設有如下一個二維數組:

Scratch中間接實現多維數組支持(一)

其中,簡單變量row和col分別用來表示將來訪問該數組的行索引與列索引。於是,可以定義如下的一個Scratch向量array2d來表示上述的二維數組:

Scratch中間接實現多維數組支持(一)
Scratch向量array2d來表示上述的二維數

於是,看下面代碼:

Scratch中間接實現多維數組支持(一)
訪問二級數組

最後一句代碼意思是訪問上面數組中的第row行第col列中的元素。因此,輸出結果是8。

[原理]易見,上面表示中“item row of array2d”是基本的列表操作積木,意思是訪問列表的第row項——對應於二維數組表示中的第row行;而“letter col of ...”是字符串操作積木,意思是檢索這個字符串(列表中的第row項)中的第col個字符——對應於二維數組表示中的第row行的第col列位置處的元素。

因此,很明顯:這種表示方法的侷限性之一是,二維數組(或者說是一個矩陣)中的元素只能是長度爲1的單個字符或者數字。

還有一個侷限性:很難再修改此矩陣中的某位置的元素。當然,可以直接使用這個數組中的某一行——即要修改的話把一行全部修改,這個操作通過最基本的列表積木(replace item x of array2d with newvalue)即可完成。再分析下去,使用這種思路,可以先把不需要修改的位置的元素使用上面方法逐個提取出來,然後按該行中元素原來的順序使用字符串連接運算積木再連接起來。通過這種繁瑣的操作也可以最終實現修改一個二維數組(矩陣)中某位置的元素的值的目的。

只支持只讀操作的話,說使用列表能夠表示一個二維數組比較勉強。下面,我們基於上面的算法分析來創建一個修改二維數組的自定義積木。

使用自定義積木來模擬二維數組修改操作

Scratch中間接實現多維數組支持(一)

模擬二維數組修改操作的自定義積木

下面我們來測試一下,爲此,定義如下圖所示的列表和輔助變量:

Scratch中間接實現多維數組支持(一)
測試用變量

在上圖中,我們定義了一個二維數組陣列(3行7列,且根據前文介紹,每一個數組元素是長度爲1的字符),再用圖更直觀地描述一下的話,如下所示:
Scratch中間接實現多維數組支持(一)

二維數組矩陣

Scratch中的變量支持功能非常有限。在上面例子中,爲了實現自定義積木,使用會使用到一些臨時變量,這些也需要顯示於舞臺上(當然也可以隱藏它們)。還好,在目前的3.10.2版本中,變量名前由系統自動添加一個顯示作用域的角色名稱,比較於以前已經有一定進步了。

下面的自定義積木的調用:

Scratch中間接實現多維數組支持(一)
調用自定義積木

上面這一句調用的意思是,把上面二維數組的第3行第4列的元素修改爲新元素5。通過前面積木代碼中的say積木你能夠很容易檢測這一結果。

關於刪除二維數組元素

因爲本文方案表達的特殊要求,所以,要想使用這種方式實現二維數組元素的徹底刪除的話是不可能的。但是,我們仍然可以“委婉”地實現——例如通過上面的替換式修改方法把某個指定元素修改爲例如“-1”、某一個極大值或者極小值或者某一個特殊字符等便可以暗示此位置的上元素被刪除了。

小結

在本文介紹的這種二維數組表示方法中,最大的弱點是數組每一位上的內容的長度只能爲1!在接下來的文章中,我會介紹另一種更爲通用的、功能更爲強大的使用Scratch中列表表示一個二維甚至是多維數組的方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章