創造世界
World Creation
Last updated
World Creation
Last updated
上面是一個空白的 12 x 12 的世界,下面的程式碼會放一個 Actor 在原點,並讓他向東走、繞 S 形走完全世界。
// GridWorld
let theWorld = world
// 新增角色放到(0,0)、面向東方
let actor = Actor(0,0)
// 判斷角色是否已經走到世界盡頭
var isOver = false
// 當角色還沒到世界盡頭,就繼續走
while !isOver {
actor.navigate(onMove: {
// 往前一步要做的動作放這裡
}) {
// onExit:
// 到世界盡頭要做的動作放這裡
isOver = true
actor.danceLikeNoOneIsWatching()
}
}
extension Actor {
// 新增角色放到 (x,y)、預設面向東方。
convenience init(_ x: Int, _ y: Int, facing dir: Direction = .east){
self.init()
theWorld.place(self, facing: dir, at: Coordinate(column: x, row: y))
}
typealias Handler = () -> Void
// 讓角色從原點向東「走 S 形的路線」到達終點。
func navigate(onMove:Handler, onExit:Handler) {
if !isBlocked { // 如果前面沒擋住,就往前走
moveForward()
onMove()
} else { // 否則就轉彎
// 先判斷要往哪邊轉、轉彎時要做什麼動作
let turn = heading == .east ? turnLeft : turnRight // 向東走時轉左邊,否則轉右邊
let act = heading == .east ? turnUp : headScratch // 向東走時裝興奮,否則抓抓頭
turn() // 轉彎
if !isBlocked { // 如果還沒到世界盡頭,就往前走再轉彎
act()
moveForward()
onMove()
turn()
} else { // 不然就是已經到了盡頭,就做到了盡頭該做的事。
onExit()
}
}//end: if
}//end: naviagate()
}