2013-05-23 3 views
1

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

У меня есть список массивов, в котором вопросы сохраняются и извлекаются для отображения. Каждый объект, сохраненный в списке массивов, содержит 5 строк.

  • Вопрос
  • Правильный ответ
  • Неправильный ответ 1
  • Неправильный ответ 2
  • Неправильный ответ 3

Как можно произвольно выбирать объекты из списка массива, который будет отображаться на экран? И как я могу перетасовать 4 ответа (как переключатели), так что правильный ответ появляется в разных положениях каждый раз?

namespace quiz 
{ 
    public partial class Quiz : Form 
    { 
     private ArrayList Questionslist; 

     public Quiz(ArrayList list) 
     { 
      InitializeComponent(); 
      Questionslist = list; 
     } 

     int index = 0; 
     private void Quiz_Load(object sender, EventArgs e) 
     { 
      //creating an object of class Question and copying the object at index1 from arraylist into it 
      Question q = (Question)Questionslist[index]; 
      //to display the contents 
      lblQs.Text = q.Quest; 
      radioButtonA1.Text = q.RightAnswer; 
      radioButtonA2.Text = q.WrongAnswer1; 
      radioButtonA3.Text = q.WrongAnswer2; 
      radioButtonA4.Text = q.WrongAnswer3;    
     } 

     private int Score = 0; 

     private void radioButtonA1_CheckedChanged(object sender, EventArgs e) 
     { 
      //if checkbox is checked 
      //displaying text in separate two lines on messagebox 
      if (radioButtonA1.Checked == true) 
      { 
       MessageBox.Show("Well Done" + Environment.NewLine + "You Are Right"); 
       Score++; 
       index++; 

       if (index < Questionslist.Count) 
       { 
        radioButtonA1.Checked = false; 
        radioButtonA2.Checked = false; 
        radioButtonA3.Checked = false; 
        radioButtonA4.Checked = false; 
        Quiz_Load(sender, e); 
       } 
       else 
       { 
        index--; 
        MessageBox.Show("Quiz Finished" + Environment.NewLine + "your Score is" + Score); 
        Close(); 
       } 
      } 
     } 

     private void radioButtonA2_CheckedChanged(object sender, EventArgs e) 
     { 
      if (radioButtonA2.Checked == true) 
      { 
       MessageBox.Show("Sorry" + Environment.NewLine + "You Are Wrong"); 
       Close(); 
      } 
     } 

     private void radioButtonA3_CheckedChanged(object sender, EventArgs e) 
     { 
      if (radioButtonA3.Checked == true) 
      { 
       MessageBox.Show("Sorry" + Environment.NewLine + "You Are Wrong"); 
       Close(); 
      } 
     } 

     private void radioButtonA4_CheckedChanged(object sender, EventArgs e) 
     { 
      if (radioButtonA4.Checked == true) 
      { 
       MessageBox.Show("Sorry" + Environment.NewLine + "You Are Wrong"); 
       Close(); 
      } 
     } 
    } 
} 

это код класса вопрос

namespace quiz 
{ 
    [Serializable()] 
    public class Question : ISerializable 
    { 
     public String Quest; 
     public String RightAnswer; 
     public String WrongAnswer1; 
     public String WrongAnswer2; 
     public String WrongAnswer3; 

     public Question() 
     { 
      Quest = null; 
      RightAnswer=null; 
      WrongAnswer1=null; 
      WrongAnswer2=null; 
      WrongAnswer3=null; 
     } 

     //serialization function 
     public void GetObjectData(SerializationInfo info, StreamingContext context) 
     { 
      info.AddValue("Question", Quest); 
      info.AddValue("Right Answer", RightAnswer); 
      info.AddValue("WrongAnswer1",WrongAnswer1); 
      info.AddValue("WrongAnswer2",WrongAnswer2); 
      info.AddValue("WrongAnswer3",WrongAnswer3); 
     } 

     //deserializaton constructor 
     public Question(SerializationInfo info, StreamingContext context) 
     { 
      Quest = (String)info.GetValue("Question", typeof(String)); 
      RightAnswer=(String)info.GetValue("Right Answer",typeof(String)); 
      WrongAnswer1=(String)info.GetValue("WrongAnswer1",typeof(String)); 
      WrongAnswer2=(String)info.GetValue("WrongAnswer2",typeof(String)); 
      WrongAnswer3=(String)info.GetValue("WrongAnswer3",typeof(String)); 
     }  
    } 
} 
+1

Как выглядит ваш текущий код? – LukeHennerley

+1

Вы считали, что ищете «Случайный»? –

+10

На самом деле нет причин использовать 'ArrayList', и вы должны структурировать свои вопросы с соответствующими ответами в классе, который может лучше описать модель данных. – Yuck

ответ

1

Вы знаете, какой из них является «правильным» ответом на основе свойства Text. Один из подходов будут хранить ответы в массиве и перетасовать массив перед назначением его радиокнопки:

// You're going to make questionList a List<Question> because if you like 
// Right answers you know that ArrayList is Wrong. 
Question q = questionList[index]; 

// You should move this next bit to the Question class 
string[] answers = new string[] 
    { 
     q.RightAnswer, 
     q.WrongAnswer1, 
     q.WrongAnswer2, 
     q.WrongAnswer3 
    }; 

// Using the Fisher-Yates shuffle from: 
// http://stackoverflow.com/questions/273313/randomize-a-listt-in-c-sharp 
Shuffle(answers); 

// Ideally: question.GetShuffledAnswers() 

radioButtonA1.Text = answers[0]; 
radioButtonA2.Text = answers[1]; 
radioButtonA3.Text = answers[2]; 
radioButtonA4.Text = answers[3]; 

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

private void radioButton_CheckedChanged(object sender, EventArgs e) 
{ 
    RadioButton rb = (RadioButton)sender; 
    Question q = questionList[index]; 

    //if checkbox is checked 
    //displaying text in separate two lines on messagebox 
    if (rb.Checked && q.RightAnswer == rb.Text) 
    { 
     // Move your code to another method 
     // MessageBox.Show("Well Done" + Environment.NewLine + "You Are Right"); 
     UserSelectedCorrectAnswer(); 
    } 
    else if (rb.Checked) 
    { 
     // They checked the radio button, but were wrong! 
     // MessageBox.Show("Sorry" + Environment.NewLine + "You Are Wrong"); 
     UserSelectedWrongAnswer(); 
    } 
} 
0

Вы должны инкапсулировать все вопросы в классе. Например, создайте класс с именем Question. Этот класс может содержать 5 переменных: String question, String answer1, String answer2, String answer3 и String answer4.

Сохраните все ваши вопросы в базе данных или прочитайте их из файла и загрузите их в начале программы.

Используйте класс Random, чтобы случайно задать вопрос и «перетасовать» 4 вопроса.

1

Выбор случайной строки из ArrayList:

string randomPick(ArrayList strings) 
{ 
    return strings[random.Next(strings.Length)]; 
} 

Вы могли бы рассмотреть вопрос о Question класса. Это будет содержать вопрос string Text на вопрос (потому что я думаю, что Question.Question глупо, Question.Text имеет больше смысла, когда читаешь). Поскольку вы упомянулиArrayList (не потому, что я думаю, что это лучшее решение), у вас может быть один из них как член, который будет содержать все потенциальные ответы.

При создании вопроса вы можете отобразить Question.Text, а затем использовать функцию выше, чтобы случайно выбрать ответ. Затем используйте ответы RemoveAt(index), чтобы избежать дублирования ответов.

0

Вот метод, который будет работать:

public List<string> Randomize(string[] numbers) 
{ 
    List<string> randomized = new List<string>(); 
    List<string> original = new List<string>(numbers); 
    Random r = new Random(); 
    while (original.Count > 0) { 
     int index = r.Next(original.Count); 
     randomized.Add(original[index]); 
     original.RemoveAt(index); 
    } 

return randomized; 
} 

просто адаптировать его к строковому массиву вместо Int массива

1

Я бы сделать Question класс, содержащим вопрос, правильный ответ и список возможные ответы и методы, которые возвращают возможные ответы в рандомизированном порядке и сравнивают догадку с правильным ответом.Это может выглядеть примерно так:

class Question 
{ 
    String question; 
    String rightAnswer; 
    List<String> possibleAnswers = new ArrayList<String>(); 

    public Question(String question, String answer, List<String> possibleAnswers) 
    { 
     this.question = question; 
     this.rightAnswer = answer; 
     this.possibleAnswers.addAll(possibleAnswers); 
     this.possibleAnswers.add(this.rightAnswer); 
    } 

    public List<String> getAnswers() 
    { 
     Collections.shuffle(possibleAnswers); 
     return possibleAnswers; 
    } 

    public boolean isCorrect(String answer) 
    { 
     return answer.equals(correctAnswer); 
    } 
} 
0

тасовань, вероятно, стандартный вопрос, но я думаю, что это будет работать:

// Warning: Not a thread-safe type. 
// Will be corrupted if application is multi-threaded. 
static readonly Random randomNumberGenerator = new Random(); 


// Returns a new sequence whose elements are 
// the elements of 'inputListOrArray' in random order 
public static IEnumerable<T> Shuffle<T>(IReadOnlyList<T> inputListOrArray) 
{ 
    return GetPermutation(inputListOrArray.Count).Select(x => inputListOrArray[x]); 
} 
static IEnumerable<int> GetPermutation(int n) 
{ 
    var list = Enumerable.Range(0, n).ToArray(); 
    for (int idx = 0; idx < n; ++idx) 
    { 
    int swapWith = randomNumberGenerator.Next(idx, n); 
    yield return list[swapWith]; 
    list[swapWith] = list[idx]; 
    } 
} 

Если вы не имеете IReadOnlyList<T> (.NET 4.5), только использование IList<T>. Входящий объект не мутируется.

0

спасибо всем, кто ответил на мой вопрос.i сделал это таким образом.

private void Quiz_Load(object sender, EventArgs e) 
    { 
     displayQs(); 
    } 

    private void displayQs() 
    { 
      Random _random = new Random(); 
      int z = _random.Next(Questions.Count); 
      Question q = (Question)Questions[z]; 
      Qslbl.Text = q.Quest; 
      DisplayAns(q, _random); 
    } 

    private void DisplayAns(Question q, Random _random) 
    { 
     int j = 0; 
     int[] array = new int[4]; 
     for (int i = 0; j <= 3; i++) 
     { 
      int x = _random.Next(4); 
      x++; 
      if (array.Contains(x)) 
      { 
       continue; 
      } 
      else 
      { 
       array[j] = x; 
       j++; 
       string answer = null; 
       if (j == 1) 
        answer = q.RightAnswer; 
       else if (j == 2) 
        answer = q.WrongAnswer1; 
       else if (j == 3) 
        answer = q.WrongAnswer2; 
       else if (j == 4) 
        answer = q.WrongAnswer3; 

       if (x == 1) 
        radioButton1.Text = answer; 
       else if (x == 2) 
        radioButton2.Text = answer; 
       else if (x == 3) 
        radioButton3.Text = answer; 
       else if (x == 4) 
        radioButton4.Text = answer; 
      } 
     } 
    } 
Смежные вопросы