【问题标题】:Prevent repeat in shuffle mode防止在随机播放模式下重复
【发布时间】:2018-08-12 00:44:49
【问题描述】:

如何在测验中随机抽出我已经提出的问题(以免重复)?在不使应用崩溃的情况下实现这一目标的最佳方法是什么?

问题:我想只保留一个 Java 类来解决所有问题,不知道在进行其他关卡活动时这是否是一种好方法。所以我一开始就尝试了 10 个问题,但我不断收到已经被问到的问题。然后我把这门课分成两个(每个 5 个问题)按新级别(简单级别 1 和 2)定义每个问题,但问题是一样的。

我猜,这是我在逻辑部分苦苦挣扎的那一行:

updateQuestion(rand.nextInt(mQuestionsLength)); 

这是我尝试过的,直到现在:

public class Quiz extends AppCompatActivity {
    Button answer1, answer2;
    TextView score, question, timer;
    private Question mQuestions = new Question();
    private String mExplanation;
    private String mAnswer;
    private int mScore = 0;
    private int mQuestionNumber = 0;
    private String mQuestionsIndex;
    private int mAns = 0;
    public int mQuestionsLength = mQuestions.mQuestions.length;
    Random rand;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_easy_level1);

        rand = new Random();

        answer1 = (Button)findViewById(R.id.answer1);
        answer2 = (Button)findViewById(R.id.answer2);

        score = (TextView) findViewById(R.id.score);
        question = (TextView) findViewById(R.id.question);
        timer = (TextView) findViewById(R.id.timer);

        score.setText("Overall Score: " + mScore);

        updateQuestion(rand.nextInt(mQuestionsLength));

        answer1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(answer1.getText() == mAnswer){
                    bingoAlert();
                } else {
                    oopsAlert();
                }
            }
        });
        answer2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(answer2.getText() == mAnswer){
                    bingoAlert();
                } else {
                    oopsAlert();
                }
            }
        });
    }
    private void updateQuestion(int num){
        question.setText(mQuestions.getQuestion(num));
        answer1.setText(mQuestions.getChoice1(num));
        answer2.setText(mQuestions.getChoice2(num));

        mAnswer = mQuestions.getCorrectAnswer(num);
        mQuestionsIndex = mQuestions.getQuestionIndex(num);
        mQuestionNumber++;
    }

    private void bingoAlert(){
        mScore+=5;
        score.setText("Score: " + mScore);
        if(mQuestionNumber == mQuestions.mQuestions.length){
            // Do something...
        }else{
            updateQuestion(rand.nextInt(mQuestionsLength));
        }
    }
    private void oopsAlert(){
        mScore-=2;
        score.setText("Score: " + mScore);
        if(mQuestionNumber == mQuestions.mQuestions.length){
            // Do something...
        }else{
            updateQuestion(rand.nextInt(mQuestionsLength));
        }
    }

问题类

public class Questions {

    public static String[] mQuestions = new String[]{
            "Question 1",
            "Question 2",
            "Question 3",
            "Question 4",
            "Question 5"

    };
    public static String[] mQuestionsIndex = new String[]{
            "1", "2", "3", "4", "5"
    };
    private static String mChoices[][] = {
            {"Choice 1", "Choice 2"},
            {"Choice 1", "Choice 2"},
            {"Choice 1", "Choice 2"},
            {"Choice 1", "Choice 2"},
            {"Choice 1", "Choice 2"}
    };
    private String mCorrectAnswers[] =
            {"Choice 1", "Choice 2", "Choice 1", "Choice 2", "Choice 1"};

    public String getQuestion(int a) {
        String question = mQuestions[a];
        return question;
    }

    public String getChoice1(int a) {
        String choice = mChoices[a][0];
        return choice;
    }

    public String getChoice2(int a) {
        String choice = mChoices[a][1];
        return choice;
    }

    public String getCorrectAnswer(int a) {
        String answer = mCorrectAnswers[a];
        return answer;
    }

    public String getQuestionIndex(int a) {
        String questionsIndex = mQuestionsIndex[a];
        return questionsIndex;
    }

这是我的随机课

class RandomClass {
    private Random randNum;

    public RandomClass() {
        randNum = new Random();
    }

    public int[] generateRandomArray(int arraySize){
        int[] theArray = new int[arraySize];
        for(int mQuestionNumber = 0; mQuestionNumber <= 5; mQuestionNumber++){
            theArray[mQuestionNumber] = randNum.nextInt(6);
        }
        return theArray;
    }
}

这是我最近的尝试:

private void updateQuestion(int num){
        question.setText(mQuestions.getQuestion(num));
        answer1.setText(mQuestions.getChoice1(num));
        answer2.setText(mQuestions.getChoice2(num));

        mAnswer = mQuestions.getCorrectAnswer(num);
        mExplanation = mQuestions.getExplanation(num);
        mQuestionsIndex = mQuestions.getQuestionIndex(num);

        for (int mQuestionNumber = 0; mQuestionNumber <= 5; mQuestionNumber++) {
            int[] ints = new RandomClass().generateRandomArray(5);
        }
    }

谢谢!

【问题讨论】:

  • 您可以将已显示的问题存储在一个列表中,并在显示另一个新问题集时检查该列表?
  • 谢谢。你能告诉我一个如何做的例子吗,因为我现在在这部分卡了差不多 2 个小时。 :(
  • 谢谢。所以你的意思是,像这样:'ArrayList number = new ArrayList(); for (int mQuestionNumber = 1; mQuestionNumber
  • @RohitSharma 但它只会随机播放列表的内容,不会阻止您再次显示相同的问题。看到这个geeksforgeeks.org/collections-shuffle-java-examples

标签: android arrays random


【解决方案1】:

提示:保持ArrayList

  1. 创建一个 ArrayList。
  2. 添加问题的索引。例如:1,2,3,4.....n 在列表中。
  3. 生成一个List大小范围内的随机数。
  4. 显示生成的随机数对应的题(最好是题号的索引)。
  5. 显示问题后,从列表中删除该项目。
  6. 当您从列表中删除项目时,列表会更新,删除元素之后的所有元素都会上移一位,列表的大小也会更新(减 1)。
  7. 再次生成列表大小范围内的随机数并重复该过程。

    list.get(random_number); 将为您提供存储在该位置的数字的索引,以便您可以相应地显示您的位置。

如果有任何不明确或模棱两可的地方,请告诉我。我会更新的。

【讨论】:

  • 谢谢@Nimi0112 我明白了。如果可行,我会接受你的回答。 :)
  • @RohitSharma 从列表中删除生成的随机数 do list.remove(rand_num);
  • 是的。我是这么想的。谢谢@nimi0112 喜欢这个社区。 :)
猜你喜欢
  • 1970-01-01
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
相关资源
最近更新 更多