7.2 While 循環(huán)

While 循環(huán)

有時(shí)我們不知道自己想循環(huán)多少次,而是希望當(dāng)某個(gè)條件達(dá)成時(shí)或某個(gè)檢驗(yàn)失敗時(shí)完箩,退出循環(huán)赐俗。這個(gè)時(shí)候就要用while循環(huán)了。Swift 提供了兩種while循環(huán):

  • do-while循環(huán)嗜憔。用日常的語(yǔ)言解釋就是:反復(fù)做這件事秃励,直到那件事失敗了。do-while總是首先執(zhí)行一遍代碼區(qū)域中的代碼吉捶,然后執(zhí)行條件語(yǔ)句,如果條件語(yǔ)句為false就退出皆尔,否則循環(huán)呐舔。
  • while 循環(huán)。whiledo-while有所不同慷蠕,他會(huì)在執(zhí)行代碼區(qū)域前首先判斷條件語(yǔ)句珊拼,如果條件語(yǔ)句true那么才執(zhí)行代碼區(qū)域中的代碼,反復(fù)進(jìn)行這個(gè)過程流炕。

While

while循環(huán)的標(biāo)準(zhǔn)格式如下:

while 條件語(yǔ)句 {
  代碼區(qū)域
}

while循環(huán)首先執(zhí)行條件語(yǔ)句澎现,如果該語(yǔ)句執(zhí)行的結(jié)果是true才會(huì)執(zhí)行代碼區(qū)域中的代碼,當(dāng)代碼執(zhí)行結(jié)束每辟,回再次判斷條件語(yǔ)句剑辫,反復(fù)執(zhí)行該流程。與for循環(huán)一樣渠欺,條件語(yǔ)句必須返回一個(gè)布爾類型妹蔽,非truefalse
我們用小時(shí)候玩的一個(gè)蛇形棋的游戲來(lái)介紹while循環(huán)挠将。蛇形棋有很多版本胳岂,我們現(xiàn)在玩一個(gè)最簡(jiǎn)單的版本。棋盤是5x5見方的舔稀,我們從棋盤的左下角開始乳丰,按照蛇形的順序,在格子里填上數(shù)字内贮,從1填到25产园。格子上除了有數(shù)字,還可能有梯子贺归。梯子連接了兩個(gè)格子淆两,并且梯子只能沿固定的方向爬。例如我們可以在第3號(hào)格子與第11號(hào)格子建搭建一個(gè)梯子拂酣,要求只能從3爬到11秋冰,而不能從11爬回來(lái)。現(xiàn)在我們就可以玩了婶熬。玩法如下:

  1. 游戲開始時(shí)剑勾,你把一個(gè)代表你的塑料小人放在1號(hào)格子左側(cè)的桌面上埃撵,這是0號(hào)格子的位置;
  2. 如果你站在25號(hào)格子虽另,或者除了0號(hào)格子以外的棋盤外暂刘,你就勝利了,否則執(zhí)行后面的步驟捂刺;
  3. 現(xiàn)在你擲骰子來(lái)獲取一個(gè)[1,6]之間的數(shù)字谣拣;
  4. 你沿著棋盤上數(shù)字增大的方向前進(jìn)該數(shù)字個(gè)格子,例如你現(xiàn)在在0號(hào)格子族展,擲骰子的數(shù)字是6森缠,那么就前進(jìn)6步,停在6號(hào)格子上仪缸;如果現(xiàn)在在24號(hào)格子贵涵,前進(jìn)6步,就停在30號(hào)格子上恰画,即使這個(gè)格子在棋盤之外宾茂。
  5. 如果還在棋盤上,看看腳下有沒有梯子拴还,如果有跨晴,就沿著他爬到連接的格子;
  6. 重復(fù)執(zhí)行第2步自沧。

我們用 Swift 模擬一下這個(gè)游戲坟奥。在此之前,我們先改變一下擲骰子的方式拇厢。每次擲骰子不是隨機(jī)的數(shù)字爱谁,而是當(dāng)前的進(jìn)行的回合數(shù)對(duì)6的余數(shù)加1,這樣可以保證每次的骰子數(shù)都是[1,6]中的一個(gè)孝偎,但不是隨機(jī)的访敌。
我們用數(shù)組表示這個(gè)棋盤,數(shù)組一共有26個(gè)元素衣盾,其中0號(hào)格子在棋盤外面嗡综,而[1,25]都在棋盤上巨双。數(shù)組元素都初始化為0盆赤。

let finalSquare = 25
var board = Int[](count: finalSquare + 1, repeatedValue: 0)

放置了梯子的格子對(duì)應(yīng)的元素值設(shè)置為沿該梯子攀爬時(shí)你需要前進(jìn)或后退的格數(shù)(后退用負(fù)數(shù)表示)从隆。
現(xiàn)在我們?cè)谶@條蛇身上放置一些梯子。首先從3放一個(gè)到11的梯子果复,這意味著當(dāng)你的塑料小人站在第3號(hào)格子時(shí)陈莽,會(huì)爬到11號(hào)格子,也就是前進(jìn)8步,所以給board[3]賦值為8:

board[3] = 8

然后再放置這些梯子:6->17走搁,9->18独柑,10->12,14->4私植,19->7忌栅,22->20,24->16

board[6] = 11
board[9] = 9
board[10] = 2
board[14] = -10
board[19] = -11
board[22] = -2
board[24] = -9

這樣我們用數(shù)組的下標(biāo)表示格子的編號(hào)曲稼,用數(shù)組元素的值表示梯子指向的格子∷餍鳎現(xiàn)在可以開始玩了:

var square = 0
var turns = 0
while square < finalSquare {
  // 擲骰子
  var diceRoll = turns % 6 + 1
  // 前進(jìn)骰子數(shù)個(gè)格子
  square += diceRoll
  if square < board.count {
    // 如果我們還在棋盤上,沿著梯子爬吧躯肌!
    square += board[square]
  }
  // 回合數(shù)增加1
  ++turns
}
println("You win after \(turns + 1) turns")

這段代碼會(huì)輸出

You win after 11 turns

Do-While

do-whilewhile不同者春,他總是先執(zhí)行一段代碼然后才判斷條件的合法性。
我們用do-while來(lái)玩蛇形棋的游戲

let finalSquare = 25
var board = Int[](count: finalSquare + 1, repeatedValue: 0)
board[3] = 8
board[6] = 11
board[9] = 9
board[10] = 2
board[14] = -10
board[19] = -11
board[22] = -2
board[24] = -9

var square = 0
var turns = 0
do {
  // 爬梯子
  square += board[square]
  // 擲骰子
  var diceRoll = turns % 6 + 1
  // 前進(jìn)骰子數(shù)個(gè)格子清女,在這種寫法中
  square += diceRoll
  // 回合數(shù)增加1
  ++turns
} while square < finalSquare
println("You win after \(turns + 1) turns")

這次我們簡(jiǎn)單修改了一下游戲的流程:

  1. 游戲開始時(shí),你把一個(gè)代表你的塑料小人放在1號(hào)格子左側(cè)的桌面上晰筛,這是0號(hào)格子的位置嫡丙;
  2. 現(xiàn)在檢查你腳下有沒有梯子,如果有梯子读第,就沿著他爬到連接的格子曙博;
  3. 然后擲骰子,獲取[1,6]之間的一個(gè)數(shù)字怜瞒;
  4. 沿著棋盤上數(shù)字增大的方向前進(jìn)該數(shù)字個(gè)格子父泳,例如你現(xiàn)在在0號(hào)格子,擲骰子的數(shù)字是6吴汪,那么就前進(jìn)6步惠窄,停在6號(hào)格子上;如果現(xiàn)在在24號(hào)格子漾橙,前進(jìn)6步杆融,就停在30號(hào)格子上,即使這個(gè)格子在棋盤之外霜运。
  5. 如果你站在第25號(hào)格子或棋盤外脾歇,你就勝利了,否則重復(fù)執(zhí)行第2步淘捡。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末藕各,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子焦除,更是在濱河造成了極大的恐慌激况,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異誉碴,居然都是意外死亡宦棺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門黔帕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)代咸,“玉大人,你說我怎么就攤上這事成黄∧沤妫” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵奋岁,是天一觀的道長(zhǎng)思瘟。 經(jīng)常有香客問我,道長(zhǎng)闻伶,這世上最難降的妖魔是什么滨攻? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮蓝翰,結(jié)果婚禮上光绕,老公的妹妹穿的比我還像新娘。我一直安慰自己畜份,他們只是感情好诞帐,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著爆雹,像睡著了一般停蕉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钙态,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天慧起,我揣著相機(jī)與錄音,去河邊找鬼驯绎。 笑死完慧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的剩失。 我是一名探鬼主播屈尼,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拴孤!你這毒婦竟也來(lái)了脾歧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤演熟,失蹤者是張志新(化名)和其女友劉穎鞭执,沒想到半個(gè)月后司顿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兄纺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年大溜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片估脆。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钦奋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疙赠,到底是詐尸還是另有隱情付材,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布圃阳,位于F島的核電站厌衔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏捍岳。R本人自食惡果不足惜富寿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锣夹。 院中可真熱鬧作喘,春花似錦、人聲如沸晕城。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)砖顷。三九已至,卻和暖如春赃梧,著一層夾襖步出監(jiān)牢的瞬間滤蝠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工授嘀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留物咳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓蹄皱,卻偏偏與公主長(zhǎng)得像览闰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子巷折,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Swift 提供了類似 C 語(yǔ)言的流程控制結(jié)構(gòu)压鉴,包括可以多次執(zhí)行任務(wù)的for和while循環(huán),基于特定條件選擇執(zhí)行...
    窮人家的孩紙閱讀 693評(píng)論 1 1
  • [The Swift Programming Language 中文版]本頁(yè)包含內(nèi)容: Swift提供了多種流程控...
    風(fēng)林山火閱讀 559評(píng)論 0 0
  • Swift提供了多種控制流聲明锻拘。包括while循環(huán)來(lái)多次執(zhí)行一個(gè)任務(wù)油吭;if击蹲,guard和switch聲明來(lái)根據(jù)確定...
    BoomLee閱讀 1,939評(píng)論 0 3
  • 快遞太多,快遞盒子無(wú)處安放婉宰?今天小編就教你如何變廢為寶歌豺,簡(jiǎn)單實(shí)用,趕緊動(dòng)手心包,跟著小編動(dòng)起來(lái)吧类咧! 1、拿出一個(gè)快遞盒...
    爸比親子課閱讀 642評(píng)論 0 0
  • 給家人: 親愛的谴咸,今天是端午節(jié)最后一天了轮听,雖然離家的距離不近,路上我們要窩在汽車上長(zhǎng)達(dá)5個(gè)小時(shí)岭佳,但是和青山綠水比較...
    日出東方天剛曉閱讀 193評(píng)論 0 2