From 19d3eb26cd3633901ad08c2b3fc9be6db3e84592 Mon Sep 17 00:00:00 2001 From: Evelyn Date: Mon, 15 Dec 2025 01:25:49 +0700 Subject: [PATCH] test --- gameboard-easy.html | 39 ++++++++++++++++ gameboard-hard.html | 10 ++++ homestyle.css | 2 - leaderboard.css | 109 ++++++++++++++++++++++++++++++++++++++++++++ leaderboard.html | 36 +++++++++++++++ leaderboard.js | 108 +++++++++++++++++++++++++++++++++++++++++++ leaderboard.json | 5 ++ 7 files changed, 307 insertions(+), 2 deletions(-) create mode 100644 leaderboard.css create mode 100644 leaderboard.html create mode 100644 leaderboard.js create mode 100644 leaderboard.json diff --git a/gameboard-easy.html b/gameboard-easy.html index 44cb748..0eb8b17 100644 --- a/gameboard-easy.html +++ b/gameboard-easy.html @@ -281,6 +281,45 @@ body { + + diff --git a/leaderboard.js b/leaderboard.js new file mode 100644 index 0000000..8de9675 --- /dev/null +++ b/leaderboard.js @@ -0,0 +1,108 @@ +const leaderboardFile = "leaderboard.json"; + +// 🔹 Buka popup leaderboard +function openLeaderboard() { + document.getElementById("leaderboardPopup").style.display = "flex"; + loadLeaderboard(); +} + +// 🔹 Tutup popup leaderboard +function closeLeaderboard() { + document.getElementById("leaderboardPopup").style.display = "none"; +} + + +// 🔹 Muat leaderboard dari JSON +async function loadLeaderboard() { + const difficulty = localStorage.getItem("difficulty") || "easy"; + + try { + const res = await fetch(leaderboardFile + "?v=" + Date.now()); + const data = await res.json(); + + // Ambil list sesuai difficulty + let list = data[difficulty] || []; + + // Urutkan score dari paling tinggi + list.sort((a, b) => b.score - a.score); + + const tbody = document.getElementById("leaderboard-body"); + tbody.innerHTML = ""; + + newOrder.length = 0; + list.forEach((p, i) => { + newOrder.push(p.name); + + let movementClass = ""; + if (previousOrder.length > 0) { + const oldIndex = previousOrder.indexOf(p.name); + if (oldIndex !== -1) { + if (oldIndex > i) movementClass = "rank-up"; + if (oldIndex < i) movementClass = "rank-down"; + } + } + + tbody.innerHTML += ` + + #${i + 1} + ${p.name} + ${p.score} + `; + }); + + highlightTab(difficulty); + + // Simpan posisi lama → jadi perbandingan load berikutnya + localStorage.setItem("prev_ranking", JSON.stringify(newOrder)); + + } catch (error) { + document.getElementById("leaderboard-body").innerHTML = + `⚠ Gagal memuat leaderboard`; + } +} + + +// 🔹 Menyimpan skor ke leaderboard.json +async function saveScore(name, score, difficulty) { + const res = await fetch(leaderboardFile); + let data = await res.json(); + let board = data[difficulty]; + + const player = board.find(e => e.name.toLowerCase() === name.toLowerCase()); + + if (player) { + if (score > player.score) player.score = score; + } else { + board.push({ name, score }); + } + + await fetch(leaderboardFile, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(data, null, 2), + }); +} + + +const difficulty = localStorage.getItem("difficulty") || "easy"; +localStorage.setItem("playerName", username); + +let previousOrder = JSON.parse(localStorage.getItem("prev_ranking") || "[]"); +let newOrder = []; + +function highlightTab(diff) { + document.querySelectorAll(".difficulty-tabs button").forEach(btn => btn.classList.remove("active")); + document.getElementById("tab-" + diff).classList.add("active"); +} + +function changeDifficulty(diff) { + localStorage.setItem("difficulty", diff); + previousOrder = JSON.parse(localStorage.getItem("prev_ranking")) || []; + loadLeaderboard(); + highlightTab(diff); +} + + + + + diff --git a/leaderboard.json b/leaderboard.json new file mode 100644 index 0000000..b6e5fd7 --- /dev/null +++ b/leaderboard.json @@ -0,0 +1,5 @@ +{ + "easy": [], + "medium": [], + "hard": [] +}