#13 ⭐️ 選擇 / 問答題 App

這次的主題是選擇題,我打算使用日本各縣市的圖案來當作我的題目,並以此製作app。

成果展示:

遊戲的主要功能在於 JapanAreaViewController,這個控制器負責管理地圖顯示、問題的更新和答案的驗證過程。地圖的每個地區名稱及其對應的圖片都儲存在一個名為 AreaName 的結構中,包含了地區的漢字名稱和對應的圖片檔名。這種數據結構方式便於管理和更新數據。

struct AreaName {
let kannji: String
let alpha: String
}

JapanAreaViewController 中,我初始化了一個 JapanAreas array來儲存日本各地區的資訊。這個陣列在視圖載入時會被隨機打亂,以確保每次遊戲的問題順序都不同。每當用戶選擇答案後,這個控制器會檢查答案是否正確並根據結果更新用戶界面。

class JapanAreaViewController: UIViewController {
@IBOutlet weak var correctCount: UILabel!
@IBOutlet var answerButton: [UIButton]!
@IBOutlet weak var wrongCount: UISegmentedControl!
@IBOutlet weak var image: UIImageView!
var JapanAreas = [
AreaName(kannji: "北海道", alpha: "map-hokkaido.png"),
AreaName(kannji: "青森県", alpha: "map-aomori.png"),
AreaName(kannji: "岩手県", alpha: "map-iwate.png"),
AreaName(kannji: "宮城県", alpha: "map-miyagi.png"),
AreaName(kannji: "秋田県", alpha: "map-akita.png"),
AreaName(kannji: "山形県", alpha: "map-yamagata.png"),
AreaName(kannji: "福島県", alpha: "map-fukushima.png"),
AreaName(kannji: "茨城県", alpha: "map-ibaraki.png"),
AreaName(kannji: "栃木県", alpha: "map-tochigi.png"),
AreaName(kannji: "群馬県", alpha: "map-gunma.png"),
AreaName(kannji: "埼玉県", alpha: "map-saitama.png"),
AreaName(kannji: "千葉県", alpha: "map-chiba.png"),
AreaName(kannji: "東京都", alpha: "map-tokyo.png"),
AreaName(kannji: "神奈川県", alpha: "map-kanagawa.png"),
AreaName(kannji: "新潟県", alpha: "map-niigata.png"),
AreaName(kannji: "富山県", alpha: "map-toyama.png"),
AreaName(kannji: "石川県", alpha: "map-ishikawa.png"),
AreaName(kannji: "福井県", alpha: "map-fukui.png"),
AreaName(kannji: "山梨県", alpha: "map-yamanashi.png"),
AreaName(kannji: "長野県", alpha: "map-nagano.png"),
AreaName(kannji: "岐阜県", alpha: "map-gifu.png"),
AreaName(kannji: "静岡県", alpha: "map-shizuoka.png"),
AreaName(kannji: "愛知県", alpha: "map-aichi.png"),
AreaName(kannji: "三重県", alpha: "map-mie.png"),
AreaName(kannji: "滋賀県", alpha: "map-shiga.png"),
AreaName(kannji: "京都府", alpha: "map-kyoto.png"),
AreaName(kannji: "大阪府", alpha: "map-osaka.png"),
AreaName(kannji: "兵庫県", alpha: "map-hyogo.png"),
AreaName(kannji: "奈良県", alpha: "map-nara.png"),
AreaName(kannji: "和歌山県", alpha: "map-wakayama.png"),
AreaName(kannji: "鳥取県", alpha: "map-tottori.png"),
AreaName(kannji: "島根県", alpha: "map-shimane.png"),
AreaName(kannji: "岡山県", alpha: "map-okayama.png"),
AreaName(kannji: "広島県", alpha: "map-hiroshima.png"),
AreaName(kannji: "山口県", alpha: "map-yamaguchi.png"),
AreaName(kannji: "徳島県", alpha: "map-tokushima.png"),
AreaName(kannji: "香川県", alpha: "map-kagawa.png"),
AreaName(kannji: "愛媛県", alpha: "map-ehime.png"),
AreaName(kannji: "高知県", alpha: "map-kochi.png"),
AreaName(kannji: "福岡県", alpha: "map-fukuoka.png"),
AreaName(kannji: "佐賀県", alpha: "map-saga.png"),
AreaName(kannji: "長崎県", alpha: "map-nagasaki.png"),
AreaName(kannji: "熊本県", alpha: "map-kumamoto.png"),
AreaName(kannji: "大分県", alpha: "map-oita.png"),
AreaName(kannji: "宮崎県", alpha: "map-miyazaki.png"),
AreaName(kannji: "鹿児島県", alpha: "map-kagoshima.png"),
AreaName(kannji: "沖縄県", alpha: "map-okinawa.png")
]

override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.hidesBackButton = true
JapanAreas.shuffle() // 打亂地圖
reset(country: JapanAreas, correctCount: correctCount, answerButtonIndex: answerButtonIndex, image: image, answerButton: answerButton)
}
}

resetnextQuestion 函數是用來更新界面和設置新的問題。這些函數負責從 JapanAreas 數據中選擇地區,更新地圖圖片和選項按鈕的文字。

func nextQuestion(index: IndexStruct, image: UIImageView!, area: [AreaName], button: [UIButton]!, correctCount: UILabel!
) {
let nextQuestionIndex = index.correct + index.wrong
let imageString = area[nextQuestionIndex].alpha
image.image = UIImage(named:imageString)

let range = 0...area.count - 1
let excludeNumber = nextQuestionIndex
var numbers = Set(range)
numbers.remove(excludeNumber)

var selectedNumbers = [Int]()
while selectedNumbers.count < 3 {
if let randomElement = numbers.randomElement() {
selectedNumbers.append(randomElement)
}
}
selectedNumbers.append(excludeNumber)


selectedNumbers.shuffle()
var count = 0
for alpha in button {
alpha.setTitle(area[selectedNumbers[count]].kannji, for: .normal)
alpha.titleLabel?.font = UIFont(name: "HiraMaruProN-W4", size: 25.0)
count += 1

}

correctCount.text = "正解:\(index.correct)"

}

func reset(country: [AreaName], correctCount: UILabel!, answerButtonIndex: IndexStruct, image: UIImageView!, answerButton: [UIButton]!) {
correctCount.text = "正解:\(answerButtonIndex.correct)"
correctCount.font = UIFont(name: "HiraMaruProN-W4", size: 25.0)
let imageString = country.first!.alpha //地圖名字
image.image = UIImage(named:imageString) //叫圖片出來
var count = 0
for alpha in answerButton {
alpha.setTitle(country[answerButtonIndex.answerButtonIndex[count]].kannji, for: .normal)
alpha.titleLabel?.font = UIFont(name: "HiraMaruProN-W4", size: 25.0)
count += 1
}
}

目前是使用按鈕拉線到上一頁,但這會造成記憶體負擔,接下來會學習如何使用delgate來返回上一頁,以便在未來版本中減少記憶體負擔。

--

--