2017-05-26 19 views
0

私は簡単なクイズアプリを作成しています。 4つの選択肢があり、選択肢の配置はランダムに生成されます。 4つのUILabelsが選択肢を表示するように設定されています。arc4random_uniform()を使った簡単なクイズ

私は以下のコードを書いており、通常はうまくいくが、時には同じ選択肢が表示されることがある。

EX)2017 2015 2015 1700

エラーがループのためにする必要がありますが、私は把握することはできません。

let questions = ["What year is now?"] 
let answers = [["2017", "2015", "1000", "1700"]] 
var rightAnswerPlacement:UInt32 = 0 
var currentQuestion = 0 

//Function that displays new question 
func newQuestion() 
{ 
    lbl.text = questions[currentQuestion]   
    rightAnswerPlacement = arc4random_uniform(4)+1   
    // Create a button 
    var button:UIButton = UIButton() 
    var x = 1   
    for i in 1...4 
    { 
     //Create a button 
     button = view.viewWithTag(i) as! UIButton 
     if (i == Int(rightAnswerPlacement)) 
     { 
      button.setTitle(answers[currentQuestion][0], for: .normal) 
     } 
     else 
     { 
      button.setTitle(answers[currentQuestion][x], for: .normal) 
      x = 2 
     } 
    } 
    button.setTitle(answers[currentQuestion][3], for: .normal) 
    currentQuestion += 1 
} 
+0

'currentQuestion'はどこに値を取得しますか? 'answers'で値を調べるのにそれを使用しますが、決して値を割り当てません。 –

+0

申し訳ありません私の質問を更新しました – rebecca87

+0

私が正しく理解していれば、最初の答え(右のもの)をランダムに配置し、他の3つをランダムに配置したいのですか?ループの4回の反復(btw。固定数として4を使用せず、回答配列のサイズを確認します)では、4つのボタンを作成しますが、xインデックスカウントでは答えの1つをスキップすることがあります。また、あなたは[currentQuestion] [3] – Gerriet

答えて

2

非常に一般的な方法は、 "シャッフル" の答えです。そして、あなたはどのif S行う必要はありません。

let questions = [ 
    "What year is now?", 
    "What is your favorite color?" 
] 

let answers = [ 
    ["2017", "2015", "1000", "1700"], 
    ["Blue", "Red", "Yellow", "Green"] 
] 

var currentQuestion = 0 

//Function that displays new question 
func newQuestion() 
{ 
    // get the current question text 
    let thisQuestion = questions[currentQuestion] 

    // get a "shuffled" array of the current answers 
    let theseAnswers = answers[currentQuestion].shuffled() 

    lbl.text = thisQuestion 

    // loop through the shuffled answers, setting the button titles 
    for (i, answer) in theseAnswers.enumerated() { 
     if let button = view.viewWithTag(i) as? UIButton { 
      button.setTitle(answer, for: .normal) 
     } 
    } 

} 

を、あなたはnewQuestion()答えを呼び出すたびにランダムな順序になります。


アレイシャッフリングの多くの例があります - これは(How do I shuffle an array in Swift? ...ここでは "Nate Cook" から)良い例です。

extension MutableCollection where Indices.Iterator.Element == Index { 
    /// Shuffles the contents of this collection. 
    mutating func shuffle() { 
     let c = count 
     guard c > 1 else { return } 

     for (firstUnshuffled , unshuffledCount) in zip(indices, stride(from: c, to: 1, by: -1)) { 
      let d: IndexDistance = numericCast(arc4random_uniform(numericCast(unshuffledCount))) 
      guard d != 0 else { continue } 
      let i = index(firstUnshuffled, offsetBy: d) 
      swap(&self[firstUnshuffled], &self[i]) 
     } 
    } 
} 

extension Sequence { 
    /// Returns an array with the contents of this sequence, shuffled. 
    func shuffled() -> [Iterator.Element] { 
     var result = Array(self) 
     result.shuffle() 
     return result 
    } 
} 
+0

ありがとうございます: – rebecca87

1

x = x + 1x = 2を交換してください。あなたは、特定のものを選ぶのではなく、答えをスキップします。

これを行うと、[currentQuestion][3]の特別なケースは必要ありません。

+0

ありがとうございました:) – rebecca87

関連する問題