Android случайный множественный выбор викторины: как определить правильный ответ
Я пытаюсь создать случайный тест с множественным выбором для Android. Я хочу отобразить случайный вопрос из строкового массива с соответствующим ответом из другого строкового массива, отображаемого в одном из четырех вариантов. Остальные три параметра будут взяты из другого строкового массива, который будет использоваться для случайного выбора "неправильных" ответов на все вопросы.
Два вопроса: есть ли лучший способ сделать тест с несколькими вариантами ответов, как этот? -и- Когда игрок выбирает ответ, как мне определить, из какого массива пришел ответ?
Это код, который я использую для рандомизации:
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
2 ответа
Я предлагаю создать новый класс с именем 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);
}
}
Для Упражнения я изменил ваши текстовые представления с четырьмя ответами на 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++;
Это моя общая идея. Код является законченной мыслью, поэтому он будет скомпилирован. Конечно, вы захотите добавить кнопку "Далее", чтобы увидеть разные вопросы. Но этого достаточно, чтобы вы увидели один из способов рандомизировать ваши вопросы и ответы, сохраняя их организованность.
Вот образец, вы можете попробовать. Это модель данных, в которой содержатся вещи для вопросов-ответов.
<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>
Итак, каждый раз, когда вы отображаете вопрос, у вас есть все варианты ответа и правильный ответ на каждый вопрос. Просто создайте правильную структуру данных для их хранения. В любом случае, просто образец, а не идеальный, но попробуйте, если вы новичок в этом материале ^^!