Область действия неопределенного во 2-м раунде игры Javascript & JQuery Trivia - PullRequest
0 голосов
/ 26 февраля 2019

Моя игра работает до тех пор, пока не будет нажата ссылка на стартовую страницу.Затем я получаю неопределенные переменные при попытке играть снова.

Я новичок в JS, поэтому я уверен, что это глупая ошибка пользователя, и я неправильно обрабатываю область.

Если я прокомментирую location.reload внизу javascript, он будет работатьпросто отлично после того, как таймер истек, но назначение кода хочет, чтобы мы не делали обновления.Я ценю любую помощь!

$(document).ready(function() {
  var correctAnswers = 0;
  var incorrectAnswers = 0;
  var unansweredQuestions = 0;
  var timeRemaining = 16;
  var intervalID;
  var indexQandA = 0;
  var answered = false;
  var correct;

  var start = $(".start").html("Start Game");
  start.on("click", startGame);

  var triviaQandA = [{
    question: "What is the fastest animal?",
    answer: ["cheetah", "turtle", "giraffe", "elephant"],
    correct: "0",
    image: ("assets/images/circle.png")
  }, {
    question: "When you are blue you turn?",
    answer: ["red", "green", "blue", "yellow"],
    correct: "2",
    image: ("assets/images/dot.jpg")
  }];

  function startGame() {
    $(".start").hide();
    correctAnswers = 0;
    incorrectAnswers = 0;
    unansweredQuestions = 0;
    loadQandA();
  }

  function loadQandA() {
    answered = false;
    timeRemaining = 16;
    intervalID = setInterval(timer, 1000);
    if (answered === false) {
      timer();
    }

    correct = triviaQandA[indexQandA].correct;
    var question = triviaQandA[indexQandA].question;
    $(".question").html(question);
    for (var i = 0; i < 4; i++) {
      var answer = triviaQandA[indexQandA].answer[i];
      $(".answers").append("<h4 class = answersAll id =" + i + ">" + answer + "</h4>");
    }

    $("h4").click(function() {
      var id = $(this).attr("id");
      if (id === correct) {
        answered = true;
        $(".question").text("The answer is: " + triviaQandA[indexQandA].answer[correct]);
        correctAnswer();
      } else {
        answered = true;
        $(".question").text("You chose: " + triviaQandA[indexQandA].answer[id] + "    the correct answer is: " + triviaQandA[indexQandA].answer[correct]);
        incorrectAnswer();
      }
      console.log(correct);
    });
  }

  function timer() {
    if (timeRemaining === 0) {
      answered = true;
      clearInterval(intervalID);
      $(".question").text("The correct answer is: " + triviaQandA[indexQandA].answer[correct]);
      unAnswered();
    } else if (answered === true) {
      clearInterval(intervalID);
    } else {
      timeRemaining--;
      $(".timeRemaining").text("You have " + timeRemaining);
    }
  }

  function correctAnswer() {
    correctAnswers++;
    $(".timeRemaining").text("You are spot on!!!").css({
      "color": "#3d414f"
    });
    reset();
  }

  function incorrectAnswer() {
    incorrectAnswers++;
    $(".timeRemaining").text("You are sooo wrong").css({
      "color": "#3d414f"
    });
    reset();
  }

  function unAnswered() {
    unansweredQuestions++;
    $(".timeRemaining").text("You didn't choose anything...").css({
      "color": "#3d414f"
    });
    reset();
  }

  function reset() {
    $(".answersAll").remove();
    $(".answers").append("<img class=answerImage width='150' height='150' src='" + triviaQandA[indexQandA].image + "'>");
    indexQandA++;
    if (indexQandA < triviaQandA.length) {
      setTimeout(function() {
        loadQandA();
        $(".answerImage").remove();
      }, 2000);
    } else {
      setTimeout(function() {
        $(".question").remove();
        $(".timeRemaining").remove();
        $(".answerImage").remove();
        $(".answers").append("<h4 class = answersAll end>Correct answers: " + correctAnswers + "</h4>");
        $(".answers").append("<h4 class = answersAll end>Wrong answers: " + incorrectAnswers + "</h4>");
        $(".answers").append("<h4 class = answersAll end>Unanswered questions: " + unansweredQuestions + "</h4>");
        correctAnswers = 0;
        incorrectAnswers = 0;
        unansweredQuestions = 0;
        // setTimeout(function() {
        //     location.reload();
        // }, 5000);

        var start = $(".start-over").html("Start Game");
        start.on("click", startGame);
      }, 2000);
    }
  };


});
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">

<div class="start"></div>
<h1>Trivia</h1>
<h5 class="timeRemaining"></h5>
<h3 class="question"></h3>
<div class="answers"></div>
<div class="start-over"></div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>

Вот встроенная ссылка на мой Codepen .

1 Ответ

0 голосов
/ 26 февраля 2019

Проблема заключается в том, что вы увеличиваете indexQandA на каждый вопрос, но никогда не сбрасываете его.Вам нужно сбросить его на 0 при запуске новой игры - то есть в предложении else функции reset необходимо поставить indexQandA=0 рядом с тем, где вы сбрасываете другие переменные на 0.

Существует еще одна проблема, когда это делается, викторина работает нормально во второй раз, но больше не отображает вопросы.Это потому, что вы удалили элемент .question во время reset.Вам не нужно этого делать, вы можете просто спрятать его, а затем снова отобразить его после перезапуска игры.

На самом деле, выяснилось, что возникли дополнительные проблемы.Я решил это - запускаю игру примерно 5 раз подряд без явных проблем - с помощью следующего кода (я не утверждаю, что это правильный код, чтобы сделать это, это просто минимальные изменения в существующем коде, чтобы получитьэто на работу):

$(document).ready(function() {

var correctAnswers = 0;
var incorrectAnswers = 0;
var unansweredQuestions = 0;
var timeRemaining = 16;
var intervalID;
var indexQandA = 0;
var answered = false;
var correct;
    
    var start = $(".start").html("Start Game");
    start.on("click", startGame);
  $(".start-over").on("click", startGame);
    
var triviaQandA = [{
    question:"What is the fastest animal?",
    answer:["cheetah","turtle","giraffe","elephant"],
    correct:"0",
    image: ("assets/images/circle.png")
}, { 
    question:"When you are blue you turn?",
    answer:["red","green","blue","yellow"],
    correct:"1",
    image: ("assets/images/dot.jpg")
}];

function startGame() {
    $(".summary").hide();
    $(".start").hide();
    $(".timeRemaining").show();
    $(".question").show();
    $(".answers").show();
    $(".start-over").hide();
    correctAnswers = 0;
    incorrectAnswers = 0;
    unansweredQuestions = 0;
    loadQandA();
}

function loadQandA() {
    answer = [];
    answered = false;
    timeRemaining = 16;
    timer();
    intervalID = setInterval(timer, 1000);
    /*if (answered === false) {
        timer();
    }*/
    
    correct = triviaQandA[indexQandA].correct;
    var question = triviaQandA[indexQandA].question;
    $(".question").html(question);
    for (var i = 0; i < 4; i++) {
        var answer = triviaQandA[indexQandA].answer[i];
        $(".answers").append("<h4 class = answersAll id =" + i + ">" + answer + "</h4>");
    }

    $("h4").click(function() {
        var id = $(this).attr("id");
        if (id === correct) {
            answered = true;
            $(".question").text("The answer is: " + triviaQandA[indexQandA].answer[correct]);
            correctAnswer();
        } else {
            answered = true;
            $(".question").text("You chose: " + triviaQandA[indexQandA].answer[id] + "    the correct answer is: " + triviaQandA[indexQandA].answer[correct]);
            incorrectAnswer();
        }
        console.log(correct);
    });
}

function timer() {
    if (timeRemaining === 0) {
        answered = true;
        //clearInterval(intervalID);
        $(".question").text("The correct answer is: " + triviaQandA[indexQandA].answer[correct]);
        unAnswered();
    } else if (answered === true) {
        //clearInterval(intervalID);
    } else {
        timeRemaining--;
        $(".timeRemaining").text("You have " + timeRemaining);
    }
}

function correctAnswer() {
    correctAnswers++;
    $(".timeRemaining").text("You are spot on!!!").css({
        "color": "#3d414f"
    });
    reset();
}

function incorrectAnswer() {
    incorrectAnswers++;
    $(".timeRemaining").text("You are sooo wrong").css({
        "color": "#3d414f"
    });
    reset();
}

function unAnswered() {
    unansweredQuestions++;
    $(".timeRemaining").text("You didn't choose anything...").css({
        "color": "#3d414f"
    });
    reset();
}

function reset() {
      clearInterval(intervalID);
    $(".answersAll").remove();
    $(".answers").append("<img class=answerImage width='150' height='150' src='" + triviaQandA[indexQandA].image + "'>");
    indexQandA++;
    if (indexQandA < triviaQandA.length) {
        setTimeout(function () {
            loadQandA();
            $(".answerImage").remove();
        }, 2000);
    } else {
        setTimeout(function() {
            $(".summary").show();
            $(".question").hide();
            $(".timeRemaining").hide();
            $(".answers").hide();
            $(".start-over").show();
            $(".answerImage").remove();
            $(".summary").append("<h4 class = answersAll end>Correct answers: " + correctAnswers + "</h4>");
            $(".summary").append("<h4 class = answersAll end>Wrong answers: " + incorrectAnswers + "</h4>");
            $(".summary").append("<h4 class = answersAll end>Unanswered questions: " + unansweredQuestions + "</h4>");
            correctAnswers = 0;
            incorrectAnswers = 0;
            unansweredQuestions = 0;
            indexQandA=0;
            // setTimeout(function() {
            //     location.reload();
            // }, 5000);
    
            $(".start-over").html("Start Game");
            start.on("click", startGame);
        }, 2000);
    }
};

    
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
</head>
<body>
    <div class="start"></div>
    <h1>Trivia</h1>
    <h5 class="timeRemaining"></h5>
    <h3 class="question"></h3>
    <div class="answers"></div>
    <div class="summary"></div>
    <div class="start-over"></div>

</body>
</html>

Были две основные проблемы с вашим кодом, как было изначально:

  • наиболее серьезно, вы добавляли startGame какобработчик click для кнопки «начать заново» каждый раз, когда вызывается функция reset.В результате к моменту, когда вы играли в 3-й, 4-й, 5-й ... раз, добавлялось несколько таких обработчиков, в результате чего функция startGame вызывалась несколько раз, поэтому вы получали варианты ответа.напечатано несколько раз.Я исправил это, полностью удалив этот раздел кода и добавив прослушиватель событий один раз при загрузке страницы.
  • ваш таймер также работал немного медленнее, поскольку вы вызывали функцию timer вручную кака также использование setInterval для запуска каждую секунду, и вы не всегда очищали его, когда на вопрос был дан ответ.Я значительно упростил это и заставил его работать, просто установив таймер в loadQandA, как и раньше, и очистив его в функции reset.

Вы увидите, что я 'В основном мы просто комментируем, а не удаляем их - надеюсь, будет легче увидеть, что я удалил.

...