Сброс элемента случайного массива как новой переменной (javascript)

#javascript

#javascript

Вопрос:

У меня есть случайный вопрос, извлеченный из массива, с тремя возможными ответами, извлеченными из массива внутри массива. Правильный ответ основан на позиции возможного ответа в массиве внутри массива и сравнивается с вводом пользователем в приглашении ().

 ie:[1[correct, x, x], 2[x, correct, x], 3[x, x, correct]. 
  

Для первого случайного вопроса номер ответа соответствует правильному ответу. После первого вопроса ответы, принятые программой, больше не соответствуют правильному ответу, введенному пользователем. Это имеет место независимо от порядка случайных вопросов.

например:

 Question 2 (displayed first):
1) x 
2) y - correct
3) z

Question 1 (displayed next):
1) a - correct but returns false
2) b - wrong but returns correct
3) c
  

Вот мой код. Введите ‘quit’, чтобы закрыть всплывающие окна с подсказками.

     var Question = function(question, answerArray, answer) {
      this.question = question;
      this.answerArray = answerArray;
      this.answer = answer;
    };

    Question.prototype.questionPrompt = function() {
      console.log(this.question);
      this.answerArray.forEach(function(answerList, index) {
        console.log(index   ') '   answerList)
      });
    };

    var questionArray = new Array(
      q1 = new Question('Question A:', ['A', 'B', 'C'], 'A'),
      q2 = new Question('Question B:', ['A', 'B', 'C'], 'B'),
      q3 = new Question('Question C:', ['A', 'B', 'C'], 'C')
    )

    var randomQ = Math.floor(Math.random() * questionArray.length);

    questionArray[randomQ].questionPrompt();

    Question.prototype.answerPrompt = function() {
      var guess = prompt("Enter number of the correct answer.");
      var currentQ = randomQ;
      var tryQ = guess amp;amp; Number(guess);
      if (currentQ === tryQ) {
        console.log('Correct! '   this.answer);
        nextQ();
      } else if (guess === "quit") {
    console.log("Goodbye.")
  } else {
        console.log('Try again.'   this.answer);
        nextQ();
      }
    };

    questionArray[randomQ].answerPrompt();

    var newQ;

    function nextQ() {
      newQ = Math.floor(Math.random() * questionArray.length);
      questionArray[newQ].questionPrompt();
      questionArray[newQ].answerPrompt();
    };  

Что заставляет позицию массива вопроса внутри newQ() отличаться от ответа внутри newQ(), в то время как позиции для randomQ остаются неизменными?

Комментарии:

1. Было бы очень полезно, если бы вы могли сделать свой скрипт работоспособным, чтобы показать, что мы можем пройти каждый шаг самостоятельно. Найдите <> значок в редакторе вопросов, чтобы создать фрагмент.

2. Понятия не имею, откуда randomQ берется. Если randomQ это связано с порядком вопроса на странице, а не в массиве, они не будут совпадать. Это довольно хороший пример того, почему следует избегать логики, основанной на позициях, потому что она запутывает и излишне хрупка.

Ответ №1:

Попробуйте это вместо:

 Question.prototype.answerPrompt = function() {
  var guess = prompt("Enter number of the correct answer.");
  var currentQ = randomQ;
  var tryQ = guess amp;amp; Number(guess);
  if (this.answerArray[tryQ   1] === this.answer) { // answersArray starts at 0
    console.log('Correct! '   this.answer);
    nextQ();
  } else {
    console.log('Try again.');
    nextQ();
  }
};
  

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

Комментарии:

1. Используя этот код, он, похоже, вообще не распознает правильный ответ. Иногда вопрос и ответ будут в позиции 0, поэтому мне трудно понять, как добавить 1 к tryQ. Не могли бы вы объяснить логику, стоящую за этим?

Ответ №2:

Это была проблема определения переменных в глобальной области видимости и порядка, в котором вызывались переменные. randomQ необходимо было определить внутри init() функции, чтобы сбросить номер для массива вопросов, что делает переменную newQ избыточной.

Шаг 1) Определение переменных в глобальной области видимости:

 var randomQ; 
var guess;
  

Шаг 2) создайте init() функцию и переместите в нее код случайного числа. Вызов init в глобальной области видимости:

 function init(){
  randomQ = Math.floor(Math.random() * questionArray.length);
  questionArray[randomQ].questionPrompt();
  questionArray[randomQ].answerPrompt();
}

init();  
  

Шаг 3) Переместите запрос в questionPrompt from answerPrompt и вызывайте init() в конце каждого оператора if / else answerPrompt .

 // select random question here
  Question.prototype.questionPrompt = function() {
    console.log(this.question);
    this.answerArray.forEach(function(answerList, index) {
      console.log(index   ') '   answerList)
    });
    guess = prompt("Enter number of the correct answer.");
  };

  // // CHECKS FOR CORRECT ANSWER and prints to console
  Question.prototype.answerPrompt = function() {
    var tryQ = guess amp;amp; Number(guess);
    if (randomQ === tryQ) {
      console.log('Correct! '   this.answer);
      init();
    } else if (guess === "quit") {
      console.log("Goodbye.")
    } else {
      console.log('Try again.');
      init();
    };
  };