Я делаю тест, используя windows форм и C#, но он продолжает отображать тот же вопрос - PullRequest
0 голосов
/ 29 мая 2020

Он считывает вопросы / ответы / темы и c из файла .txt и сохраняет его в массиве под названием «questionArray», который разделяется запятыми в другой массив под названием «splitDetails». Оператор if выбирает вопросы определенного уровня сложности и topi c из списка и создает новый вопрос 'newQ' типа MultipleChoice, который имеет такие свойства, как QuestionText, Choice1, Choice2 et c. и добавлен в список под названием «allQuestions». populateTextboxes () выбирает случайный вопрос из списка allQuestions и устанавливает его для объекта currentQ, который имеет тип MultipleChoice, а затем удаляет его из списка, чтобы он больше не отображался.

{
if (File.Exists("MultipleChoice questions.txt")) //checking file exists
{
   string[] questionArray = File.ReadAllLines("MultipleChoice questions.txt"); //create array of all questions 

   foreach (string Q in questionArray)
   {
        string[] splitDetails = Q.Split(',');  //create new array split by commas
if (splitDetails[6] == Quiz.DifficultyLevel && splitDetails[7] == Quiz.CurrentTopic)
       {
            newQ.QuestionText = splitDetails[0]; 
              newQ.Choice1 = splitDetails[1];
              newQ.Choice2 = splitDetails[2];
              newQ.Choice3 = splitDetails[3];
              newQ.Choice4 = splitDetails[4];
              newQ.Answer = splitDetails[5];
              newQ.Difficulty = splitDetails[6];
              newQ.Topic = splitDetails[7];
              newQ.QuestionType = splitDetails[8]; 

              allQuestions.Add(newQ); 

         }
      }
   }
   Else MessageBox.Show("No question file found", "File not found");
}

//add text to blank question form
public MultipleChoice populateTextboxes() 
{
  Random myNum = new Random();

  if (allQuestions.Count > 0)
  {
    questionCount += 1;

       //select random question from all questions
       int randomNumber = myNum.Next(0, allQuestions.Count);
       currentQ = allQuestions[randomNumber];
       allQuestions.Remove(currentQ);//remove used uestion so it isnt used again
  }

  //when the round is over (3 questions asked)
  if (questionCount == 4) 
  {
    //open keyboardQuestion
    this.Close();
    KeyboardInput k = new KeyboardInput();
    k.Show();

   }

   lblQuestion.Text = currentQ.QuestionText; 
   btnChoice1.Text = currentQ.Choice1;
   btnChoice2.Text = currentQ.Choice2;
   btnChoice3.Text = currentQ.Choice3;
   btnChoice4.Text = currentQ.Choice4;

   return currentQ;
}

1 Ответ

0 голосов
/ 30 мая 2020

Готов поспорить, он всегда отображает последний вопрос?

Если newQ объявлен глобально, то этот код будет генерировать кучу разных вопросов, которые на самом деле состоят из одного и того же объекта. Строка allQuestions.add () продолжит добавлять тот же объект в коллекцию. Вы можете изменить одно из свойств до или после добавления его в коллекцию, и оно изменится во всех вопросах. Представьте, что 10 человек читают одну и ту же газетную статью. На самом деле вам нужно, чтобы один человек читал 10 разных статей.

Объявите newQ локально, внутри foreach () l oop, и это приведет к созданию нового объекта с уникальными свойствами на каждой итерации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...