問答題App — アニメクイズ

(b,0)
彼得潘的 Swift iOS / Flutter App 開發教室
8 min readMar 11, 2017

這次作業的題目,我是從20部不同的動畫裡出的,我出的都是基本題,超級簡單,只要你有看,一定秒回答!!!

icon是基德,截圖也是基德

接下來就附上gif~~

我寫的程式會從20題題庫中隨機抽選10題,四個選項的排序也是隨機排,然後答題結束之後,會以AlertController顯示得分,並且會出現再玩一次的按鈕

步驟:

1 想畫面&找圖片&排版

2 拉線

@IBOutlet:圖片、第幾題的label、題目內容、四個選項(選項是button喔)按鈕、再玩一次按鈕

@IBOutlet weak var image: UIImageView! //corresponding image@IBOutlet weak var questionNumber: UILabel! //第幾題@IBOutlet weak var Question: UILabel! //question@IBOutlet var buttons: [UIButton]! //4 choices@IBOutlet weak var Play_Again_Outlet: UIButton! //appear after game set

值得注意的是,因為選項有四個,我想把他們放在一起,所以選擇Outlet Collection,這樣他們就會用array的方式存起來,依照拉線的順序,index分別為0,1,2,3

@IBAction:四個選項、再玩一次按鈕

//action for 4 choices@IBAction func choose(_ sender: UIButton)@IBAction func playAgain(_ sender: Any)

3 建立題庫

我先建立一個struct,裡面有題目內容、選項、圖片、答案

struct QandA{var question:Stringvar choice:[String]=[]var image:Stringvar answer:String}

依照下列方式建立題庫,這是其中一題

//20 questionsvar questions = [QandA(question:”請問殺老師的真實身份是?”,choice:[“初代死神”,”大魔王”,”魑魅魍魎”,”廚師”],image:”1.jpg”,answer:”你猜猜看~”),

4 設定初始值

//use for randomly choose questionsvar number = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]var question_count = 0 //count for question nowvar score = 0var right_answer = “” //which stores string type

number array是用來隨機選題的,透過裡面的數字連結到題庫內容

question_count是在算現在總共出幾題了

score是得分

right_answer是正確答案

5 建立出現問題的function — showQuestion()

這個function是這個作業的重點!!!

A. 每呼叫一次,總題數就要加一

B. 隨機選題

*因為總共有20題,而我以array的形式儲存,因此此20題的編號為0~19

*利用這一點,我建立一個儲存0~19的array,代表隨機選到的題目編號

*為了不重複選到同一個數字(也就是同一題),選到這個數字之後,就要把它從array中移除,所以array的長度經過每次的隨機抽選,都會改變

*因此,隨機選數的範圍從0選到array長度-1,這不是代表題目編號,而是代表array中剩餘element的index,此index儲存的element才是題目編號

let random_number = Int(arc4random_uniform(UInt32(number.count)))

*所以需要另一個變數來儲存此index的element,也就是題目編號

let value = number[random_number]

*設定此題的圖片、題數、題目、答案

image.image = UIImage(named: questions[value].image)questionNumber.text = “第\(question_count)題”Question.text = questions[value].questionright_answer = questions[value].answer

*移除此數

number.remove(at: random_number)

C. 隨機排序選項

*方法與隨機選題一樣,先建立一個代表選項編號的array,從上到下四個選項的編號為0,1,2,3

var choice_index = [0,1,2,3]

*用for loop跑四個選項,範圍從0~選項數-1,此處跑的數字會用在儲存選項的array的index(因為我的四個選項是存成array),最後移除掉

for i in 0..<buttons.count{let random_number_for_choice_index = Int(arc4random_uniform(UInt32(choice_index.count)))let choice_value = choice_index[random_number_for_choice_index]buttons[i].setTitle(questions[value].choice[choice_value], for: .normal)choice_index.remove(at: random_number_for_choice_index)}

6 建立選項按鈕(4個都一樣)

此處有兩個判斷

*如果選對了,就加十分

if sender.currentTitle == right_answer{score = score + 10}

*如果題數已達到10題,就顯示得分及再玩一次按鈕(一開始我設為Hidden),未達10題則繼續顯示題目

if question_count == 10{show_alertController()//show out play_again buttonPlay_Again_Outlet.isHidden = false}else{//continue showing questionshowQuestion()}

得分部分我用AlertController顯示

7 建立AlertController function — show_alertController()

func show_alertController(){//make an alertControllerlet alertController = UIAlertController(title: “測驗結束”,message: “得分為\(score)分(滿分100)”,preferredStyle: .alert)//make[確認]buttonlet okAction = UIAlertAction(title: “確認”,style: .default,handler:{(action: UIAlertAction!) -> Void in})alertController.addAction(okAction)//show the alertControllerself.present(alertController, animated: true, completion: nil)}

8 建立再玩一次按鈕

首先先將用到的變數恢復成初始值,再開始顯示題目,並且再玩一次按鈕要再度隱藏

@IBAction func playAgain(_ sender: Any){initialize()showQuestion()//hide the play_again buttonPlay_Again_Outlet.isHidden = true}

9 初始化function — initialize()

將number array恢復0~19的內容,題數及得分設為0

func initialize(){number = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]question_count = 0score = 0}

Github:

--

--