クイズアプリで答えの順番をランダムにする方法(Swift)
前回、簡単なクイズアプリの作り方を書きました。
Swiftで作るクイズアプリ - ホーリーのプログラミング日記
ほとんどJared Davidsonさんにおんぶ抱っこな内容なんですが、ここに答えをランダムにする方法を書いてなかったので、ちょっと書いてみます。
モザイクアートクイズ
僕はガチニート適性試験のあとに、モザイクアートクイズってアプリを出したんですが、これは答えの順番がランダムになってるんですよ。
全部4択なんですが、毎回答えが並ぶ順番が違います。
今だとモノリス→俺の彼女→モナリザ→モナコの順に並んでますね。
これが俺の彼女→モノリス→モナコ→モナリザとか。またはモナリザ→モナコ→モノリス→俺の彼女、みたいな順番にランダムに変わるようにしたかったんです。
配列のシャッフル
毎回順番をランダムにするってことで、とりあえずは前回使った配列のシャッフルから。
もっといい方法があるのかもしれないですけど、僕のレパートリーはこれだけですw
var array = [0,1,2,3]
var result:[Int] = []
let cnt = array.count
for(var i=0; i<cnt; i++){
let idx = Int(arc4random() % UInt32(array.count))
result.append(array[idx])
array.removeAtIndex(idx)
}
arrayとresultっていう2つの配列を用意して、arrayに入ってる値を順不同でresultに移します。
答えを4択にしたかったので、0〜3、4つの数字を入れました。
この時点でresultの中は[2,3,1,0]なのか[0,3,1,2]なのか、誰にも分かりません。とにかくランダムになっています。
そして回答の配列も用意します。この場合はこんなやつ。
んで、これは全部の問題に共通なんですが、正解を一番前にします。
別に一番前である必要はないんですが、分かりやすいんで、僕はそうしました。
これは正解の判定に関わってきます。
ボタンに答えをセット
正解の判定を書く前に、ボタンの設定をば。
answer1Button.setTitle(answerArray[result[0]], forState: UIControlState.Normal)
answer2Button.setTitle(answerArray[result[1]], forState: UIControlState.Normal)
answer3Button.setTitle(answerArray[result[2]], forState: UIControlState.Normal)
answer4Button.setTitle(answerArray[result[3]], forState: UIControlState.Normal)
answer1Button〜answer4Buttonっていう適当な名前になってますが、もちろんなんでもいいです。適当に宣言しておいてください。
んで、さっきのresultって配列から、値を順番に入れます。
これで各ボタンに用意しておいた答えがランダムに入ってますね。
正解の判定
肝心の正解は、ループ文で判定してあげればいいでしょう。
上記したanswerArrayの配列は、常に先頭に正解が入っています。
なので、answerArray[result[i]]が0になるところを判定してあげればいいんです。
var correctAnswer = 0
〜 省略 〜
let max = result.count
for(var i=0;i<max;i++){
if(result[i] == 0){
correctAnswer = i
}
}
var correctAnswer = 0っていうのは、値の初期化ですね。
これでcorrectAnswer、正解の数字が決まりました。
画面の遷移(移動)
僕は正解と不正解の画面を用意して、そこに遷移するように作りました。
goodsegueとbadsegueっていうのがそれですね。
@IBAction func Answer1Button(sender: AnyObject) {
if(correctAnswer == 0){
self.performSegueWithIdentifier("goodSegue", sender: nil)
}else{
self.performSegueWithIdentifier("badSegue", sender: nil)
}
}
@IBAction func Answer2Button(sender: AnyObject) {
if(correctAnswer == 1){
self.performSegueWithIdentifier("goodSegue", sender: nil)
}else{
self.performSegueWithIdentifier("badSegue", sender: nil)
}
}
@IBAction func Answer3Button(sender: AnyObject) {
if(correctAnswer == 2){
self.performSegueWithIdentifier("goodSegue", sender: nil)
}else{
self.performSegueWithIdentifier("badSegue", sender: nil)
}
}
@IBAction func Answer4Button(sender: AnyObject) {
if(correctAnswer == 3){
self.performSegueWithIdentifier("goodSegue", sender: nil)
}else{
self.performSegueWithIdentifier("badSegue", sender: nil)
}
}
例えば一番上の選択肢、このボタンを押したとき、correctAnswer == 0 になってたら、このボタンが正解ってことですね。
正解だったらgoodSegueに遷移して、不正解ならbadSegueへ。そんなコードです。
ここまで実際に書いてもらえば分かるんですが、4択で答えの順番がランダムになっていて、正解不正解の判定が出来るようになっています。
読むだけだと、ちょっと分かりにくいかもしれませんが、書けば分かるかと思います。
時間とともにモザイクを薄くする方法
これは今回のタイトルとは全く関係ないんですが、一応モザイクアートクイズはそういうゲームなんですよ。時間とともにモザイクが薄くなるっていう。
なので、ちょっとその方法も書いておきます。
先に結論から言うと、これもパクリです。教科書に書いてあることを、そのままパクって実装しました。
(元が教科書だけに、パクるって表現は変か。教科書なんてパクってなんぼ、パクれない教科書に価値はないですもんね)
iPhoneのゲームアプリをつくろう!って本の中に、モグラ叩きゲームを作るところがあるんです。んで、そこで決まった秒数ごとに関数を実行するコードが出てくるんですよ。
だからそれを真似して、1秒ごとに画像が切り替わるようにしてみました。
丸投げなんですが、詳しくはその教科書を見てください。
最後に
僕はこんな感じに4択クイズを作ってみました。前回書いたSwiftで作るクイズアプリってやつと合わせれば、大体のクイズはなんでも作れるんじゃないでしょうか。
興味のある人は、一度試してみてください。