#16 1A2B APP

rjjq
彼得潘的 Swift iOS / Flutter App 開發教室
5 min readJul 27, 2022

簡單製作一個猜 1A2B 的遊戲

功能

  1. 計時使用者花費多少時間完成遊戲
  2. 遊戲開始時,自動生成不重複的四位隨機數
  3. 每次輸入數字,自動檢查與答案相差幾A幾B
  4. 當達到4A時,下方顯示使用者輸入過的答案以及結果、總使用時間

步驟

  1. 準備畫面 : 包含重新開始、輸入數字、開始遊戲、紀錄區、結果框、使用時間框

2. 設置 IBOutlet 及 參數

// 紀錄
@IBOutlet weak var logText: UITextView!
// 輸入
@IBOutlet weak var inputText: UITextField!
// 結果
@IBOutlet weak var resultText: UILabel!
// 開始
@IBOutlet weak var startBtn: UIButton!
// 使用時間
@IBOutlet weak var usedTimeText: UILabel!
// 答案
var answers: [Int]?
// 已玩次數
var counts = 0
// 遊戲計時器
var gameTimer: Timer?
// 已玩遊戲時間
var totalTime: Double = 0.0

3. 設置 IBAction 及 各函式

// 初始計時器
func initTimer() {
gameTimer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)
}
// 更新時間
@objc func updateTimer() {
totalTime += 0.1
usedTimeText.text = String(format: "Used Time: %4.1f s", totalTime)
}
// 開始遊戲
@IBAction func start(_ sender: Any) {
if counts == 0 {
initTimer()
}

let inputStrings = inputText.text ?? ""

if inputStrings.count == 4 {
var guessNumbers: [Int] = []
inputStrings.forEach { char in
let num = Int(String(char)) ?? 0
guessNumbers.append(num)
}
// debugPrint(guessNumbers)

counts += 1

let (result, aCount, _) = compareAnswer(with: guessNumbers)

debugPrint(result, aCount)

logText.text += String(format: "#%3d\t:\t%@\t=>\t %@\n", arguments: [counts, inputStrings, result])

if aCount == 4 {
resultText.text = "You win :)"
startBtn.isEnabled = false
gameTimer?.invalidate()
}
} else {
debugPrint("not 4 digits")
}

inputText.text = ""
}
// 比較答案 -> 回傳 (結果, A count, B count)
func compareAnswer(with guessNumbers: [Int]) -> (String, Int, Int) {
var aCount: Int = 0
var bCount: Int = 0
let answerAry: [Int] = answers ?? [1,2,3,4]

for i in 0...3 {
let guessNum = guessNumbers[i]
let answerNum = answerAry[i]
if guessNum == answerNum {
aCount += 1
} else if answerAry.contains(guessNum){
bCount += 1
}
}

return ("\(aCount)A\(bCount)B", aCount, bCount)
}
// 重新遊戲
@IBAction func newGame(_ sender: Any) {
resultText.text = ""
logText.text = ""
inputText.text = ""
startBtn.isEnabled = true
totalTime = 0.0
counts = 0
usedTimeText.text = "Used Time: "
answers = initGuessNumber()
// debugPrint(answers)
}

成果

GitHub

參考

--

--