學習記錄#8 甜蜜的 Apple Pie
Published in
8 min readJan 11, 2021
目的:
研讀 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 ()
}}
初步成果
擴充版
- 加上計分機制,猜對完整的單字有分數。
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}
成果
有聲版成果