2017-07-13 5 views
4

私は質問と回答の定数配列を持っているクイズアプリを開発しています。回答の選択肢は、対応する質問と同じインデックスを持つことによって質問に関連付けられます(たとえば、回答配列の最初の回答選択肢は、質問配列の最初のインデックスなどになります)。しかし、私は質問配列から質問される質問の選択を無作為化していますが、対応する回答は表示されている正しい質問では表示されません。何が正しい選択肢を持っているかについての最良の方法は、ランダムに選択されて表示される質問に表示されますか?また、クイズが失敗してリセットされるまで、すでに回答済みの質問がランダムに選択されないようにするにはどうすればよいですか?ありがとう。クイズアプリに正しい回答の選択肢が表示されるようにするにはどうすればよいですか?

import UIKit 

class ViewController:UIViewController { 
    //random question generation function 
    func randomQuestion() { 
     index = Int(arc4random_uniform(UInt32(questions.count))) 
     questionLabel.text = questions[index] 
    } 

    //costants 
    let questions = ["Who is Thor's half brother?", "What is the name of Thor's hammer?"] 
    var answers = [["Atum", "Loki", "Red Norvell", "Kevin Masterson"], ["Mjolinr", "Uru", "Stormbreaker", "Odin's Staff"]] 

    //variables 
    var currentQuestion = 0 
    var rightAnswerBox:UInt32 = 0 
    var index = 0 

    //Question Label 
    @IBOutlet weak var questionLabel: UILabel! 

    //Answer Button 
    @IBAction func buttonAction(_ sender: AnyObject) { 
     if (sender.tag == Int(rightAnswerBox)) { 
      print ("Correct!") 
     } else { 
      wrongSeg() 
      print ("Wrong!") 
     } 

     if (currentQuestion != questions.count) 
     { 
      newQuestion() 
     } 
    } 

    override func viewDidAppear(_ animated: Bool) 
    { 
     newQuestion() 
    } 

    //function that displays new question 
    func newQuestion() 
    { 
     //countdown timer section 
     randomQuestion() 

     rightAnswerBox = arc4random_uniform(4)+1 

     //create a button 
     var button:UIButton = UIButton() 

     var x = 1 

     for index in 1...4 
     { 
      //creat a button 
      button = view.viewWithTag(index) as! UIButton 

      if (index == Int(rightAnswerBox)) 
      { 
       button.setTitle(answers[currentQuestion][0], for: .normal) 
      } else { 
       button.setTitle(answers[currentQuestion][x], for: .normal) 
       x += 1 
      } 
     } 

     currentQuestion += 1 
     randomImage() 
    } 

答えて

1

私はより適切なデータ構造を使用することをお勧めします:

は、ここに私のコードです。あなたはその後、質問配列をランダム

class Question { 
    var id: Int 
    var questionText: String 
    var answers: [String] 
    var answered = false 
} 

:よう

何か。あなたはあなたがいるインデックスを追跡し、配列が終わるまで前方に移動します。

ループの最後で、どの質問に答えがなかったのかを確認し、回答のあるものを削除(または新しいアレイの作成)して、プロセスを繰り返します。あなたは、アレイ

var questions = [Question]() 

//populate the array 

    for (index, question) in questions.enumerated() { 
     //This returns the question as well as the current index 
    } 
+0

質問が既に回答された後に質問が繰り返されないようにするために、インデックスを追跡するにはどうすればよいですか? –

+0

をアレイから削除し、新しいアレイをトラバースすることができます。または、それらを回答としてマークし、あなたのランダムな選択で無視することができます。 – scord

+0

また、配列のクラスを操作しやすくするために、Structの代わりにClassを使用するように質問を編集しました。 – scord

1

1.構造体を作る

を列挙することができます

これは、後にシャッフルしたときに、質問と回答の配列は、便利なパッケージ化することができます。

struct Question { 
    var id: Int 
    var questionText: String 
    var answers: [String] 
} 

var example = Question(id: 1, questionText: "Foo?", answers:["1", "2", "3", "4"]) 
var id = example.id 
var questionText = example.questionText 
var answers = example.answers 

2.今O(N)時間のでFisher-Yates Shuffle

クールを使用して質問の配列をランダム化します。

var question1 = Question(id: 1, questionText: "Foo?", answers:["1", "2", "3", "4"]) 
var question2 = Question(id: 2, questionText: "Bar?", answers:["1", "2", "3", "4"]) 
var question3 = Question(id: 3, questionText: "Baz?", answers:["1", "2", "3", "4"]) 
var question4 = Question(id: 4, questionText: "What is after Baz?", answers:["1", "2", "3", "4"]) 

var questions = [question1, question2, question3, question4] 

for i in 0..<questions.count-2 { 
    var rand = Int(arc4random_uniform(questions.count - i)) 
    var copy = questions[i] 
    questions[i] = questions[rand] 
    questions[rand] = copy 
} 

print(questions) // shuffled 
+0

これは成功したこの問題を処理する方法のようですが、私のアプリは600以上の質問を含んでいますので、 「質問」とラベル付けされた変数が最も効率的な方法になります。 –

関連する問題