165 lines
4.0 KiB
JavaScript
165 lines
4.0 KiB
JavaScript
import { questions } from "./soal.js";
|
|
|
|
const questionElement = document.getElementById("question")
|
|
const answerBtn = document.getElementById("btn-answer")
|
|
|
|
let currentQuestionIndex = 0;
|
|
let score = 0;
|
|
|
|
let wrongCount = 0;
|
|
let maxWrong = 3;
|
|
|
|
function shuffle(array) {
|
|
for (let i = array.length - 1; i > 0; i--) {
|
|
const j = Math.floor(Math.random() * (i + 1));
|
|
[array[i], array[j]] = [array[j], array[i]];
|
|
}
|
|
return array;
|
|
}
|
|
|
|
function startQuiz(){
|
|
currentQuestionIndex = 0;
|
|
score = 0;
|
|
shuffle(questions);
|
|
showQuestion();
|
|
}
|
|
|
|
|
|
function showQuestion(){
|
|
resetState();
|
|
let currentQuestion = questions[currentQuestionIndex]
|
|
let questionNumber = currentQuestionIndex + 1
|
|
questionElement.innerHTML = questionNumber + ". " + currentQuestion.question;
|
|
currentQuestion.answers.forEach(answer => {
|
|
const button = document.createElement("button");
|
|
button.innerHTML = answer.text;
|
|
button.classList.add("btn");
|
|
answerBtn.appendChild(button);
|
|
button.dataset.correct = answer.correct;
|
|
button.addEventListener("click", selectAnswer)
|
|
});
|
|
}
|
|
|
|
function resetState(){
|
|
while(answerBtn.firstChild){
|
|
answerBtn.removeChild(answerBtn.firstChild)
|
|
}
|
|
}
|
|
|
|
function updateHearts(){
|
|
const hearts = [
|
|
document.getElementById("h1"),
|
|
document.getElementById("h2"),
|
|
document.getElementById("h3")
|
|
];
|
|
|
|
hearts.forEach((h, i) => {
|
|
if(i < wrongCount){
|
|
h.src = "/assets/Design/HeartEmpty.png";
|
|
} else {
|
|
h.src = "/assets/Design/Heartfull.png";
|
|
}
|
|
});
|
|
|
|
}
|
|
|
|
function dmg(){
|
|
const dmg = document.getElementById("dmg");
|
|
|
|
dmg.style.display = "block";
|
|
|
|
setTimeout(() => {
|
|
dmg.style.display = "none";
|
|
}, 450);
|
|
}
|
|
|
|
function shake(el){
|
|
el.classList.remove("animate-shake");
|
|
void el.offsetWidth;
|
|
el.classList.add("animate-shake");
|
|
|
|
el.addEventListener("animationend", () => {
|
|
el.classList.remove("animate-shake");
|
|
}, { once: true });
|
|
}
|
|
|
|
|
|
function selectAnswer(e){
|
|
const selectedBtn = e.target;
|
|
const isCorrect = selectedBtn.dataset.correct === "true";
|
|
if(isCorrect){
|
|
selectedBtn.classList.add("correct");
|
|
score += 10;
|
|
shake(document.getElementById("boss"))
|
|
dmg();
|
|
const bgm = document.getElementById("sfx");
|
|
bgm.play()
|
|
} else {
|
|
selectedBtn.classList.add("Incorrect");
|
|
wrongCount ++;
|
|
shake(document.getElementById("hrt"))
|
|
updateHearts();
|
|
const bgm = document.getElementById("sfxhrt");
|
|
bgm.play()
|
|
|
|
if(wrongCount >= maxWrong){
|
|
setTimeout(()=>{
|
|
showScore();
|
|
}, 500);
|
|
return;
|
|
}
|
|
}
|
|
|
|
Array.from(answerBtn.children).forEach(button => {
|
|
if(button.dataset.correct === "true") button.classList.add("correct");
|
|
button.disabled = true;
|
|
},
|
|
setTimeout(nextQuestion, 500)
|
|
);
|
|
}
|
|
|
|
function showScore(){
|
|
resetState();
|
|
const show = questionElement.innerHTML = `you scored ${score} out of ${questions.length}!`;
|
|
postScore(score);
|
|
}
|
|
|
|
function handleNextBtn(){
|
|
currentQuestionIndex++;
|
|
if(currentQuestionIndex < questions.length){
|
|
showQuestion();
|
|
} else {
|
|
showScore();
|
|
}
|
|
}
|
|
|
|
function nextQuestion(){
|
|
if(currentQuestionIndex < questions.length){
|
|
handleNextBtn()
|
|
} else {
|
|
showScore()
|
|
}
|
|
}
|
|
|
|
function postScore(score){
|
|
fetch('/score.php', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ score: score })
|
|
})
|
|
.then(r => r.json())
|
|
.then(data => {
|
|
console.log("Server response:", data);
|
|
|
|
if(data.success || data.message === "Score accumulated") {
|
|
window.location.href = "../leaderboard.php";
|
|
} else {
|
|
window.location.href = "../leaderboard.php";
|
|
}
|
|
})
|
|
.catch(err => {
|
|
console.error("Fetch error:", err);
|
|
alert("Terjadi kesalahan koneksi.");
|
|
});
|
|
}
|
|
startQuiz() |