2015-05-11 5 views
0

Я знаю, что есть некоторые решения с тасованием или что-то в этом роде, но я не знаю, могу ли я применить их в своем коде. Не могли бы вы мне помочь? Как я могу не повторять вопросы?Сделать приложение Quiz не повторять случайные вопросы

func RandomQuestions(){ 

    var RandomNumber = arc4random() % 28 
    RandomNumber += 1 

    switch(RandomNumber){ 
    case 1: 
     QuestionLabel.text = "Who is the Numer One Best DJ According to DJ Mag 2014?" 
     Button1.setTitle("Tiësto", forState: UIControlState.Normal) 
     Button2.setTitle("Avicii", forState: UIControlState.Normal) 
     Button3.setTitle("Hardwell", forState: UIControlState.Normal) 
     Button4.setTitle("Dimitri Vegas & Like Mike", forState: UIControlState.Normal) 
     CorrectAnwser = "3" 
     break 
    case 2: 
     QuestionLabel.text = "Who is the Only DJ that played in an Olimpic Games?" 
     Button1.setTitle("Avicii", forState: UIControlState.Normal) 
     Button2.setTitle("Tiësto", forState: UIControlState.Normal) 
     Button3.setTitle("Armin Van Buuren", forState: UIControlState.Normal) 
     Button4.setTitle("Calvin Harris", forState: UIControlState.Normal) 
     CorrectAnwser = "2" 
     break 
    } 

    /* ...more questions...*/

} 
+0

Что такое exa Твой вопрос здесь? – Eendje

+0

Если есть код, поэтому вопросы не повторяются (спасибо за вопрос) @JacobsonTalom – nicolasxviii

+0

из-за причин грамматики я удалил свой ответ - Спасибо за удивительный урок @fogmeister –

ответ

4

нужен Ваш код будет переформатирован, держа его таким образом (тот, вы предлагаете) вы будете в конечном итоге добавив огромные bunchs кода каждый раз, когда вам нужно добавить новый вопрос. Пожалуйста, обратите внимание делать это таким образом:

class Question{ 
let question : String 
let optionA: String 
let optionB: String 
let optionC: String 
let optionD: String 
let correctAnswer: Int 

//add initializers here. 
} 

или

class Question{ 
let question : String 
let options: [String] 
let correctAnswer: Int 

//add initializers here. 
} 

тогда функция

class QuestionRepository{ 
private var questions: [Question] 

/// use this to load questions to be asked only once per game, this way you will end up having the order in which you will ask questions and there will be no repetitions. 
var readyToAskQuestions : [Question] { 
    let shuffledQuestions = shuffle(questions) 
    return shuffledQuestions 
}  

init() 
    { 
    //build your harcoded 'questions' variable here 
    } 

convenience init(url: String) 
{ 
    //or load your questions from a file, NSUserDefaults, database sql file, from a webservice on the internet, etc.. 
} 
} 

Перемешать заявил здесь может быть любой из указанных в ответах на sorting arrays in swift

+0

Большое спасибо всем, и я действительно не понимаю, почему люди не любят хорошую работу, как это, явная вещь из этого заключается в том, чтобы получить помощь не судить – nicolasxviii

+1

@nicolasxviii Я вижу, что ваш принятый вопрос поднял спорную дискуссию на этом посту, вы всегда можете удалить принятый ответ и назначить его другому ответу. Как всегда, поскольку вы уверены, что ответ действительно лучше. –

2

Мои answer на другую должность:

var someArray = Array(1...28) 

let index = Int(arc4random_uniform(UInt32(someArray.count))) 
let randomNumber = someArray[index] 

someArray.removeAtIndex(index) 

И тогда вы можете передать randomNumber вашей функции:

func randomQuestions(question: Int) { 
    switch(question) { 
    case 1: // Question1 
    case 2: // Question2 
} 
+0

Хорошо, спасибо, пожалуйста, скажите мне, когда вы найдете его @JacobsonTalom – nicolasxviii

+0

Отредактированный ответ, это должно сработать. – Eendje

+0

что я могу сделать? здесь – nicolasxviii

1

Попытка сделать arc4random() не повторять не правильный путь Посмотрите на эту проблему. Вы хотите не задавать один и тот же вопрос дважды, поэтому вам нужно как-то отслеживать уже заданные вами вопросы. Я рекомендую использовать массив и, возможно, каждый вопрос задавать тип идентификатора, а затем хранить каждый идентификатор вопроса в массиве и удалять их или перемещать их в новый массив «заданных вопросов» по ​​мере их запроса.

+0

Не могли бы вы показать мне, как? @Will – nicolasxviii

-3

Я хотел бы добавить переменную, которая будет содержать уже заданные вопросы на контроллере представления:

var askedQuestions = [Int]() 

Затем в функции вы можете сделать что-то вроде:

func RandomQuestions(){ 

    var randomNumber:Int = (Int)(arc4random() % 28 + 1) 

    while find(askedQuestions, randomNumber) != nil && askedQuestions.count < 28 { 
     randomNumber = (Int)(arc4random() % 28 + 1) 
    } 

    if askedQuestions.count > 28 { 
     return 
    } 

    askedQuestions.append(randomNumber) 

    switch(randomNumber){ 
    case 1: 
     QuestionLabel.text = "Who is the Numer One Best DJ According to DJ Mag 2014?" 
     Button1.setTitle("Tiësto", forState: UIControlState.Normal) 
     Button2.setTitle("Avicii", forState: UIControlState.Normal) 
     Button3.setTitle("Hardwell", forState: UIControlState.Normal) 
     Button4.setTitle("Dimitri Vegas & Like Mike", forState: UIControlState.Normal) 
     CorrectAnwser = "3" 
     break 
    case 2: 
     QuestionLabel.text = "Who is the Only DJ that played in an Olimpic Games?" 
     Button1.setTitle("Avicii", forState: UIControlState.Normal) 
     Button2.setTitle("Tiësto", forState: UIControlState.Normal) 
     Button3.setTitle("Armin Van Buuren", forState: UIControlState.Normal) 
     Button4.setTitle("Calvin Harris", forState: UIControlState.Normal) 
     CorrectAnwser = "2" 
     break 
    } 

    /* ...more questions...*/ 

} 

Также обратите внимание, что у вас есть чтобы заботиться о том, что происходит, когда у вас заканчиваются все 28 вопросов. :)

PS: Лучше не использовать имена капитализированных переменных, такие как RandomNumber. Вместо этого используйте randomNumber. Это хорошая практика. :)

+0

, что приводит к бесконечной петле в конце –

+0

Вы даже прочитали то, что я написал? Да, как только задано 28 вопросов, это не сработает. Я не знаю, что такое прецедент и что произойдет, как только все закончится. Началось ли это? Игра закончилась? Не знаю ... Не знаете, почему вы должны ответить на этот вопрос. :) – Jure

+0

вы бежите в бесконечном цикле и НЕ ТОЛЬКО после того, как это будет сделано, но как только будут дублированы вопросы. Просто исправьте его как неподвижную шахту, и это нормально –

3

Худший способ приблизиться к этому - сохранить генерацию случайных чисел и «отслеживать» числа, которые уже были использованы. Для набора из 100 вопросов вам нужно будет скопировать последнее случайное число в среднем 100 раз, чтобы получить последний доступный вопрос.

Самый простой способ сделать что-то подобное - просто перетасовать массив перед его использованием, а затем выполнить его по порядку.

Вы можете увидеть реализацию перетасовки Fisher-Yates в этом ответе ... How do I shuffle an array in Swift?

Тогда это просто случай переборе массива ...

for question in shuffledArray { 
    // ask question 
} 

Можно даже создать генератор для него, который позволит вам получить вопрос next и так далее.

Кроме того, вы идете по неправильному пути с помощью переключателя и включения случайного значения.

Создать объект Вопрос, который имеет свойства ... questionText, ОПЦИЯ1, параметр2, CorrectAnswer ... и т.д. ...

Можно даже создать массив опций и хранить correctAnswerIndex рядом с ним.

Затем вставьте все объекты Question в массив. Еще лучше, поместите их в файл plist, чтобы вы могли прочитать их во время выполнения. Гораздо легче управлять этим способом.

Смежные вопросы