2012-08-15 2 views
1

Я пытаюсь создать случайную многократную викторину выбора для Android. Я хочу отобразить случайный вопрос из stringarray, с соответствующим ответом из другого массива строк, отображающимся в одном из четырех вариантов. Остальные три параметра будут получены из другого массива строк, который будет использоваться для случайного получения «неправильных» ответов на все вопросы.Android случайный опрос с множественным выбором: как определить правильный ответ

Два вопроса: Есть ли лучший способ сделать викторину с несколькими вариантами выбора? -and- Когда игрок выбирает ответ, как мне определить, из какого массива был получен ответ?

Это код, я использую для рандомизации:

String[] question = { //questions here// }; 
ArrayList<String> questionList = new ArrayList(Arrays.asList(question)); 

String[] answer = { //answers here// }; 
ArrayList<String> answerList = new ArrayList(Arrays.asList(answer)); 

String[] distractor = { //distractors here// }; 
ArrayList<String> distractorList = new ArrayList(Arrays.asList(distractor)); 

int i = 0; 
Random r = new Random(); 
public void randomize() { 

     TextView word = (TextView) findViewById(R.id.textView1); 
     TextView choice1 = (TextView) findViewById(R.id.textView2); 
     TextView choice2 = (TextView) findViewById(R.id.textView3); 
     TextView choice3 = (TextView) findViewById(R.id.textView4); 
     TextView choice4 = (TextView) findViewById(R.id.textView5); 
     if (i < question.length) { 
      int remaining = r.nextInt(questionList.size()); 
      String q = questionList.get(remaining); 
      word.setText(q); 
      questionList.remove(remaining); 
      String a = answerList.get(remaining); 
      int slot = r.nextInt(4); 
      TextView[] tvArray = { choice1, choice2, choice3, choice4 }; 
      tvArray[slot].setText(a); 
      answerList.remove(remaining); 
      //an if/else statement here to fill the remaining slots with distractors 

ответ

5

Я предлагаю создать новый класс QuestionAndAnswer. Класс должен содержать вопрос и правильный ответ, он также может содержать любые настраиваемые неправильные ответы и выбор пользователя. Точная реализация полностью зависит от вас.

В вашей деятельности есть массив этого класса QuestionAndAnswer, чтобы перебирать список, задавая вопросы и подсчитывая моменты, когда это делается.

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


Добавление

Это то, что я хотел бы начать с:
(из код Я предполагаю, что distractorList содержит ложные ответы, которые вы хотите отобразить.)

public class QuestionAndAnswer { 
    public List<String> allAnswers; // distractors plus real answer 
    public String answer; 
    public String question; 
    public String selectedAnswer; 
    public int selectedId = -1; 

    public QuestionAndAnswer(String question, String answer, List<String> distractors) { 
     this.question = question; 
     this.answer = answer; 
     allAnswers = new ArrayList<String> (distractors); 

     // Add real answer to false answers and shuffle them around 
     allAnswers.add(answer); 
     Collections.shuffle(allAnswers); 
    } 

    public boolean isCorrect() { 
     return answer.equals(selectedAnswer); 
    } 
} 

Для этой операции я изменил ваши четыре ответа TextViews на RadioGroup, таким образом пользователь может интуитивно выбрать ответ. Я также предполагаю, что будут кнопки prev и next, они отрегулируют int currentQuestion и позвоните по номеру fillInQuestion().

public class Example extends Activity { 
    RadioGroup answerRadioGroup; 
    int currentQuestion = 0; 
    TextView questionTextView; 
    List<QuestionAndAnswer> quiz = new ArrayList<QuestionAndAnswer>(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     questionTextView = (TextView) findViewById(R.id.question); 
     answerRadioGroup = (RadioGroup) findViewById(R.id.answers); 

     // Setup a listener to save chosen answer 
     answerRadioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(RadioGroup group, int checkedId) { 
       if(checkedId > -1) { 
        QuestionAndAnswer qna = quiz.get(currentQuestion); 
        qna.selectedAnswer = ((RadioButton) group.findViewById(checkedId)).getText().toString(); 
        qna.selectedId = checkedId; 
       } 
      } 
     }); 

     String[] question = { //questions here// }; 
     String[] answer = { //answers here// }; 
     String[] distractor = { //distractors here// }; 
     ArrayList<String> distractorList = Arrays.asList(distractor); 

     /* I assumed that there are 3 distractors per question and that they are organized in distractorList like so: 
     * "q1 distractor 1", "q1 distractor 2", "q1 distractor 3", 
     * "q2 distractor 1", "q2 distractor 2", "q2 distractor 3", 
     * etc 
     * 
     * If the question is: "The color of the sky", you'd see distractors: 
     * "red", "green", "violet" 
     */ 
     int length = question.length; 
     for(int i = 0; i < length; i++) 
      quiz.add(new QuestionAndAnswer(question[i], answer[i], distractorList.subList(i * 3, (i + 1) * 3))); 
     Collections.shuffle(quiz); 

     fillInQuestion(); 
    } 

    public void fillInQuestion() { 
     QuestionAndAnswer qna = quiz.get(currentQuestion); 
     questionTextView.setText(qna.question); 

     // Set all of the answers in the RadioButtons 
     int count = answerRadioGroup.getChildCount(); 
     for(int i = 0; i < count; i++) 
      ((RadioButton) answerRadioGroup.getChildAt(i)).setText(qna.allAnswers.get(i)); 

     // Restore selected answer if exists otherwise clear previous question's choice 
     if(qna.selectedId > -1) 
      answerRadioGroup.check(qna.selectedId); 
     else 
      answerRadioGroup.clearCheck(); 
    } 
} 

Вы можете заметить, что QuestionAndAnswer имеет метод isCorrect(), когда пришло время, чтобы класс викторины вы можете рассчитывать правильные ответы, как это:

int correct = 0; 
for(QuestionAndAnswer question : quiz) 
    if(question.isCorrect()) 
     correct++; 

Это моя основная идея. Код - это полная мысль, поэтому она будет компилироваться. Конечно, вы захотите добавить «следующую» кнопку, чтобы увидеть разные вопросы. Но этого достаточно, чтобы вы могли увидеть один из способов рандомизировать свои вопросы и ответы, сохранив их организованность.

+0

Я добавил код, не могли бы вы подробнее о том, как сохранить выбор пользователя, если текстовые поля заполнены случайным образом? – CoffeeCrisp

+0

Сделайте класс QuestionAndAnswer, который содержит правильный ответ на вопрос, но у вас есть статический список «distractors», который будет использоваться для всех ваших объектов QuestionAndAnswer. Кроме того, есть переменная, называемая usersChoice, чтобы сохранить ответ, который пользователь фактически выбрал. Вы можете найти ту, которая была фактически выбрана путем реализации OnClickListener в вашем классе QuestionAndAnswer и для выполнения каждого из ваших тестовых тестов textView.setOnClickListener (это). – ComputerEngineer88

+0

questionTextView.setText (qna.question); in fillInQuestion() функция throw nullpointer исключение из-за объекта questionTextView, установленного в null в questionTextView = (TextView) findViewById (R.id.question); можете ли вы объяснить, почему? – avinesh

1

Здесь образец, вы можете попробовать. Это модель данных, например, для хранения материалов для вопроса «Вопрос-ответ».

<data-map> 
    <question id="1"> 
     <ask>How many questions are asked on Android category daily? </ask> 
     <answer-map> 
      <option id="1">100 </option> 
      <option id="2">111 </option> 
      <option id="3">148 </option> 
      <option id="4">217 </option> 
     </answer-map> 
     <correct id="3" /> 
    </question> 


    <question id="2"> 
     <ask>Which band does John Lenon belong to? </ask> 
     <answer-map> 
      <option id="1">The Carpenters </option> 
      <option id="2">The Beatles </option> 
      <option id="3">Take That </option> 
      <option id="4">Queen </option> 
     </answer-map> 
     <correct id="2" /> 
    </question> 

</data-map> 

Итак, вы каждый раз, когда вы показываете вопрос, вы получили все варианты ответа, и правильный ответ на каждый вопрос. Просто создайте правильную структуру данных для их хранения. В любом случае, просто образец, а не идеальный, но попробуйте, если вы новичок в этой штуке ^^!

+0

Как бы я определил правильный ответ, если он не всегда в одном месте? У меня есть код java, который работает, чтобы отображать правильный ответ случайным образом в одном из четырех вариантов, и порядок вопросов также случайный. Кроме того, можете ли вы подробно остановиться на «правильной структуре данных»? спасибо – CoffeeCrisp

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