學習記錄#8 甜蜜的 Apple Pie

目的:
研讀 Apple 官方電子書 App Development with Swift 第二章,完成它的 Guided Project,Apple Pie,學習 array,struct 自訂型別,didSet,for in,string interpolation。

題目參考來源:
Apple 官方電子書 App Development with Swift 裡 ch2 的 Guided Project,Apple Pie。

Apple 官方簡單版

規則如下:

1.畫面下方以 _ 顯示要猜的單字,比方單字是 peter,一開始將顯示
_ _ _ _ _,五個底線。

2.如果猜的字母在單字裡,原本顯示的 _ 將變成猜的字母,比方單字是 peter,當我們猜了 p 跟 e,畫面下方將顯示 p e _ e _。

var formattedWord: String  {var guessedWord = ""      for letter in word{          if guessedLetters.contains(letter)  {                  guessedWord += "\(letter)"
}
else {
guessedWord += "_"
}
}
return guessedWord
}

3.如果猜的字母沒有在單字裡,將會掉一顆蘋果,如果七顆蘋果掉光光的話,你就輸了。

 let incorrectMovesAllowed = 7mutating func playerGuessed (letter: Character) {      guessedLetters.append(letter)           if !word.contains(letter){                  incorrectMovesRemaining -= 1              }
}

4.猜過的字母不能再按。

sender.isEnabled = false

5.有多個單字可猜,最下方將顯示單字猜對的次數,比方猜對 3 次,猜錯 1 次。

6.猜完一個單字後,更新最下方的猜對次數,繼續猜下一個單字,此時蘋果會回到七個,全部字母也會重新變成可以按。

var totalWins = 0  {      didSet {        newRound()
}
}
var totalLosses = 0 { didSet { newRound()
}
}
func updateUI() { var letters = [String]() for letter in currentGame.formattedWord { letters.append(String(letter))
}
let wordWithSpacing = letters.joined (separator:" ") correctWordLabel.text = wordWithSpacing scoreLabel.text = "猜對: \(totalWins),猜錯: \(totalLosses)" treeImageView.image = UIImage(named: "Tree \ (currentGame.incorrectMovesRemaining)")}//按鈕重新可點選
func
enableLetterButtons(_enable: Bool) {
for button in letterButtons { button.isEnabled = _enable
}
}
func newRound() { if listOfWords.isEmpty == false { let newWord = listOfWords.removeFirst() currentGame = Game(word: newWord, incorrectMovesRemaining: incorrectMovesAllowed, guessedLetters: []) enableLetterButtons(_enable: true) updateUI() } else { enableLetterButtons(_enable: false) }}func updateUI() { var letters = [String]() for letter in currentGame.formattedWord { letters.append(String(letter))
}
let wordWithSpacing = letters.joined (separator:" ") correctWordLabel.text = wordWithSpacing scoreLabel.text = "猜對: \(totalWins),猜錯: \(totalLosses)" treeImageView.image = UIImage(named: "Tree \ (currentGame.incorrectMovesRemaining)")}
func updateGameState() {if currentGame.incorrectMovesRemaining == 0 { totalLosses += 1
}
else if currentGame.word == currentGame.formattedWord { totalWins += 1
}
else { updateUI ()
}
}

初步成果

擴充版

  1. 加上計分機制,猜對完整的單字有分數。
guessRight += 10

2.加上音效,掉蘋果時有音效。

func speek(){let speechUtterance = AVSpeechUtterance(string: "oh oh 猜錯了")speechUtterance.voice = AVSpeechSynthesisVoice(language: "zh-TW")speechUtterance.rate = 0.5speechUtterance.postUtteranceDelay = 50let synthesizer = AVSpeechSynthesizer()synthesizer.speak(speechUtterance)}

3.計時制,目標在愈短的時間內猜對5個單字。

var gameTimer:Timer?var timerCount = 0
@objc func timerSet() {timerCount += 1let mins = timerCount/60let seconds = timerCount % 60self.timeLabel.text = " 時間 \(String(format:"%.2d", mins)):\(String(format:"%.2d", seconds))"totalTime += 1}//全數猜中立即停止
if
totalWins == 5{
//時間停止
gameTimer?.invalidate()
let alert = UIAlertController(title: "花費時間", message: "\(totalTime)秒" , preferredStyle: .alert)let action = UIAlertAction(title: "結束", style: .default) { (_) in}alert.addAction(action)present(alert, animated: true, completion: nil)}

4.使用者可選擇不同的水果。

switch select {case 0:treeImageView.image = UIImage(named: "Tree \(currentGame.incorrectMovesRemainingPlayer1)")case 1:treeImageView.image = UIImage(named: "orange \(currentGame.incorrectMovesRemainingPlayer1)")case 2:treeImageView.image = UIImage(named: "Strawberry \(currentGame.incorrectMovesRemainingPlayer1)")default:break}

成果

有聲版成果

--

--