ホーリーのプログラミング日記

ホーリーのプログラミング日記

エキセントリック・スーパーアプリクリエイター / アプリ総DL数 約180万 / 全然分からない 俺は雰囲気でアプリを作ってる / iOS : apple.co/3m3HxSm / Android : bit.ly/3ma0liZ

クイズアプリで答えの順番をランダムにする方法(Swift)

 

前回、簡単なクイズアプリの作り方を書きました。

Swiftで作るクイズアプリ - ホーリーのプログラミング日記

 

ほとんどJared Davidsonさんにおんぶ抱っこな内容なんですが、ここに答えをランダムにする方法を書いてなかったので、ちょっと書いてみます。

 

モザイクアートクイズ

僕はガチニート適性試験のあとに、モザイクアートクイズってアプリを出したんですが、これは答えの順番がランダムになってるんですよ。

全部4択なんですが、毎回答えが並ぶ順番が違います。

 

f:id:gevvoihorry:20160620202950j:plain

 

今だとモノリス→俺の彼女→モナリザモナコの順に並んでますね。

これが俺の彼女→モノリスモナコモナリザとか。またはモナリザモナコモノリス→俺の彼女、みたいな順番にランダムに変わるようにしたかったんです。

 

配列のシャッフル

毎回順番をランダムにするってことで、とりあえずは前回使った配列のシャッフルから。

もっといい方法があるのかもしれないですけど、僕のレパートリーはこれだけです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]なのか、誰にも分かりません。とにかくランダムになっています。

 

そして回答の配列も用意します。この場合はこんなやつ。

 

var answerArray = ["モナリザ","モノリス","モナコ","俺の彼女"]

 

んで、これは全部の問題に共通なんですが、正解を一番前にします。

別に一番前である必要はないんですが、分かりやすいんで、僕はそうしました。

これは正解の判定に関わってきます。

 

ボタンに答えをセット

正解の判定を書く前に、ボタンの設定をば。

 

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で作るクイズアプリってやつと合わせれば、大体のクイズはなんでも作れるんじゃないでしょうか。

興味のある人は、一度試してみてください。