Links
Comment on page

18.循环的标签控制

滑梯游戏

Game
游戏的规则如下:
  • 游戏盘面包括 25 个方格,游戏目标是达到或者超过第 25 个方格;
  • 每一轮,你通过掷一个六面体骰子来确定你移动方块的步数,移动的路线由上图中横向的虚线所示;
  • 如果在某轮结束,你移动到了梯子的底部,可以顺着梯子爬上去;
  • 如果在某轮结束,你移动到了蛇的头部,你会顺着蛇的身体滑下去。
let finalSquare = 25
var board = [Int](repeating: 0, count: finalSquare + 1)
// 一些转折点
board[03] = +08;
board[06] = +11;
board[09] = +09;
board[10] = +02
board[14] = -10;
board[19] = -11;
board[22] = -02;
board[24] = -08
var square = 0
var diceRoll = 0
while square < finalSquare {
// 掷骰子
diceRoll += 1
if diceRoll == 7 { diceRoll = 1 }
// 根据点数移动
square += diceRoll
if square < board.count {
// 如果玩家还在棋盘上,顺着梯子爬上去或者顺着蛇滑下去
square += board[square]
}
}
print("Game over!")

滑梯变种-循环标签

增加一条规则:为了获胜,你必须刚好落在第 25 个方块中。
gameLoop: while square != finalSquare {
diceRoll += 1
if diceRoll == 7 { diceRoll = 1 }
switch square + diceRoll {
case finalSquare:
// 骰子数刚好使玩家移动到最终的方格里,游戏结束。
break gameLoop
case let newSquare where newSquare > finalSquare:
// 骰子数将会使玩家的移动超出最后的方格,那么这种移动是不合法的,玩家需要重新掷骰子
continue gameLoop
default:
// 合法移动,做正常的处理
square += diceRoll
square += board[square]
}
}
print("Game over!")
这种循环条件嵌套的场景下通过标签可以方便精确的进行控制
如果不使用标签的话,上面的break continue 只能控制switch

参考

SwiftGG