iOS Apprentice中文版-從0開始學(xué)iOS開發(fā)-第六課

計(jì)算玩家的分?jǐn)?shù)

現(xiàn)在你已經(jīng)實(shí)現(xiàn)了生成一個(gè)隨機(jī)數(shù)作為目標(biāo)闻牡,以及讀取滑條的值拄氯,現(xiàn)在你應(yīng)該來計(jì)算玩家的得分了啄育。

玩家將滑條的位置拖到離目標(biāo)值越近的位置该窗,就應(yīng)該得越高的分弟蚀,越偏離目標(biāo)則的分應(yīng)越低。

計(jì)算每一回合的分值酗失,你需要觀察滑條的值與目標(biāo)值之間的差值(也就是它們在數(shù)軸上的距離)相差多少义钉。

計(jì)算滑條位置和目標(biāo)值的差

一個(gè)簡單的方法是對滑條的值和目標(biāo)值進(jìn)行相減的運(yùn)算。

不幸的是规肴,這樣可能會得到一個(gè)負(fù)值當(dāng)滑條位置的值小于目標(biāo)值時(shí)捶闸。

你需要一些方法將這些可能出現(xiàn)的負(fù)值轉(zhuǎn)換為正值夜畴,或者直接將負(fù)值加到用戶的總分里去,介于后者會導(dǎo)致玩家秒刪app删壮,所以我們還是來完成這個(gè)轉(zhuǎn)換吧斩启。

只是用滑條的值(currentValue)減去目標(biāo)值(targetValue)的話,是解決不了這個(gè)問題的醉锅,因?yàn)閠argetValue總是有比currentValue大的時(shí)候兔簇。

嗯~看來我們遇到點(diǎn)麻煩了

練習(xí):如果我要求你解決這個(gè)問題,僅僅是用語言描述不需要寫代碼硬耍,你會提出什么樣的方案呢垄琐?不要擔(dān)心電腦能不能聽懂你說的話,就用口語描述吧经柴,你現(xiàn)在是說給我聽狸窘。

如果是我的話,我會這樣做:
1坯认、如果滑條的值大于目標(biāo)值翻擒,這時(shí)就用滑條的值減去目標(biāo)值。
2牛哺、如果滑條的值小于目標(biāo)值陋气,這時(shí)就用目標(biāo)值減去滑條的值。
3引润、如果兩者相等巩趁,那么差值就為0。

這樣做就不會有負(fù)數(shù)了淳附,因?yàn)楸粶p數(shù)總是大于等于減數(shù)议慰。

來算一算:

如果滑條位置的值是60并且目標(biāo)值是40,那么60-40=20.

如果滑條位置的值是10并且目標(biāo)值是30奴曙,那么30-10同樣等于20.

算法:

剛才你想出的這種東西就叫做算法别凹,算法就是關(guān)于一種解決一系列計(jì)算問題的機(jī)械步驟的術(shù)語。雖然我們剛才的算法極其簡單洽糟,但是這是屬于你在這方面踏出的第一步炉菲。

目前世界上有許多著名的算法,比如快速排序(quicksort)用于將一些列內(nèi)容進(jìn)行排序脊框,還有二進(jìn)制搜索(binary search)用于將搜索這種已經(jīng)排序好的列表颁督。你可以在自己的程序中直接使用這些其他人已經(jīng)發(fā)明好的算法,以便節(jié)省大量自己的腦細(xì)胞浇雹。

然而沉御,在我們這個(gè)游戲app中恐怕你得自己想出一些算法了。其中既有像剛才那樣簡單的昭灵,也有相當(dāng)困難使你絕望的吠裆。不過不用擔(dān)心伐谈,這正是編程的樂趣所在。

計(jì)算機(jī)的學(xué)術(shù)領(lǐng)域主要就是學(xué)習(xí)算法并且簡化它們试疙。

你可以用自己的口語描述任何算法诵棵,它們僅僅是你執(zhí)行某些運(yùn)算的一系列步驟。就像你用手在紙上計(jì)算什么是一樣的祝旷,就像上面我們算60-40一樣履澳。但是有些復(fù)雜的算法用手永遠(yuǎn)也算不完,所以某些情況下你需要把它們寫成代碼怀跛,讓計(jì)算機(jī)去算距贷。

我的建議是:如果你不知道如何讓你的程序去計(jì)算,你可以先拿一張紙吻谋,在紙上寫出計(jì)算的步驟忠蝗,口語化的寫就可以,先把電腦放在一邊不要管漓拾。然后想一想這些步驟阁最,用手算的話應(yīng)該怎么去做?

一旦你適應(yīng)了這種思路骇两,那么你在程序中為自己寫一個(gè)算法就是小菜一碟了速种。

你可以能會有多種方法解決我們剛才的問題,我在這里會給你展示兩種脯颜,但是這次讓我們用代碼來表示它們:

var difference: Int
if currentValue > targetValue {
difference = currentValue - targetValue
} else if targetValue > currentValue {
difference  = targetValue - currentValue
} else {
difference  = 0
}

"if"結(jié)構(gòu)是一個(gè)新出現(xiàn)的東西哟旗。它允許你的代碼做出選擇,其意思和英語中的if基本相同栋操。大體上講,它的模式如下:

if something is true {
then do this
} else if something else is true {
then do that instead
} else {
do something when neither of above are true
}

if關(guān)鍵字后面跟的就是所謂的邏輯條件饱亮。如果這個(gè)條件被判斷為真矾芙,例如currentValue大于targetValue,那么在兩個(gè)花括號之間的代碼就會被執(zhí)行近上。

然而剔宪,如果這個(gè)條件不是真的,那么電腦就會去看else if的條件是不是為真壹无。也許這里會有多個(gè)else if葱绒,那么電腦就會從上到下的逐一的去判斷每個(gè)else if的條件,直到遇到一個(gè)條件為真的為止。

如果所有的條件都是假的,那么最后一個(gè)else括號中的代碼會被執(zhí)行描睦。

在這個(gè)簡單的算法中孵淘,你首次創(chuàng)建了一個(gè)名為difference的局部變量用于存儲計(jì)算結(jié)果。這個(gè)值只能是正整數(shù)或者0幌氮,所以它應(yīng)該是Int(整數(shù))型的:

var difference: Int

然后你對currentValue和targetValue進(jìn)行減法運(yùn)算剪廉。首先你決定currentValue大于targetValue的情況:

if currentValue > targetValue {

‘>’這個(gè)左開口的三角表示大于操作符质帅。如果currentValue變量中的值確實(shí)大于targetVlaue變量中的值烈疚,那么currentValue > targetValue這個(gè)條件就被判定為真黔牵,那么下面這行代碼就會被執(zhí)行:

difference = currentValue - targetValue

這里你用較大的currentValue減去較小的targetValue并且把差值存儲到變量difference中。

注意一下我是如何選擇變量名稱的爷肝,盡量選擇那些能夠清晰描述這個(gè)變量作用的詞語猾浦。你經(jīng)常會見到以下這種代碼:

a = b - c

這看上去完全不知道它的意圖,除了能看出是在做減法以外灯抛。從變量a金赦、b、c的名稱上得不到任何線索表明它們的作用牧愁。

回到我們的Swift語句素邪。如果currentValue小于或等于targetValue,那么上面的條件就為假了并且程序會跳過條件后面花括號內(nèi)的代碼猪半,進(jìn)入到下一個(gè)條件判斷:

} else if targetValue > currentValue {

這里發(fā)生的事情和之前一樣兔朦,除了targetValue和currentValue的位置調(diào)換了。只有當(dāng)targetValue的值大于currentValue的值時(shí)磨确,電腦才執(zhí)行后面花括號內(nèi)的代碼:

difference = targetValue - currentValue

這一次你用targetValue減去currentValue并且將結(jié)果存儲到difference變量中沽甥。

到現(xiàn)在為止只剩一種情況你沒有處理了,就是targetValue和currentValue相等的時(shí)候乏奥。當(dāng)玩家正好將滑條拖到等于目標(biāo)值當(dāng)位置的時(shí)候摆舟,就會出現(xiàn)這種情況,完美的得分邓了。在這種情況下difference的值為0恨诱。

} else {
difference = 0
}

此時(shí),這兩個(gè)數(shù)誰也不比誰大骗炉,誰也不比誰小照宝,只給你留個(gè)一個(gè)選擇,它們一定相等句葵。

讓我們把這個(gè)算法放到動作里去厕鹃。在showAlert()的頂部添加如下代碼:

@IBAction func showAlert() {
        var difference: Int
        if currentValue > targetValue {
            difference = currentValue - targetValue
        } else if targetValue > currentValue {
            difference = targetValue - currentValue
        } else {
            difference = 0
        }
        
        let message = "The value of the slider is: \(currentValue)" + "\nThe traget value is: \(targetValue)" + "\nThe difference is:\(difference)"
        . . .
    }

為了觀察這個(gè)算法的效果,你將difference的值顯示在提醒窗口的消息里乍丈。

運(yùn)行app并且觀察一下:

提醒窗口顯示difference的值

另一種計(jì)算difference的方法

我之前提到過剂碴,這里有其他的方法計(jì)算currentValue和targetValue的差值,并且保證其結(jié)果為正數(shù)轻专。剛才的算法雖然工作的不錯(cuò)忆矛,但是它有好幾行代碼。我想我們應(yīng)該用一些簡單的方法铭若,減少幾行代碼洪碳。

新的算法思路如下:

1递览、用滑條的值減去目標(biāo)值(currentValue - targetValue)

2、如果結(jié)果是負(fù)數(shù)瞳腌,那么就讓它乘以-1绞铃,這樣把它變成正數(shù)。

你不在費(fèi)勁避免出現(xiàn)負(fù)數(shù)了嫂侍,只是當(dāng)電腦計(jì)算出負(fù)數(shù)的時(shí)候儿捧,你就將它轉(zhuǎn)換為正數(shù)。

練習(xí):自己改造一下代碼實(shí)現(xiàn)這個(gè)目的挑宠。線索:剛才我們的思路中包含了“如果”和“那么”這兩個(gè)詞菲盾,這是一個(gè)相當(dāng)不錯(cuò)的指示,你應(yīng)該在代碼里使用if語句各淀。

你應(yīng)該會得到類似下面的語句:

var difference = currentValue - targetValue
if difference < 0 {
difference = difference * -1
}

這就是將新的算法簡潔了當(dāng)?shù)姆g為代碼的結(jié)果懒鉴。

首先你對這兩個(gè)數(shù)進(jìn)行相減,然后將結(jié)果存儲到difference變量里碎浇。當(dāng)difference小于0時(shí)临谱,乘以-1,將它轉(zhuǎn)換為正數(shù)奴璃。

注意一下悉默,你在一行代碼里完成了創(chuàng)建difference變量并且將一個(gè)結(jié)算結(jié)果分配給它。完全不需要把它們寫成兩行苟穆,比如:

var difference: Int
difference = currentValue - targetValue

并且在一行版本里抄课,你也并沒有告訴編譯器difference是Int(整數(shù))類型的數(shù)據(jù)。因?yàn)閏urrentValue和targetValue都是Int型的雳旅,所以我們聰明的Swift可以自動判斷currentValue-targetValue也是Int型的跟磨,那么difference當(dāng)然也是Int型的。

這個(gè)特點(diǎn)被稱作‘類型推斷’攒盈,這只是Swift眾多優(yōu)點(diǎn)中的一點(diǎn)吱晒。

當(dāng)你有了計(jì)算結(jié)果以后,你使用了一個(gè)if語句判斷difference是否是負(fù)數(shù)(小于0)沦童。如果是,則將這個(gè)結(jié)果乘以-1叹话,從而得到一個(gè)正數(shù)偷遗。讓我們回到difference變量。

當(dāng)你寫到:

difference = difference * -1

這時(shí)電腦先將difference的值乘以-1驼壶,然后再將這個(gè)計(jì)算結(jié)果放回到difference里氏豌。所以我們看到的效果就是,通過這一運(yùn)算热凹,difference中的負(fù)值被一個(gè)正數(shù)覆蓋掉了泵喘。

這是一種常見的運(yùn)算泪电,你可以將它簡寫為:

difference *= -1
*=操作符結(jié)合了*和=兩個(gè)獨(dú)立的操作符,他們的計(jì)算結(jié)果是一樣的

其實(shí)你也可以寫成下面這個(gè)樣子:

var difference = currentValue - targetValue
if difference < 0 {
difference = -difference
}

用負(fù)號操作符代替乘以-1纪铺,也可以保證difference絕對是一個(gè)正數(shù)相速,因?yàn)樨?fù)負(fù)得正(如果你不相信的話,可以去問問數(shù)學(xué)專家)鲜锚。

試一試我們新的算法突诬。將showAlert()改成下面這個(gè)樣子:

@IBAction func showAlert() {
        var difference = currentValue - targetValue
        if difference < 0 {
            difference = difference * -1
        }
      . . .
    }

保存并運(yùn)行一下這個(gè)新的版本,它的表現(xiàn)應(yīng)該和之前的沒有差別芜繁。電腦的計(jì)算結(jié)果并未改變旺隙,只是你的算法稍有不同。

最后我們在推薦一個(gè)算法骏令,使用一個(gè)函數(shù)來完成這個(gè)功能蔬捷。

你之前已經(jīng)見過幾次函數(shù)了:當(dāng)你生成一個(gè)隨機(jī)數(shù)時(shí)用到的arc4random_uniform()以及用來給滑條的值取整的lroundf()。

為了確保計(jì)算結(jié)果為正數(shù)榔袋,你可以使用abs()這個(gè)函數(shù)周拐。

如果你在學(xué)校里學(xué)過數(shù)學(xué),那么也許你依稀記得一個(gè)術(shù)語叫做‘絕對值’摘昌,就是一個(gè)不需要關(guān)心它正負(fù)號的數(shù)值速妖。

這正是你所需要的,并且標(biāo)準(zhǔn)函數(shù)庫里給你提供了一個(gè)現(xiàn)成的函數(shù)聪黎,使用它你就可以將最終的解決方案縮減到一行代碼里罕容。

let difference = abs(targetValue - currentValue)

你用誰減去誰已經(jīng)不在重要了。如果結(jié)果為負(fù)值稿饰,那么abs()函數(shù)會將其轉(zhuǎn)換為正數(shù)锦秒。這是需要記住的一個(gè)便利的函數(shù),你會經(jīng)常用到它喉镰。

改一下showAlert()旅择,并且運(yùn)行app試試效果:

@IBAction func showAlert() {
        let difference = abs(targetValue - currentValue)
        
        let message = . . .
    }

已經(jīng)改的簡單的不能再簡單了。

練習(xí):我們還改了其他一些小地方侣姆,你注意到了嗎生真?

答案:你用let difference代替了var difference。

變量(variables)和常量(constants)是有區(qū)別的捺宗,和變量不同柱蟀,常量的值不可以發(fā)生變化(看名字就知道了,constants)蚜厉。

在常量這種盒子里长已,你只能放一次東西進(jìn)去,并且不能在之后用其他東西去替換它。

變量用關(guān)鍵字var定義术瓮,常量用關(guān)鍵字let定義】的簦現(xiàn)在difference已經(jīng)是一個(gè)常量了,不再是變量胞四。

在之前幾個(gè)版本的算法里恬汁,difference的值可能會發(fā)生改變。如果為負(fù)值的話撬讽,你就要將它轉(zhuǎn)換為正值蕊连。這就需要difference必須是一個(gè)變量,因?yàn)橹挥凶兞坎拍鼙环峙湫碌闹堤娲f的值游昼。

現(xiàn)在你在一行代碼內(nèi)計(jì)算了全部所需內(nèi)容甘苍,difference在得到一個(gè)值以后再也不會發(fā)生變化,所以此時(shí)最好將它定義為一個(gè)常量烘豌。(這樣可以使你的意圖更加清晰载庭,并且使Swift的編譯器更好的理解你的代碼)

出于同樣原因,message廊佩,alert以及action都是常量(并且始終獨(dú)立存在)∏艟郏現(xiàn)在你知道為什么聲明這些對象時(shí)用的都是let關(guān)鍵字了,因?yàn)橐坏┧鼈儽毁x了一個(gè)值标锄,就再也不需要改變了顽铸。

常量在Swift中使用非常頻繁。你經(jīng)常只需要暫時(shí)的保存一個(gè)值料皇,如果在此期間這個(gè)值不需要發(fā)生變化谓松,那么它雖好被聲明為常量而不是變量。

如何計(jì)算玩家的得分践剂?

現(xiàn)在你已經(jīng)知道了滑條位置和目標(biāo)值的差值鬼譬,這樣計(jì)算玩家的分?jǐn)?shù)就簡單多了。

將showAlert()修改為下面這樣:

@IBAction func showAlert() {
        let difference = abs(targetValue - currentValue)
        let points = 100 - difference
        
        let message = "Your scored \(points) points"
        . . . 
    }

你可以得到的最高分?jǐn)?shù)為100逊脯,如果你正好將滑條拖到和目標(biāo)值一樣的位置時(shí)优质,此時(shí)difference為0。而里目標(biāo)值越遠(yuǎn)則得分越低军洼。

運(yùn)行app試試看你能得多少分巩螃?

提醒窗口展示玩家當(dāng)前回合的得分

練習(xí):因?yàn)榛瑮l的最大值為100,最小值為1匕争,最大差值為100 - 1 = 99牺六。這意味著你能得到的最低分為1分。試著解釋下這是為什么(這需要點(diǎn)數(shù)學(xué)常識)汗捡。

累計(jì)玩家的總分

在這個(gè)游戲里,你需要在屏幕上展示玩家得到的總分。在每一回合結(jié)束后扇住,這個(gè)app應(yīng)該添加最后一次得分到總分里并且之后更新得分的標(biāo)簽(score label)春缕。

在ViewController.swift中添加一個(gè)新的實(shí)例變量score:

class ViewController: UIViewController {
    
    @IBOutlet weak var slider: UISlider!
    @IBOutlet weak var targetLabel: UILabel!
    
    var currentValue: Int = 50
    var targetValue: Int = 0
    var score = 0 //添加這一行

這是怎么回事?和之前的兩個(gè)變量不一樣艘蹋,你沒有指定score的類型為Int锄贼。

如果你沒有指定數(shù)據(jù)類型,Swift就會使用類型推斷來定位它的數(shù)據(jù)類型女阀。因?yàn)?是一個(gè)整數(shù)宅荤,Swift就會推定score應(yīng)該是Int類型的數(shù)據(jù),并且自動將score設(shè)置為Int(整數(shù))型浸策。

實(shí)際上冯键,你也不需要指定前兩個(gè)變量的數(shù)據(jù)類型:

var currentValue = 50
var targetValue = 0

按照上圖改一下這兩行代碼。

感謝類型推斷庸汗,你僅需要在變量沒有初始值的時(shí)候指出變量的數(shù)據(jù)類型惫确。但是大多數(shù)時(shí)候,你可以安全的讓Swift自己去猜變量的類型蚯舱。

我覺得Swift的類型推斷功能相當(dāng)親民改化!它可以明顯的減少你的打字工作。

現(xiàn)在來修改showAlert()枉昏,讓它可以記錄總分:

@IBAction func showAlert() {
        let difference = abs(targetValue - currentValue)
        let points = 100 - difference
        score += points  //添加這一行
        
        let message = "Your scored \(points) points"

這里沒有啥新東西陈肛,你只是添加了這樣一行:

score += points

其作用是將玩家每一回的的得分加到總分里去,你也可以寫成下面這個(gè)樣子:

score = score + points

個(gè)人而言兄裂,我喜歡+=這個(gè)版本句旱,但是后一種版本也沒問題。它們完成的工作是一樣的懦窘。

將總分顯示在屏幕上

你要做的事情和你在target label上做的一模一樣:鏈接score label到outlet并且將score的值放到這個(gè)label的文本中前翎。

練習(xí):看看在沒有我的幫助下你自己能不能完成這個(gè)工作。你以前已經(jīng)對target label操作過一次了畅涂,所以你應(yīng)該能夠在score label標(biāo)簽上重復(fù)一遍這個(gè)步驟港华。

以下步驟都應(yīng)該是你熟悉的,首先在ViewController.swift中添加這么一行:

@IBOutlet weak var scoreLabel: UILabel!

然后你打開storyboard并且將這個(gè)標(biāo)簽鏈接到這個(gè)新的scoreLabel outlet(就是寫著999999的那個(gè)標(biāo)簽)午衰。

不確定如何連接到outlet立宜?這里有好幾種方法用于連接用戶接口對象(user interfae objects)到view controller的outlet。

注意:下面的1臊岸,2橙数,3不是步驟,而是三種方法帅戒。

1灯帮、按住ctrl點(diǎn)擊標(biāo)簽(999999的那個(gè))然后會彈出一個(gè)菜單崖技。然后在彈出菜單上拖拽New referencing Outlet到View Controller,然后在彈出的小菜單上選擇score label(我們對slider就是這樣做的)钟哥。

2迎献、打開鏈接檢查器標(biāo)簽。然后拖拽New referencing Outlet到View Controller腻贰,然后在彈出的小菜單上選擇score label(我們對target label就是這樣做的)吁恍。

3、按住ctrl從View Controller(黃色圖標(biāo)的那個(gè))往標(biāo)簽上拖(我們這次試試這種新方法)播演;注意:直接在標(biāo)簽上按住ctrl拖拽到view controller是沒有用的冀瓦,不要弄反了。

看到了嗎写烤,我們有多種方法用于連接outlet翼闽。

現(xiàn)在scoreLabel的outlet已經(jīng)有了,非常棒顶霞,你可以往這個(gè)標(biāo)簽的文本里寫值了現(xiàn)在肄程。我們應(yīng)該把相關(guān)的代碼寫在什么地方呢?當(dāng)然是updateLabels()里面了选浑。

回到ViewController.swift,將updateLabels()改為下面這個(gè)樣子:

func updateLabels() {
        targetLabel.text = String(targetValue)
        scoreLabel.text = String(score)
    }

這里沒有任何新東西蓝厌,你將score,一個(gè)Int型的值轉(zhuǎn)換為String型的古徒,然后將它存儲到這個(gè)標(biāo)簽的文本中拓提。

運(yùn)行app并且確認(rèn)無論何時(shí)你點(diǎn)擊Hit Me時(shí)每一回合的分?jǐn)?shù)都會加到總分中。

score標(biāo)簽記錄了玩家的總分

關(guān)于回合:

說到回合隧膘,當(dāng)玩家開始新的一個(gè)回合的時(shí)候代态,你也需要將回合數(shù)進(jìn)行累加。

練習(xí):跟蹤目前回合數(shù)的值(起始為1)疹吃,并且每一新回合開始時(shí)蹦疑,對它進(jìn)行+1,并且將這個(gè)數(shù)顯示到屏幕上對應(yīng)的標(biāo)簽里萨驶。也許我應(yīng)該在這里多講一些歉摧,再帶帶你,但是假如你已經(jīng)理解并吸收了之前的內(nèi)容的話腔呜,你已經(jīng)有了足夠多手段來實(shí)現(xiàn)這個(gè)目的叁温,祝你好運(yùn)!

如果你已經(jīng)想到這里要用一個(gè)新的實(shí)例變量核畴,那么你已經(jīng)接近成功了膝但。你應(yīng)該在源代碼中添加下面這一行:

var round = 0

如果你想把數(shù)據(jù)類型的名稱也加進(jìn)去,也是可以的谤草,雖然并沒有必要這樣做:

var round: Int = 0

再來一個(gè)outlet給這個(gè)標(biāo)簽:

@IBOutlet weak var roundLabel: UILabel!

和之前一樣跟束,你需要連接這個(gè)標(biāo)簽到Interface Builder的outlet莺奸。

??:不要忘記這些連接
忘記這些連接是新手常犯的一個(gè)錯(cuò)誤,特別是對現(xiàn)在的你而言泳炉。
我常常在為一個(gè)button寫好outlet以及處理用戶點(diǎn)擊后的代碼以后憾筏,在測試app時(shí)發(fā)現(xiàn)寫好的代碼都沒有生效,然后我不得不花時(shí)間去努力的檢查問題花鹅,最終發(fā)現(xiàn)是我忘記了連接這些buttom到outlet或者action method(動作方法)。

最終枫浙,updateLabels()應(yīng)該是這樣的:

func updateLabels() {
        roundLabel.text = String(round)
        targetLabel.text = String(targetValue)
        scoreLabel.text = String(score)
    }

同時(shí)你能指出應(yīng)該在哪里對round變量進(jìn)行累加了嗎刨肃?

要我說的話,startNewRound()就是個(gè)理想的地方箩帚。畢竟無論何時(shí)真友,玩家開始新一回合的時(shí)候,你都要調(diào)用它紧帕。所以我們應(yīng)該在這里對round變量進(jìn)行累加盔然。

將startNewRound()改成下面這個(gè)樣子:

func startNewRound() {
        round += 1 \\添加這一行
        targetValue = 1 + Int(arc4random_uniform(100))
        currentValue = 50
        slider.value = Float(currentValue)
    }

注意一下,你在定義round變量的時(shí)候是嗜,它的默認(rèn)值為0愈案。因此,當(dāng)app啟動時(shí)鹅搪,它的值初始化為0站绪。當(dāng)你第一次調(diào)用startNewRound()時(shí)(在viewDidLoad()中),它被加1丽柿,這樣你在屏幕上就看到第一回合的round值是1了恢准。

運(yùn)行app試一試,無論何時(shí)你點(diǎn)擊Hit Me按鈕后甫题,round的值都會被加1馁筐,并且顯示在屏幕上。

round標(biāo)簽顯示當(dāng)前的回合數(shù)

你可以在04-Rounds and Score中找到源代碼坠非,如果你做出來的效果不是這樣敏沉,你可以對照我的代碼看看你漏掉了什么。附件請支持正版_

希望我們的文章對你的求學(xué)之路提供了切實(shí)的幫助麻顶,由于我是個(gè)人翻譯赦抖,所以進(jìn)度無法太快,但是我可以保證每周至少更新一節(jié)課辅肾,同時(shí)也希望大家能心疼我一下队萤,點(diǎn)擊一下下方的打賞_,讀者的認(rèn)可矫钓,就是我最大的動力要尔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舍杜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子赵辕,更是在濱河造成了極大的恐慌既绩,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件还惠,死亡現(xiàn)場離奇詭異饲握,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蚕键,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門救欧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锣光,你說我怎么就攤上這事笆怠。” “怎么了誊爹?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵蹬刷,是天一觀的道長。 經(jīng)常有香客問我频丘,道長办成,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任椎镣,我火速辦了婚禮诈火,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘状答。我一直安慰自己冷守,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布惊科。 她就那樣靜靜地躺著拍摇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪馆截。 梳的紋絲不亂的頭發(fā)上充活,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機(jī)與錄音蜡娶,去河邊找鬼混卵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛窖张,可吹牛的內(nèi)容都是我干的幕随。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宿接,長吁一口氣:“原來是場噩夢啊……” “哼赘淮!你這毒婦竟也來了辕录?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤梢卸,失蹤者是張志新(化名)和其女友劉穎走诞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛤高,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚣旱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了戴陡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姻锁。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖猜欺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拷窜,我是刑警寧澤开皿,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站篮昧,受9級特大地震影響赋荆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜懊昨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一窄潭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧酵颁,春花似錦嫉你、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至簿姨,卻和暖如春距误,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扁位。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工准潭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人域仇。 一個(gè)月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓刑然,卻偏偏與公主長得像,于是被迫代替她去往敵國和親殉簸。 傳聞我的和親對象是個(gè)殘疾皇子闰集,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

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