0

私はアンドロイドのためのランダムな多肢選択式クイズを作成しようとしています。文字列配列からのランダムな質問を表示したいのですが、別の文字列配列からの対応する回答が4つのオプションのいずれかに表示されます。他の3つのオプションは、別の文字列配列から取得されます。これは、すべての質問に対して「間違った」回答をランダムに提供するために使用されます。

2つの質問:このような多肢選択式のクイズを作成するためのより良い方法はありますか?-そして-プレイヤーが答えを選択するとき、答えがどの配列から来たのかをどのように識別しますか?

これは私がランダム化するために使用しているコードです:

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
4

2 に答える 2

4

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);
    }
}

アクティビティでは、4つの回答TextViewを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++;

これが私の一般的な考え方です。コードは完全に考えられているので、コンパイルされます。もちろん、さまざまな質問を表示するには、「次へ」ボタンを追加することをお勧めします。しかし、これは、質問と回答を整理したままランダム化する1つの方法を理解するのに十分です。

于 2012-08-15T16:11:56.280 に答える
1

ここにサンプルがあります。試してみてください。これは、Question-Answerのものを保持するようなデータモデルです。

<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>

さて、質問を表示するたびに、答えるすべてのオプションと、各質問の正解が得られます。それらを保持するための適切なデータ構造を作成するだけです。とにかく、サンプルであり、完璧なものではありませんが、このようなものに慣れていない場合は試してみてください^^!

于 2012-08-15T16:16:32.540 に答える