問題を重複せずにランダムに出題させたい
プログラミングを始めて1ヶ月ほどの入門者です。
Swift 4で、クイズアプリを作成中です。
クイズアプリの問題を重複せずにランダムに出題させたいのですが、同じ問題が繰り返されてしまい、うまくいきません。
問題を重複せずにランダムに出題させる方法を教えていただける方がおられましたらご教授願います。
LabelQuestionに問題、Button1〜Button3に問題の答えを用意し、選択した答えが正解かどうかをLabelCommentに表示させ、ButtonNextQuestionを押して次の問題と答えを表示させるというものです。
コードは以下のとおりです。
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var LabelQuestion: UILabel!
@IBOutlet weak var Button1: UIButton!
@IBOutlet weak var Button2: UIButton!
@IBOutlet weak var Button3: UIButton!
@IBOutlet weak var LabelComment: UILabel!
@IBOutlet weak var ButtonNextQuestion: UIButton!
var correctAnswer = String()
override func viewDidLoad() {
super.viewDidLoad()
randomQestions()
hide()
ButtonNextQuestion.setTitle("NEXT QUESTION", for: UIControlState.normal)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func randomQestions(){
var question = ["case 1", "case 2", "case 3", "case 4"]
var result:[String] = []
for _ in 0...3 {
let randomNumber = Int(arc4random() % UInt32(question.count))
result.append(question[randomNumber])
question.remove(at: (randomNumber))
switch (randomNumber) {
case 1:
LabelQuestion.text = "1+1=?"
Button1.setTitle("1", for: UIControlState.normal)
Button2.setTitle("2", for: UIControlState.normal)
Button3.setTitle("3", for: UIControlState.normal)
correctAnswer = "1"
break
case 2:
LabelQuestion.text = "3+3=?"
Button1.setTitle("4", for: UIControlState.normal)
Button2.setTitle("5", for: UIControlState.normal)
Button3.setTitle("6", for: UIControlState.normal)
correctAnswer = "3"
break
case 3:
LabelQuestion.text = "4+4=?"
Button1.setTitle("7", for: UIControlState.normal)
Button2.setTitle("8", for: UIControlState.normal)
Button3.setTitle("9", for: UIControlState.normal)
correctAnswer = "2"
break
case 4:
LabelQuestion.text = "6+6=?"
Button1.setTitle("10", for: UIControlState.normal)
Button2.setTitle("11", for: UIControlState.normal)
Button3.setTitle("12", for: UIControlState.normal)
correctAnswer = "3"
break
default:
break
}
}
}
func hide() {
LabelComment.isHidden = true
}
func unhide() {
LabelComment.isHidden = false
}
@IBAction func Button1Action(_ sender: Any) {
unhide()
if (correctAnswer == "1") {
LabelComment.text = "◯"
} else {
LabelComment.text = "×"
}
}
@IBAction func Button2Action(_ sender: Any) {
unhide()
if (correctAnswer == "2") {
LabelComment.text = "◯"
} else {
LabelComment.text = "×"
}
}
@IBAction func Button3Action(_ sender: Any) {
unhide()
if (correctAnswer == "3") {
LabelComment.text = "◯"
} else {
LabelComment.text = "×"
}
}
@IBAction func ButtonNextQuestion(_ sender: Any) {
randomQestions()
hide()
}
}
宜しくお願いいたします。
<追記>
ご回答ありがとうございます。
教えていただいた
swiftでArrayを擬似乱数でshuffleする方法は?
を参考に書き換えてみたと言いますか、そのまま使用してみたところ3つエラーが出てしまいました。
エラーを解決しようと、countを消したり、0..<(count - 1)の数値を変えてみたりしたのですが、うまくいきません。
「var question = ["case 1", "case 2", "case 3", "case 4"]」から「switch (randomNumber) {」の間を書き換えたのが下記です。
var question = ["case 1", "case 2", "case 3", "case 4"]
extension Array {
mutating func shuffle() {
for i in 0..<(count - 1) {
let j = Int(arc4random_uniform(UInt32(count - i))) + i
swap(&self[i], &self[j])
}
}
switch (randomNumber) {
extension Array { のところに「Declaration is only valid at file scope」
for i in 0..<(count - 1) { のところに「Use of unresolved identifier 'count'」
switch (randomNumber) { のところに「Expected declaration」
という3つのエラーメッセージが出てしまいます。
エラーを消してシャッフルさせるには、どのようにコードを書き換えればよいでしょうか。
ご教授いただけたら幸いです。
宜しくお願いいたします。