450 字
2 分钟
循环的标签控制
滑梯游戏

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