GameMaker|Array 陣列|程式基礎

更新於 2024/08/28閱讀時間約 9 分鐘

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

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

raw-image


前置知識


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


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 ;


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

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




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


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

免費、開心、簡單,這是我做教學的理念,我希望透過我的行動,讓人們找回自我學習的快樂,讓那些資源稀少的自學者們,也能朝著自己的夢想來前進。讓我們一起開心的做出遊戲吧!
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
這篇內容,將會講解什麼是「repeat迴圈」,以及與「repeat迴圈」相關的知識。包括repeat迴圈的簡介、break、continue。
這篇內容,將會講解什麼是「do until」,以及與「do until」相關的知識。包括do until的簡介、break、continue。
這篇內容,將會講解什麼是「while迴圈」,以及與「while迴圈」相關的知識。包括while迴圈的簡介、while迴圈、break、continue。
這篇內容,將會講解什麼是「for迴圈」,以及與「for迴圈」相關的知識。包括for迴圈的簡介、for迴圈、break、continue。
這篇內容,將會講解什麼是「switch」,以及與「switch」相關的知識。包括switch的簡介、switch、break。
這篇內容,將會講解什麼是「if else」,以及與「if else」相關的知識。包括if else的簡介、if、if else、else if、套娃式的if。
這篇內容,將會講解什麼是「repeat迴圈」,以及與「repeat迴圈」相關的知識。包括repeat迴圈的簡介、break、continue。
這篇內容,將會講解什麼是「do until」,以及與「do until」相關的知識。包括do until的簡介、break、continue。
這篇內容,將會講解什麼是「while迴圈」,以及與「while迴圈」相關的知識。包括while迴圈的簡介、while迴圈、break、continue。
這篇內容,將會講解什麼是「for迴圈」,以及與「for迴圈」相關的知識。包括for迴圈的簡介、for迴圈、break、continue。
這篇內容,將會講解什麼是「switch」,以及與「switch」相關的知識。包括switch的簡介、switch、break。
這篇內容,將會講解什麼是「if else」,以及與「if else」相關的知識。包括if else的簡介、if、if else、else if、套娃式的if。
你可能也想看
Google News 追蹤
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
這篇文章介紹了網站的整體架構以及開發時所使用的工具和套件,包括 Next.js、Tailwind CSS 和 socket.io 等。文章回顧了程式碼的重構與優化,幫助開發者提高工作效率,適合希望深入瞭解前端開發和網站架構的讀者。
Thumbnail
【這個系列,目標是以比較輕鬆的方式讓大家一起學習AE表達式。】 本文是番外篇 3,主要是一些概念的補充,介紹陣列。
※ 好用的陣列迭代器:forEach forEach 的使用時機: 需要從頭到尾把陣列中的每一個元素都印出來 ,就適合使用 forEach 方法。 forEach 的必要參數是一個函式: forEach() 的功能是把陣列的每個元素都丟進某個函式執行一次,因此必要的參數是一個函式。 語法:
Thumbnail
完成了Debug.log()的測試,接著還是要跟各位簡單講一下C#的一些規則,之後看程式會(比較)看得懂。 又講到變數? 在Unity中,變數是重要的工具,用來儲存和管理資料。讓開發者能夠靈活調整遊戲的行為和性能,減少代碼的重複性,使得遊戲開發更加高效和簡潔。透過使用變數,開發者可以輕鬆修改資料
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
分享在網路上看到的陣列題目。通常 for...of 的 value 是陣列中的每個值,那如果我們在迭代中對陣列操作會發生什麼事? 題目來源:https://x.com/_jayphelps/status/1774640511158022335?s=20
Thumbnail
題目會給定一個陣列nums和一個目標值goal。計算子陣列總和=goal的數目有多少。演算法包含前綴和和字典的技巧,時間複雜度為O(n),空間複雜度為O(n)。
Thumbnail
題目敘述 題目會給定我們兩個整數陣列作為輸入nums1, nums2,要求我們找出兩個陣列的差異值。 找出在nums1但是不在nums2的元素,以陣列的形式放在answer[0]輸出。 找出在nums2但是不在nums1的元素,以陣列的形式放在answer[1]輸出。 題目的原文敘述
Thumbnail
題目敘述 題目給定我們一個輸入陣列nums 要求我們以正、負交叉排列的方式重組陣列,並且必須保持原本的相對順序。 並且以陣列的形式輸出返回答案。 例[5, 1, -2, -3] 重排後為 [5, -2, 1, -3] 題目的原文敘述 測試範例 Example 1: Input:
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
這篇文章介紹了網站的整體架構以及開發時所使用的工具和套件,包括 Next.js、Tailwind CSS 和 socket.io 等。文章回顧了程式碼的重構與優化,幫助開發者提高工作效率,適合希望深入瞭解前端開發和網站架構的讀者。
Thumbnail
【這個系列,目標是以比較輕鬆的方式讓大家一起學習AE表達式。】 本文是番外篇 3,主要是一些概念的補充,介紹陣列。
※ 好用的陣列迭代器:forEach forEach 的使用時機: 需要從頭到尾把陣列中的每一個元素都印出來 ,就適合使用 forEach 方法。 forEach 的必要參數是一個函式: forEach() 的功能是把陣列的每個元素都丟進某個函式執行一次,因此必要的參數是一個函式。 語法:
Thumbnail
完成了Debug.log()的測試,接著還是要跟各位簡單講一下C#的一些規則,之後看程式會(比較)看得懂。 又講到變數? 在Unity中,變數是重要的工具,用來儲存和管理資料。讓開發者能夠靈活調整遊戲的行為和性能,減少代碼的重複性,使得遊戲開發更加高效和簡潔。透過使用變數,開發者可以輕鬆修改資料
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
分享在網路上看到的陣列題目。通常 for...of 的 value 是陣列中的每個值,那如果我們在迭代中對陣列操作會發生什麼事? 題目來源:https://x.com/_jayphelps/status/1774640511158022335?s=20
Thumbnail
題目會給定一個陣列nums和一個目標值goal。計算子陣列總和=goal的數目有多少。演算法包含前綴和和字典的技巧,時間複雜度為O(n),空間複雜度為O(n)。
Thumbnail
題目敘述 題目會給定我們兩個整數陣列作為輸入nums1, nums2,要求我們找出兩個陣列的差異值。 找出在nums1但是不在nums2的元素,以陣列的形式放在answer[0]輸出。 找出在nums2但是不在nums1的元素,以陣列的形式放在answer[1]輸出。 題目的原文敘述
Thumbnail
題目敘述 題目給定我們一個輸入陣列nums 要求我們以正、負交叉排列的方式重組陣列,並且必須保持原本的相對順序。 並且以陣列的形式輸出返回答案。 例[5, 1, -2, -3] 重排後為 [5, -2, 1, -3] 題目的原文敘述 測試範例 Example 1: Input: