diff --git a/index.html b/index.html index 534cd886..653945d5 100644 --- a/index.html +++ b/index.html @@ -38,8 +38,8 @@

JavaScript Quiz

- - + + diff --git a/src/index.js b/src/index.js index 03737ba3..9c639a23 100644 --- a/src/index.js +++ b/src/index.js @@ -15,6 +15,7 @@ document.addEventListener("DOMContentLoaded", () => { const resultContainer = document.querySelector("#result"); + /************ SET VISIBILITY OF VIEWS ************/ // Show the quiz view (div#quizView) and hide the end view (div#endView) @@ -42,7 +43,6 @@ document.addEventListener("DOMContentLoaded", () => { // Shuffle the quiz questions quiz.shuffleQuestions(); - /************ SHOW INITIAL CONTENT ************/ // Convert the time remaining in seconds to minutes and seconds, and pad the numbers with zeros if needed @@ -60,6 +60,18 @@ document.addEventListener("DOMContentLoaded", () => { /************ TIMER ************/ let timer; + // Start the timer + function startTimer() { + timer = setInterval(() => { + quiz.timeRemaining--; + timeRemainingContainer.innerText = `${minutes}:${seconds}`; + + if (quiz.timeRemaining <= 0) { + clearInterval(timer); + showResults(); + } + }, 1000); + } /************ EVENT LISTENERS ************/ @@ -91,6 +103,7 @@ document.addEventListener("DOMContentLoaded", () => { const question = quiz.getQuestion(); // Shuffle the choices of the current question by calling the method 'shuffleChoices()' on the question object question.shuffleChoices(); + quiz.questions = quiz.questions.slice(0, 4); @@ -98,23 +111,39 @@ document.addEventListener("DOMContentLoaded", () => { // // 1. Show the question // Update the inner text of the question container element and show the question text + questionContainer.innerText = question.text; // 2. Update the green progress bar // Update the green progress bar (div#progressBar) width so that it shows the percentage of questions answered - progressBar.style.width = `65%`; // This value is hardcoded as a placeholder + progressBar.style.width = `${quiz.currentQuestionIndex/quiz.questions.length*100}%`; // This value is hardcoded as a placeholder // 3. Update the question count text // Update the question count (div#questionCount) show the current question out of total questions - questionCount.innerText = `Question 1 of 10`; // This value is hardcoded as a placeholder + questionCount.innerText = `Question ${quiz.currentQuestionIndex+1} of ${quiz.questions.length}`; // This value is hardcoded as a placeholder // 4. Create and display new radio input element with a label for each choice. + question.choices.forEach(choice => { + const input = document.createElement("input") + input.type = "radio"; // Set the type of the input to radio + input.name = "choice"; // Set the name of the input to choice + input.value = choice; // Set the value of the input to the choice text + + const label = document.createElement("label"); // Create a new label element + label.innerText = choice; // Set the inner text of the label to the choice text + + choiceContainer.appendChild(input); // Append the input to the choice container + choiceContainer.appendChild(label); // Append the label to the choice container + }); + + + // Loop through the current question `choices`. // For each choice create a new radio input with a label, and append it to the choice container. // Each choice should be displayed as a radio input element with a label: @@ -140,27 +169,46 @@ document.addEventListener("DOMContentLoaded", () => { // YOUR CODE HERE: // // 1. Get all the choice elements. You can use the `document.querySelectorAll()` method. + const choiceElements = document.querySelectorAll("input[name='choice']"); // 2. Loop through all the choice elements and check which one is selected + choiceElements.forEach(choice => { + if (choice.checked) { + selectedAnswer = choice.value; + } + // Hint: Radio input elements have a property `.checked` (e.g., `element.checked`). // When a radio input gets selected the `.checked` property will be set to true. // You can use check which choice was selected by checking if the `.checked` property is true. // 3. If an answer is selected (`selectedAnswer`), check if it is correct and move to the next question + if (selectedAnswer) { + const isCorrect = quiz.checkAnswer(selectedAnswer); + if (isCorrect) { + quiz.correctAnswers++; + } + + // Move to the next question by calling the quiz method `moveToNextQuestion()` + quiz.moveToNextQuestion(); + + // Show the next question by calling the function `showQuestion()` + showQuestion(); + } // Check if selected answer is correct by calling the quiz method `checkAnswer()` with the selected answer. // Move to the next question by calling the quiz method `moveToNextQuestion()`. // Show the next question by calling the function `showQuestion()`. - } + }) + }; function showResults() { + - // YOUR CODE HERE: - // + // 1. Hide the quiz view (div#quizView) quizView.style.display = "none"; @@ -168,7 +216,16 @@ document.addEventListener("DOMContentLoaded", () => { endView.style.display = "flex"; // 3. Update the result container (div#result) inner text to show the number of correct answers out of total questions - resultContainer.innerText = `You scored 1 out of 1 correct answers!`; // This value is hardcoded as a placeholder + resultContainer.innerText = `You scored ${quiz.correctAnswers} out of ${quiz.questions.length} correct answers!`; // This value is hardcoded as a placeholder } - + const restartButton = document.querySelector("#restartButton"); + restartButton.addEventListener("click", () => { + quiz.currentQuestionIndex = 0; // Reset the current question index + quiz.correctAnswers = 0; + endView.style.display = "none"; + quizView.style.display = "block"; + quiz.shuffleQuestions(); + showQuestion(); // Show the first question again + }); + }); \ No newline at end of file diff --git a/src/question.js b/src/question.js index 68f6631a..48c76ac7 100644 --- a/src/question.js +++ b/src/question.js @@ -1,7 +1,16 @@ class Question { - // YOUR CODE HERE: - // - // 1. constructor (text, choices, answer, difficulty) + constructor(text, choices, answer, difficulty) { + this.text = text; + this.choices = choices; + this.answer = answer; + this.difficulty = difficulty; + } + + shuffleChoices() { + for (let i = this.choices.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [this.choices[i], this.choices[j]] = [this.choices[j], this.choices[i]]; + } + } - // 2. shuffleChoices() } \ No newline at end of file diff --git a/src/quiz.js b/src/quiz.js index d94cfd14..2cc8a4e9 100644 --- a/src/quiz.js +++ b/src/quiz.js @@ -1,15 +1,50 @@ class Quiz { - // YOUR CODE HERE: - // - // 1. constructor (questions, timeLimit, timeRemaining) + constructor(questions, timeLimit, timeRemaining) { + this.questions = questions; + this.timeLimit = timeLimit; + this.timeRemaining = timeRemaining; + this.correctAnswers = 0; + this.currentQuestionIndex = 0; + } - // 2. getQuestion() - - // 3. moveToNextQuestion() + getQuestion() { + return this.questions[this.currentQuestionIndex]; + } - // 4. shuffleQuestions() + moveToNextQuestion() { + this.currentQuestionIndex++; + } - // 5. checkAnswer(answer) + shuffleQuestions() { + for (let i = this.questions.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [this.questions[i], this.questions[j]] = [this.questions[j], this.questions[i]]; + } + } - // 6. hasEnded() + checkAnswer(answer) { + const currentQuestion = this.getQuestion(); + if (currentQuestion.answer === answer) { + this.correctAnswers++; + return true; + } + return false; + } + + hasEnded() { + return this.currentQuestionIndex >= this.questions.length; + } + + filterQuestionsByDifficulty(difficulty) { + if (typeof difficulty !== 'number' || difficulty < 1 || difficulty > 3) { + return; + } + this.questions = this.questions.filter(question => question.difficulty === difficulty); + } + + + averageDifficulty() { + const totalDifficulty = this.questions.reduce((sum, question) => sum + question.difficulty, 0); + return totalDifficulty / this.questions.length; + } } \ No newline at end of file