猜數字
上週彼得潘出國當爽人~課程暫停一次
很怕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}