2016-01-20 1 views
0

Я делаю игру Quiz/Trivia и задаю вопросы, хранящиеся в файле XML, и возникает случайный вопрос. Все работает отлично, но я хочу оставаться случайным, но не показывать тот же вопрос, пока не будет показан каждый вопрос.Случайные XML-вопросы с использованием Fisher-Yates Shuffle

public struct Question { 
public string questionText; 
public string answerA; 
public string answerB; 
public string answerC; 
public string answerD; 
public int correctAnswerID; 
} 

[XmlRoot("QuestionsRoot")] 
public class QuestionData { 
[XmlArray("Questions")] 
[XmlArrayItem("Question")] 
public List<Question>questions = new List<Question>(); 

public static QuestionData LoadFromText(string text) { 
try { 
    XmlSerializer serializer = new XmlSerializer(typeof(QuestionData));    
    return serializer.Deserialize(new StringReader(text)) as QuestionData; 
} catch (Exception e) { 
    UnityEngine.Debug.LogError("Exception loading question data: " + e); 
    return null; 
} 
} 

И я использую это в моем другом сценарии, чтобы получить случайный вопрос:

questionData = QuestionData.LoadFromText(questionDataXMLFile.text) 
q = Random.Range(0, questionData.questions.Count); 
currentQuestion = questionData.questions[q]; 
+0

Если вы спрашиваете, как реализовать рыболовство, существует множество примеров на этом сайте и в Википедии. Если вы действительно пытались его реализовать, нам нужно увидеть этот код, и вам нужно объяснить, что с ним не так. – Blorgbeard

+0

@Blorgbeard Я попытался с \t для (INT I = 1; я IvayloDev

+0

Так что используйте 'Question x' вместо' string x'. – Blorgbeard

ответ

0

Сделайте что-нибудь по следующим направлениям:

создать еще один список с имеющимися вопросами - отформатируйте ее на список всех вопросов:

questionData = QuestionData.LoadFromText(questionDataXMLFile.text) 

var available = new List<Question>(questionData.question); 
... 
} 

public Question GetNextQuestion() 
{ 
    if (available.Count == 0) 
     available.AddRange(questionData.question); 

    q = Random.Range(0, available.Count); 
    currentQuestion = available[q]; 
    available.RemoveAt(q); 

    return currentQuestion; 
} 
+0

Op упоминает перетасовку, которой это не так. Однако все равно будет работать. – Blorgbeard

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