2024-08-12|閱讀時間 ‧ 約 10 分鐘

GameMaker|Array 陣列|程式基礎

這篇內容,將會講解什麼是陣列,以及與陣列相關的知識。有了這些概念,各位會更容易理解,要如何設計程式碼。

本篇教學所使用的系統是Windows 10,如果有按鍵相關的說明,會用Windows的系統來解釋。如果你用的是Mac系統,再麻煩自行換成相對應的按鍵。


前置知識


在學習本篇內容之前,最好具備以下的前置知識,以免看不懂這篇教學的內容。


Array的簡介


在資料型態(Data Type)的教學中有提到,陣列(Array)是一個,能夠存放多個數值的資料型態。跟一般的變數相比,陣列就像是旅館或公寓般的存在。

通常我們需要存放「大批」類似的數值時,就會考慮使用陣列。

常見的例子有:身高、體重,我們會給每個人,一個對應的「編號」,並在他們的編號裡,存放他們的身高、體重,這樣子我們就不需要,宣告大量的變數。

//沒有用陣列,就需要幫每個變數命名,數量一多,就會造成麻煩
//中文只是讓各位方便理解,變數實際上是不能用中文的
小明_身高 = 170 ;
小美_身高 = 160 ;
小華_身高 = 180 ;
小明_體重 = 65 ;
小美_體重 = 50 ;
小華_體重 = 80 ;

//利用陣列來存放
//下面的"身高"和"體重",屬於陣列資料
身高 = [ 170 , 160 , 180 ]
體重 = [ 65 , 50 , 80 ]

//如果我們要小明的身高和體重,可以這樣讀取
​小明_身高 = 身高[0] ;
小明_體重 = 體重[0];


陣列裡所使用的編號,我們稱為index,中文翻譯為索引。

這邊要注意的一點是,索引的「第一個」編號,是「數字0」,而不是數字1。這也是為什麼,在上面的範例中,要讀取小明的身高體重,索引是用0的原因。


陣列的資料限制


在簡介的範例中,我們存放的是實數(Real Number),但裡面也可以放布林值(Boolean)、字串(String),甚至再塞一個陣列進去。

因為陣列的功能,跟變數差不多,只是一個「名稱」標籤,因此可以放入,任何數值的資料。甚至是「混搭」不同類型的資料,到同一個陣列,也不會有問題。

//不同類型的資料,可以塞到同一個陣列​
a = [ 1 , "Hi" , true ]


關於混搭這點,需要做些補充,在GameMaker中的陣列,雖然能夠混搭資料,但在其他的程式語言中,通常只能放同一種資料,例如:全部都放實數、全部都放字串。

其他的程式語言,如果需要做到混搭的陣列,通常會用其他的方法來實踐,例如:List。

備註:認真要說的話,GameMaker中的陣列,其實就是其他人的List。


陣列的維度


透過簡介裡的範例,我們對陣列已經有初步的認識。接下來要講解的是,陣列可以依照「維度」來進行分類。


🔸一維陣列


在簡介裡的範例,就屬於一維陣列,如果用簡單的比喻,那就是公寓中的「某一排」房間。


🔸二維陣列


二維陣列,指的是陣列存放的方式,有了「長」和「寬」的索引,像是以下的程式碼:

//二維陣列的賦值範例​
array[0][0] = 0 ;


如果用現實中的物體來比喻,二維陣列大概就像夜市裡的攤位,他們都會在某個長寬的位置上擺攤。

備註:雖然夜市的攤販,不會像矩形那樣整齊,不過應該聽得懂我的意思。


🔸三維或更多維


除了二維,當然還有三維、四維、五維等等,三維比較好理解,就是「長」、「寬」、「高」的概念,不過再上去之後,以人類的認知來說,就不好比喻了。

//三維陣列的賦值範例​
array[0][0][0] = 0 ;


一維陣列 1 Dimensional Array(1D Array)


在這個部分,我們會講解,陣列常用的語法,例如:如何定義陣列,講解相關的函式(Function),以及與for迴圈的應用。


🔸定義陣列


定義陣列的方式有兩種:一個是直接賦值,另一個是先宣告,再賦值。

直接賦值的意思,就跟定義變數是一樣的。至於先宣告,再賦值,是比較少使用的方法,但在特定的狀況下,必須這樣使用,例如:宣告成局部變數(Local Variable)。

以下是直接賦值的幾種方式:

//一次放入陣列
a = [ 100 , 50 , 60 ] ;

//逐一放入陣列
a[0] = 100 ;
a[1] = 50 ;
a[2] = 60 ;

//全域變數(Global Variable)也適用
​global.a = [ 100 , 50 ] ;
global.a[0] = 100 ;
global.a[1] = 50 ;


接下來要展示,如何利用函式來定義陣列。因為需要拆成兩個步驟,才能完成定義的動作。所以下面的方法,也可以裡解成先宣告,再賦值。


array_create()可以用來建立陣列,此函式有兩個參數,第一個是陣列的長度,第二個是陣列的數值。

第二個參數是選擇性的,可有可無,在沒有使用的狀況下,陣列裡的數值,會全部放入數字0。

//建立長度為3的陣列,裡面的數值皆為數字0​
a = array_create(3) ;
//建立長度為3的陣列,裡面的數值皆為字串"Hi"
a = array_create( 3 , "Hi" ) ;


array_set()可以用來進行賦值,但使用的前提是,參數裡面的陣列,已經有被宣告過。

//​將a[1]設定成50,功能等同於a[1]=50
a = array_create(3) ;
array_set( a , 1 , 50 ) ;

//也可以用直接賦值的方式,來進行宣告
a[0] = 0 ;
​array_set( a , 1 , 50 ) ;


如果定義的index(索引),超出陣列的長度,array_set()依然能正常使用。但要注意,這麼做會讓陣列的長度,跟著一起被拉長。

//​將a[5]設定成50,陣列的長度會變成6(index是0~5,所以長度是6)
a = array_create(3) ;
array_set( a , 5 , 50 ) ;

//以下的操作,也會改變陣列的長度
a[0] = 0 ; //目前陣列的長度是1
a[5] = 50 ; //陣列長度變成6,沒有定義的index(1~4),會自動放入數字0


假設用直接賦值的方法,來定義局部變數,那GameMaker會顯示錯誤,而無法執行。這部分在說明書裡,並沒有特別註明,是我在設計程式時發現的。

個人覺得,這應該是GameMaker的設計疏失,明明全域變數可以用,但局部變數卻不行。或許哪天有可能會修正。

不能用此方法,來定義局部變數


如果我們想把陣列,定義成局部變數,目前只能透過array_create()的函式來創建,接著再透過其他的賦值方法,來定義陣列裡面的數值。

//建立一個長度0的陣列,再依照需求來進行賦值
var a = array_create(0) ;
a[0] = 100 ;
array_set( a , 1 , 50 ) ;


🔸for迴圈的應用


在for迴圈當中,我們會定義一個變數,來當作計時器,這個變數會遞增或遞減,因此很適合用來「檢索」陣列,以下是一些使用範例:

//讓陣列a[0]=1,a[1]=2...a[9]=10
for (var _i ; _i<= 9 ; _i ++) {
a[_i] = _i + 1 ;
}

//檢查陣列裡,是否有數字5,一發現到,就終止迴圈
//如果有發現,discover的數值會是true
for (var _i ; _i<= 9 ; _i ++) {
if (a[_i] == 5) {
discover = true ;
break ;
}
discover = false ;
}


二維陣列 2 Dimensional Array(2D Array)


基本的使用方法,在一維陣列的部分,都已經講解完畢,這邊只是稍微補充一下,關於二維陣列的定義,以下是範例:

//所謂的二維陣列,實際上就是在陣列裡面,又包了一個陣列
//這行陣列的設定,會跟下面六行的逐一設定相同,可以相互比較一下
a = [ [1 , 2 , 3] , [4 , 5 , 6] ] ;

//二維陣列的逐一設定
a[0][0] = 1 ;
a[0][1] = 2 ;
a[0][2] = 3 ;
a[1][0] = 4 ;
a[1][1] = 5 ;
a[1][2] = 6 ;


未來如果在實戰範例中,有使用到二維陣列,會再跟各位解釋,為什麼要在那個範例中,使用二維陣列。

至於三維,甚至是更高的維度,我自己是還沒使用過,未來如果有遇到,會再來講解。




🔔如果內容對你有幫助,可以按個喜歡,這樣就能讓更多人,接觸到這些棒棒的內容🔔


✨祝各位也能開心的做出好遊戲✨

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.