13.%d 此 Playgrounds,非彼 playground

春麗 S.T.E.M.
8 min readAug 8, 2021

--

目錄

⦿ Playgrounds
⦿ 遊戲
⦿ Keep going
⦿ world.place

Playgrounds

自 Swift 面世以來,蘋果官方致力於將這個程式語言介紹給它的農奴 ( ? ),其中,playgrounds 就是以遊戲的方式騙人誤入歧途。

在使用 Xcode 時,如果要測試程式碼是否 works fine,無論是 C、Object-C,或是 Swift,只需要打開一個 playground 測試即可。

而 playground 裡有分頁功能,如果你在思考上述三種程式語言若不可以擺在同一個檔案裡,那可不可以在同一個 playground 檔案裡以三個分頁分別來寫,通常是不需要太多檔案去切分,就像在 Xcode 裡,Swift 也可以調用 objc 的 function,這屬題外話。

在 playground 中,鍵入如下:

// Define a function that adds two integers together
func plusTwoNumbers(num1: Int, num2: Int) -> Int {
return number1 + number2
}

// Call the function
let sum = plusTwoNumbers(num: 3, num2: 5)

// Print the result
print(sum) // Output: 8

我們可以在 debug area 裡看到輸出的結果。不過,上面說的 playground 跟 Playgrounds 是不同的東西,playground 我們已經很熟了。

而 Playgrounds,一個遊戲,設計上像電子書,透過電子書的互動學習程式設計,用遊戲的方式帶你進入程式語言的世界,一邊寫程式,一邊又能看到真實的輸出結果,是學習程式一個不錯的方式。

繼續閱讀|回目錄

遊戲

不,前面一段其實是違心之論,玩遊戲不用找藉口,如果遊戲不夠好玩的話,還是不會吸引人去玩,下面是遊戲介面單元的展示:

第一個單元是一個解謎遊戲,遊戲中排除各種障礙去達到目的,關卡中以格狀佈署行經流程,每一格代表一步。

站在關掉的開關上就要打開開關,格子裡有寶石就收集,而使用函式,可以將指令組合在一起,如下:

// Define the character's starting position
var characterPosition = (x: 0, y: 0)

// Define a function to move the character
func moveCharacter(direction: String) {
switch direction {
case "up":
characterPosition.y -= 1
case "down":
characterPosition.y += 1
case "left":
characterPosition.x -= 1
case "right":
characterPosition.x += 1
default:
break
}
}

// Move the character
moveCharacter(direction: "right")
moveCharacter(direction: "down")

// Print the character's position
print(characterPosition) // Output: (x: 1, y: 1)

我們在笛卡兒座標系(平面直角座標系)中,定義 x 軸與 y 軸,便能夠定義物體在軸上四象限移動時,距離原點的相對位置。

在 iOS 中,x、y 的正方向分別為,所以才會有上面那種輸入方向造成 x 與 y 步數加一的結果。關於 iOS 的方向,可以參考另篇文章的段落。

不過在 Playgrounds 裡就可不必按照 iOS APP 的編寫方向,我們可用平時的習慣方向來編寫程式,當步數的函式寫好了,要怎麼讓路一直走下去,例如以北方(上方)為目標,如下:

// Define the character's position and direction
var characterPosition = (x: 0, y: 0)
var direction = "north"

// Define a function to move the character
func keepGoing() {
switch direction {
case "north":
characterPosition.y += 1
case "east":
characterPosition.x += 1
case "south":
characterPosition.y -= 1
case "west":
characterPosition.x -= 1
default:
break
}
}

// Define a function to turn the character right
func turn() {
switch direction {
case "north":
direction = "east"
case "east":
direction = "south"
case "south":
direction = "west"
case "west":
direction = "north"
default:
break
}
}

// Simulate the character taking 20 steps
for _ in 1...20 {
// Try to move the character
keepGoing()

// You need to check whether the character encountered an obstacle
let encounteredObstacle = false

if encounteredObstacle {
turn()
keepGoing()
}
}

// Print the character's final position
print(characterPosition)

同樣地,角色原點設為(0, 0),第一個函式定義了要走的方向,如果是北方(上方)為 Y 正方向;如果是東方(右方)為 X 正方向。

第二個函式定義了轉向,如果朝北走,會希望遇到障礙物時右轉(轉向東),接著繼續直走。

我們以迴圈來做到動作數,注意!動作數未必是你的步數,除非一路暢通,我們就可一路朝北,在真實世界裡,我們遇到障礙物時需要檢查轉向,接著直走再轉向,再直走⋯⋯,該停的時候停,該動的時候動。

繼續閱讀|回目錄

Keep going

在前段只是提供思考的方向,並非真實的程式碼,如果只是照抄答案可能不會得到一百分。

當然,這個程式遊戲一直玩下去也是會疲乏,但你可以試著在遊戲中找樂趣,如下:

下面,第二單元標題的展示:

在這個單元裡,透過生成實體,還加上一些新的動作,像是開鎖建立傳送門,讓平台上升下降

第一單元的走路,每走一步步數加一,走路是一個動作,這些新的動作也是動作,攤開來看,這些動作也可以叫做步數(pace),分解動作如下:

向前走一步、右轉、向前走一步、向前走一步、向左轉、開鎖、向前走一步、建立傳送門、向前走一步

這樣九個動作,也可以叫做走九步。

繼續閱讀|回目錄

world.place

在其後的單元裡,world.place 表示在這個 3D 世界裡放置各種物件(實體),無論是角色、寶石⋯⋯等,你可以產生如下的效果:

因為遊戲的音樂單調些,所以最後就關掉了,

第三個單元:

第三單元一開始,介紹了一個透過碰觸畫圖的程式語法,在 Xcode 中,我們研究過貝茲曲線,這裡雖然做到更複雜的動作,但背後的原理也離不開物件導向及畫圖、作圖。

以一個遊戲來說,還是小朋友來測試最準確,如果連小朋友都吸引不了,就算自己說遊戲設計具巧思,也是曲高和寡的藝術作品。

但我還是希望大家心中都住著一個小朋友的,跟 Swift 有關的遊戲程式展開如下:

這次就分享到這,感謝您的閱讀。

繼續閱讀|回目錄

--

--

春麗 S.T.E.M.
春麗 S.T.E.M.

Written by 春麗 S.T.E.M.

Do not go gentle into that good night, Old age should burn and rave at close of day; Rage, rage, against the dying of the light.

No responses yet