jeudi 4 juin 2015

Displaying random questions by looping through a dictionary

I started to learn swift by trying to make a quiz game. But i'm stuck at trying to display random questions from an dictionary. The reason why i use a dictionary is because the quiz i'm working on is based on chemistry elements which has different symbols.

So Based on the selected difficulty i created four different dictionaries:

//Defining the dictionaries per difficulty
var easy: [String: String] = [
    "H": "Waterstof",
    "He": "Helium",
    "Li": "Lithium",
    "B": "Boor",
    "C": "Koolstof",
    "O": "Zuurstof",
    "Ne": "Neon",
    "Al": "Aliminium",
    "Si": "Silicium",
    "K": "Kalium",
    "Fe": "Ijzer",
    "Ni": "Nikkel",
    "Zn": "Zink",
    "Cd": "Cadmium",
    "I": "Jood"
]
var normal: [String: String] = [
    "N": "Stikstof",
    "F": "Fluor",
    "Na": "Natrium",
    "Mg": "Magnesium",
    "P": "Fosfor",
    "CI": "Chloor",
    "Ar": "Argon",
    "S": "Zwavel",
    "Ca": "Calcium",
    "Cu": "Koper",
    "Au": "Goud",
    "Br": "Broom",
    "Ag": "Zilver",
    "Pt": "Platina",
    "Ba": "Barium"
]

and so on.. (hard, extreme)

This is my viewDidLoad() method:

override func viewDidLoad() {

    switch (self.selectedDifficultyByUser){
        case "Makkelijk":// Means 'easy' in dutch
            //Assigning the easy dictionary to a temporary dictionary
            self.temp = self.easy
        case "Normaal":
            //Assigning the normal dictionary to a temporary dictionary
            self.temp = self.normal
        case "Moeilijk":
            //Assigning the hard dictionary to a temporary dictionary
            self.temp = self.moeilijk
        case "Extreem":
            //Assigning the extreme dictionary to a temporary dictionary
            self.temp = self.extreem
        default:
            println("Something went wrong")

    }

    super.viewDidLoad()
    self.answers = [self.btn1, self.btn2, self.btn3, self.btn4]

    pickRandomElement()
    randomizeAnswers()

    let updateTime : Selector = "updateTime"
    timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: updateTime, userInfo: nil, repeats: true)
    startTime = NSDate.timeIntervalSinceReferenceDate()

}

As you can see i'm assigning all my buttons to the array 'answers' which i will be looping through soon.

The function pickRandomElement will then be called, which looks like this:

func pickRandomElement() -> () {
    //First here we make sure that the 'answerOptions' Array is cleared,
    //Because it could cause that the correct answer won't be showed.
    answerOptions = [String]()


    if self.selectedDifficultyByUser == "Makkelijk" {
        let index: Int = Int(arc4random_uniform(UInt32(easy.count)))

        let symbol = Array(easy.keys)[index]
        let element = Array(easy.values)[index]

        self.currentQuestion = symbol
        self.correctAnswer = element

        //Assign the correctAnswer to the answerOptions array
        self.answerOptions.append(element)

        //Show the question to the user
        self.questionLabel.text = self.currentQuestion

        //remove the correctanswer from the dictionary, to
        //make sure that the answers won't be duplicated
        self.easy[symbol] = nil
        self.easy[element] = nil

        for (var i = 0; i < 3; i++) {
            let randomIndex: Int = Int(arc4random_uniform(UInt32(easy.count)))

            let optionSymbol = Array(easy.keys)[randomIndex]
            let optionElement = Array(easy.values)[randomIndex]

            self.answerOptions.append(optionElement)

            //Removing 'optionSymbol' and 'optionElement' from the array
            //to prevent duplicated answer
            self.easy[optionElement] = nil
            self.easy[optionSymbol] = nil
        }
        self.easy = self.temp //Filling the 'easy' array with the temporary array

    }
}

The problem i'm having is in the for loop shown above. I'm looping three times to pick random elements and show them to the user. And during this process i'm deleting the randomly chosen elements from the (easy) array to prevent duplicate answer. And because i'm removing those elements from the easy array i'm assigning the temporary array, which i created in the begin, back to the easy array.

If i don't do this, the whole easy array will be empty after three rounds or so. If i do the opposite i will get an infinte loop.

Can someone please put me in the right direction if i'm doing this the wrong way or help me out of this problem?

Thanks in advance!




Aucun commentaire:

Enregistrer un commentaire