打地鼠 App

水餃
3 min readNov 28, 2019

storyboard 畫面製作

主要程式說明

開頭畫面的動畫程式

UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 2, delay: 0, animations: {
self.leaderboard.center.x = self.view.center.x
self.play.center.x = self.view.center.x
self.whackAMole.center.x = self.view.center.x
})
UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 1, delay: 1, animations: {
self.hammer.transform = CGAffineTransform(rotationAngle: CGFloat.pi / 180 * 90)
})
UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 0.5, delay: 2, animations: {
self.hammer.transform = CGAffineTransform(rotationAngle: CGFloat.pi / 180 * -20)
})

隨機顯示地鼠

func showDigletts() {
var hasDigletts = [true, true, true, true, false, false, false, false, false, false, false, false]
hasDigletts.shuffle()
var i = 0
for hasDiglett in hasDigletts {
if hasDiglett {
let image = self.images.randomElement()!
self.diglettButtons[i].setImage(image, for: .normal)
} else {
self.diglettButtons[i].setImage(holeImage, for: .normal)
}
i += 1
}
}

每 0.01 秒更新畫面上的時間, 每 1 秒更新畫面上的地鼠

@IBAction func startButton(_ sender: UIButton) {
sender.isHidden = true
startTime = Date()
self.showDigletts()
Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { (timer) in
let now = Date()
let interval = now.timeIntervalSince(self.startTime!)
let dif = 10 - interval
self.timeLable.text = String(format: "%.2f", dif)
if dif <= 0 {
self.timeLable.text = "0.00"
timer.invalidate()
self.performSegue(withIdentifier: "result", sender: nil)
} else if self.timeLable.text?.hasSuffix("00") == true {
self.showDigletts()
}

}
}

判斷打到的地鼠跟算分

@IBAction func tapDigletts(_ sender: UIButton) {
if sender.currentImage != holeImage {
let number = images.firstIndex(of: sender.currentImage)
if number == 0 {
score += 10
alolaDiglett += 1
} else if number == 1 {
score += 20
dugtrio += 1
} else {
score += 30
alolaDugtrio += 1
}
scoreLable.text = "\(score)"
sender.setImage(UIImage(named: "hole"), for: .normal)
}
}

分數明細和儲存分數

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let resultValue = result!
score.text = resultValue.score.description
dugtrio.text = resultValue.dugtrio.description
alolaDugtrio.text = resultValue.alolaDugtrio.description
alolaDiglett.text = resultValue.alolaDiglett.description

var scores = UserDefaults.standard.array(forKey: "scores")
if scores == nil {
scores = [Int]()
}
scores?.append(resultValue.score)
UserDefaults.standard.set(scores, forKey: "scores")

}

分數排行榜

class LeaderBoardViewController: UIViewController {@IBOutlet weak var leaderBoard: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
var scores = UserDefaults.standard.array(forKey: "scores") as? [Int]
scores?.sort(by: { (grade1, grade2) -> Bool in
return grade1 > grade2
})
var number = 1
if scores != nil {
for score in scores! {
leaderBoard.text.append("NO" + number.description + " " + score.description + "\n")
number += 1
}
}
}

完整程式專案

--

--