資料的集合
本週的教學影片檔:請點我
本週的初始程式碼:請點我
課程進行至此,我們已經學會了以下這些概念:
- 程式是由資料與指令構成的。
- 資料:由物件組成整個程式的資料架構,用於指令上與電腦互動,物件導向程式設計下的物件有封裝、繼承等特徵。
- 指令:藉由迴圈或條件語句,批量處理基礎的指令,組合成複雜的控制流,達成程式的目標功能。
請打開本週的初始程式碼,這將是最後一週在模擬器上進行的課程,我們的專案已經擴展到擁有 300 行程式碼的程度,大家將會在這個程式碼中見到許多還沒教過的語法,例如extension
、for-in-stride
迴圈、Array
等等,以及全新增加的class
:世界
,感謝物件導向程式設計的封裝特性,目前我們還不用真正的去了解整個程式碼的意義,只要知道以下指令的用途就好了:
- 世界可以藉由
世界(長度: , 寬度:)
指令創建出來,之後其成為一個長x寬的,近似於棋盤的方塊集合。 - 世界擁有一個指令:
截圖()
,可以列印出此世界目前的狀態。 - 角色擁有一個新指令:
加入(世界: , 位置:)
,可以加入到一個已創建好的世界,並位於指定座標上。 - 角色的
前進()
只會在已經加入了一個世界時運作,並且會檢查是否成功的移動到一個鄰近的方塊上。
運行範例程式碼將會看到下圖的結果,機器人從( 1 , 1 )
一路往北走,最後卡在( 1 , 5 )
無法繼續往北前進。
我從座標( 1 , 1 )前進到了座標( 1 , 2 ) 我從座標( 1 , 2 )前進到了座標( 1 , 3 ) 我從座標( 1 , 3 )前進到了座標( 1 , 4 ) 我從座標( 1 , 4 )前進到了座標( 1 , 5 ) 我試圖從座標( 1 , 5 )前進到座標( 1 , 6 ),但這個位置沒有方塊。 我試圖從座標( 1 , 5 )前進到座標( 1 , 6 ),但這個位置沒有方塊。
這個程式碼模擬了一個非常基礎的2D世界
,這個世界擁有一格一格的方塊,而機器人可以在方塊上移動。目前的架構中,具體的資料結構如下:每一個方塊對應一個整數,如果值是-1
,則視為虛無地帶,角色無法移動到其上;如果值是0
或正整數,則畫出方塊和該數字,例如,0
代表一般的區域,1
或許代表有寶物的區域,2
可以代表有怪物的區域...
在這樣的設計下,我們或許可以從這個基礎上設計出一個RPG遊戲,不過在這之前,不妨先想想:這樣的資料架構怎麼配合指令具體做出來呢?這些方塊的型態是什麼,如何構成的?
- 每個方塊是一個變數或結構,並且在
截圖()
時會依序畫在該有的座標上,因此他至少要有一個x
和y
。 - 機器人移動時,要查找座標在
(x,y)
的方塊是否大於等於0
,決定是否移動上去,因此還要有一個值
。
或許聰明的你會快速地基於這兩個重點,設計出一個struct
或class
架構...
struct 方塊 { var x:Int var y:Int var 值:Int }
接著怎麼辦呢?難道像範例程式碼這樣的世界,我們得去這樣創造嗎?
var 方塊1-0 = 方塊(x:1, y:0, 值:-1) var 方塊1-1 = 方塊(x:1, y:1, 值:0) var 方塊1-2 = 方塊(x:1, y:2, 值:1) var 方塊1-3 = 方塊(x:1, y:3, 值:1) ...
果然,在一個100x100
的世界
,我們得寫10,000
行這樣的程式碼,根本是毫無效率的行為,一定有什麼方法可以快速處理!
我們已經學習用迴圈來縮減大量的指令,本週是進入真正開發專案前的最後一步:如何縮減、包裝大量的資料,完成了這個課程後,我們即將真正的打開MacBook,撰寫在手機上運行的程式了!