diff --git a/src/index.js b/src/index.js index 03737ba3..a633410e 100644 --- a/src/index.js +++ b/src/index.js @@ -14,39 +14,52 @@ document.addEventListener("DOMContentLoaded", () => { // End view elements const resultContainer = document.querySelector("#result"); - /************ SET VISIBILITY OF VIEWS ************/ // Show the quiz view (div#quizView) and hide the end view (div#endView) quizView.style.display = "block"; endView.style.display = "none"; - /************ QUIZ DATA ************/ - + // Array with the quiz questions const questions = [ - new Question("What is 2 + 2?", ["3", "4", "5", "6"], "4", 1), - new Question("What is the capital of France?", ["Miami", "Paris", "Oslo", "Rome"], "Paris", 1), - new Question("Who created JavaScript?", ["Plato", "Brendan Eich", "Lea Verou", "Bill Gates"], "Brendan Eich", 2), - new Question("What is the mass–energy equivalence equation?", ["E = mc^2", "E = m*c^2", "E = m*c^3", "E = m*c"], "E = mc^2", 3), + new Question("¿Que frase dice Jorge, cuando va a comprobar un codigo?", ["patata", "Y si todo sale bien...", "consol.log()", "break"], "Y si todo sale bien...", 1), + new Question( + "¿De que paìs es Jorge?", + ["Miami", "Venezuela", "Oslo", "Rome"], + "Venezuela", + 1 + ), + new Question( + "¿Cual es la frase actual que usarias para decirle a alguien que no tiene muchas luces?", + ["Tienes menos luces que los coches de los picapiedras", "Tienes menos luces que el 28 de abril", "Tienes menos luces que la feria de Carratraca", "Tienes menos luces que un seat panda"], + "Tienes menos luces que el 28 de abril", + 2 + ), + new Question( + "Qué valor devuelve la expresión [] == ![] en JavaScript, y por qué?", + ["null", "true", "false", "undefined"], + "true", + 3 + ), // Add more questions here ]; const quizDuration = 120; // 120 seconds (2 minutes) - /************ QUIZ INSTANCE ************/ - + // Create a new Quiz instance object const quiz = new Quiz(questions, quizDuration, quizDuration); // 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 - const minutes = Math.floor(quiz.timeRemaining / 60).toString().padStart(2, "0"); + const minutes = Math.floor(quiz.timeRemaining / 60) + .toString() + .padStart(2, "0"); const seconds = (quiz.timeRemaining % 60).toString().padStart(2, "0"); // Display the time remaining in the time remaining container @@ -56,26 +69,37 @@ document.addEventListener("DOMContentLoaded", () => { // Show first question showQuestion(); - /************ TIMER ************/ - let timer; + let timerIdInterval = setInterval(() => { + quiz.timeRemaining--; + const minutes = Math.floor(quiz.timeRemaining / 60) + .toString() + .padStart(2, "0"); + const seconds = (quiz.timeRemaining % 60).toString().padStart(2, "0"); + + // Display the time remaining in the time remaining container + const timeRemainingContainer = document.getElementById("timeRemaining"); + timeRemainingContainer.innerText = `${minutes}:${seconds}`; + + console.log(quiz.timeRemaining) + if(quiz.timeRemaining === 0){ + showResults(); + } + },1000) + /************ EVENT LISTENERS ************/ nextButton.addEventListener("click", nextButtonHandler); - - /************ FUNCTIONS ************/ // showQuestion() - Displays the current question and its choices // nextButtonHandler() - Handles the click on the next button // showResults() - Displays the end view and the quiz results - - function showQuestion() { // If the quiz has ended, show the results if (quiz.hasEnded()) { @@ -91,26 +115,24 @@ 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(); - - // YOUR CODE HERE: // // 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 + 1) / quiz.questions.length) * 100}%`; // This value is hardcoded as a placeholder - // 3. Update the question count text + // 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 @@ -118,6 +140,15 @@ document.addEventListener("DOMContentLoaded", () => { // 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: + + question.choices.forEach(cadaEleccion => { + const eleccion = document.createElement("div"); + eleccion.innerHTML = ` + + `; + choiceContainer.appendChild(eleccion); + }); + /* @@ -127,6 +158,7 @@ document.addEventListener("DOMContentLoaded", () => { // Hint 2: You can use the `element.type`, `element.name`, and `element.value` properties to set the type, name, and value of an element. // Hint 3: You can use the `element.appendChild()` method to append an element to the choices container. // Hint 4: You can use the `element.innerText` property to set the inner text of an element. + } @@ -135,30 +167,41 @@ document.addEventListener("DOMContentLoaded", () => { function nextButtonHandler () { let selectedAnswer; // A variable to store the selected answer value - - // YOUR CODE HERE: // // 1. Get all the choice elements. You can use the `document.querySelectorAll()` method. + const todasLasEleccionesNodos = document.querySelectorAll("input[name='choice']"); + // 2. Loop through all the choice elements and check which one is selected // 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. + todasLasEleccionesNodos.forEach(cadaEleccion => { + if (cadaEleccion.checked){ + selectedAnswer = cadaEleccion.value; + } + }); + // 3. If an answer is selected (`selectedAnswer`), check if it is correct and move to the next question // 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()`. + + quiz.checkAnswer(selectedAnswer); + quiz.moveToNextQuestion(); + showQuestion(); + + } function showResults() { - // YOUR CODE HERE: // // 1. Hide the quiz view (div#quizView) @@ -166,9 +209,9 @@ document.addEventListener("DOMContentLoaded", () => { // 2. Show the end view (div#endView) 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 + clearInterval(timerIdInterval); } - -}); \ No newline at end of file +}); diff --git a/src/question.js b/src/question.js index 68f6631a..75713a97 100644 --- a/src/question.js +++ b/src/question.js @@ -1,7 +1,19 @@ 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 + } + // 2. shuffleChoices() -} \ No newline at end of file + 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]]; + } + } + + } + \ No newline at end of file diff --git a/src/quiz.js b/src/quiz.js index d94cfd14..514d3675 100644 --- a/src/quiz.js +++ b/src/quiz.js @@ -1,15 +1,71 @@ class Quiz { - // YOUR CODE HERE: - // - // 1. constructor (questions, timeLimit, timeRemaining) + // 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() + // 2. getQuestion() + getQuestion() { + return this.questions[this.currentQuestionIndex]; + } - // 4. shuffleQuestions() + // 3. moveToNextQuestion() - // 5. checkAnswer(answer) + moveToNextQuestion() { + this.currentQuestionIndex++; + } - // 6. hasEnded() -} \ No newline at end of file + // 4. shuffleQuestions() + + 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], + ]; + } + } + + // 5. checkAnswer(answer) + + checkAnswer(answer) { + const currentQuestion = this.questions[this.currentQuestionIndex]; + if (currentQuestion.answer === answer) { + this.correctAnswers++; + } + return answer; + } + // 6. hasEnded() + hasEnded() { + if (this.currentQuestionIndex < this.questions.length) { + return false; + } else if (this.currentQuestionIndex === this.questions.length) { + return true; + } + } + + //7. filterQuestionsByDifficulty() method + filterQuestionsByDifficulty(difficulty) { + if (difficulty >= 1 && difficulty <= 3) { + this.questions = this.questions.filter( + (question) => question.difficulty === difficulty + ); + } + } + + //8. averageDifficulty() method + averageDifficulty() { + let sumaDetodaslasdificultades = this.questions.reduce((acc, question) => { + let nuevoacumulado = acc + question.difficulty; + return nuevoacumulado; + }, 0); + return sumaDetodaslasdificultades / this.questions.length; + } +}