猜數字

上週彼得潘出國當爽人~課程暫停一次

很怕swift的記憶會隨著彼得潘一起遠去

只好看看其他班的同學都在玩些什麼~自己也來動手做看看

最後決定練習猜數字的遊戲

遊戲概念很簡單~就是要猜猜看星球上有幾朵玫瑰

只有6次機會~數字範圍是0-50

每猜一次~住在星球上的小狐狸都會給你一些提示

6次機會中猜中~小狐狸會送你一朵玫瑰~

機會用完還猜不中小狐狸則會送你兩行淚

正確答案用亂數產生 ~才能讓玩家可以無限重玩

先把UI上的物件跟swift code連一連

其中的upperBound跟lowerBound兩個變數

是在玩家每猜完一次後~給予的最新範圍的溫馨提示

不然像我這種金魚腦的人~每次猜完都會忘記剛剛猜過什麼

@IBOutlet weak var inputNumber: UITextField! //玩家輸入的數字
@IBOutlet weak var hint: UILabel! //溫馨提示
@IBOutlet weak var guessTime: UILabel!  //可猜的次數
@IBOutlet weak var rose: UIImageView!  //答對的獎勵 (先隱藏)
@IBOutlet weak var tear: UIImageView!  //答錯的淚水 (先隱藏)
var answer = 0 //答案初始值
var chance = 6 //生命初始值
var upperBound = 50 //最大範圍提示
var lowerBound = 0  //最小範圍提示

然後在 override func viewDidLoad()裡面

加上一個會自動產生0-50之間亂數的函式

就是每次遊戲啟動後~會自動產生的正確答案

answer = Int(arc4random_uniform(50))

現在來處理GO這個button~主要由四個條件構成

(1)如果玩家沒有輸入值 if inputNumber.text == “”

不給猜~並叫他輸入

(2)如果玩家輸入的值不是數字 if Int(inputNumber.text!) == nil

不給猜~並叫他要輸入數字

(3)如果玩家生命值還沒用完 if chance > 0

那就執行check()這個主要用來驗證玩家是否猜中的函式

(4)如果玩家生命值用完了~就不給他猜了

並將原先隱藏起來的哭哭圖打開~哭給他看

@IBAction func gobtn(_ sender: UIButton) {
inputNumber.resignFirstResponder() //收鍵盤

if inputNumber.text == "" {
hint.text="小狐狸正等著你給牠一個數字" //使用者沒輸入

}else if Int(inputNumber.text!) == nil {
hint.text="只能輸入數字喔!"  //使用者輸入的不是數字

}else if chance > 0{
let i = Int(inputNumber.text!)!
check(test: i)

}else{
hint.text = "小狐狸哭哭 沒機會了"
tear.isHidden = false
}
}

在寫check()這個函式之前

先寫一個提示玩家最新範圍的函式 getBoundaryText()

func getBoundaryText() -> String {
return "(\(lowerBound)~\(upperBound))"
}

現在可以來處理這個主要運算的check()了

當前面的go button按下時

如果玩家生命值還大於0的時候~就會執行這個函式

if chance > 0{
let i = Int(inputNumber.text!)!
check(test: i)

把玩家數入的值轉成整數傳給i這個常數

然後把這個i值傳給check(test:Int)來進行驗證

以下是check()的內容

func check(test:Int){
if test > 50{
hint.text = "猜的數字超出範圍嚕!\(getBoundaryText())"
chance -= 1
guessTime.text = String(chance)

}else if test > answer {
upperBound = test - 1
hint.text = "沒有這麼多朵\(getBoundaryText())"
chance -= 1
guessTime.text = String(chance)

}else if test < answer {
lowerBound = test + 1
hint.text = "太少朵了吧!\(getBoundaryText())"
chance -= 1
guessTime.text = String(chance)

}else {
hint.text = "答對了!就是\(answer)朵 送你一朵玫瑰"
rose.isHidden = false
 }
}

(1)當玩家輸入的值>50的時候

告知玩家猜的數字超出範圍~並執行getBoundaryText()秀出最新範圍

同時生命值-1~然後印出玩家剩餘可猜次數

(2)當玩家輸入的值>正確答案的時候

把玩家輸入的值-1做為最新範圍的最大值upperBound

告知玩家猜太多了~並執行getBoundaryText()秀出最新範圍

同時生命值-1~然後印出玩家剩餘可猜次數

(3)當玩家輸入的值<正確答案的時候

把玩家輸入的值+1做為最新範圍的最小值upperBound

告知玩家猜太少了~並執行getBoundaryText()秀出最新範圍

同時生命值-1~然後印出玩家剩餘可猜次數

(4)當玩家輸入的值=正確答案的時候

恭喜它~並將原先隱藏的玫瑰圖開啟做為答對獎勵

最後要弄的當然就是play again的按鈕啦!

這邊比較簡單~當玩家按下play again的按鈕時

將提示改為預設的”放膽去猜!!”

數字輸入欄改為預設值0

生命值:6

最新範圍提示最大值:50

最新範圍提示最小值:0

然後重新亂數產生一個0-50的數字做為答案

顯示可猜次數~並將玫瑰圖跟淚水都重新隱藏起來

就大功告成惹!

@IBAction func playagain(_ sender: UIButton) {
hint.text = "放膽去猜!!"
inputNumber.text = "0"
chance = 6
upperBound = 50
lowerBound = 0
answer = Int(arc4random_uniform(50))
guessTime.text = String(chance)
rose.isHidden = true
tear.isHidden = true
}