diff --git a/GameLogic.js b/GameLogic.js
index 2357cc9..872771a 100644
--- a/GameLogic.js
+++ b/GameLogic.js
@@ -20,26 +20,56 @@ var ModeH = false;
const persiapan = document.getElementById("start");
//generate gambar external
-var KepalaKeKanan = new Image();
-KepalaKeKanan.src = "image/KepalaHorizontalKanan.png";
-var KepalaKeAtas = new Image();
-KepalaKeAtas.src = "image/KepalaVertikalAtas.png";
-var KepalaKeKiri = new Image();
-KepalaKeKiri.src = "image/KepalaVertikalBawah.png"; // Asumsi ini adalah Kepala ke KIRI
-var KepalaKeBawah = new Image();
-KepalaKeBawah.src = "image/KepalaHorizontalKiri.png"; // Asumsi ini adalah Kepala ke BAWAH
-// ↑ kepala ular
-var BadanHori = new Image();
-BadanHori.src = "image/BadanHorizontal.png";
-var BadanVerti = new Image();
-BadanVerti.src = "image/BadanVertical.png";
-// ↑ badan ular
+//kepala
+const kepala = {
+ kanan: new Image(),
+ kiri: new Image(),
+ atas: new Image(),
+ bawah: new Image(),
+};
+kepala.kanan.src = "image/KepalaHorizontalKanan.png";
+kepala.kiri.src = "image/KepalaHorizontalKiri.png";
+kepala.atas.src = "image/KepalaVertikalAtas.png";
+kepala.bawah.src = "image/KepalaVertikalBawah.png";
+
+//badan
+const badan = {
+ horizontal: new Image(),
+ vertical: new Image(),
+};
+badan.horizontal.src = "image/BadanHorizontal.png";
+badan.vertical.src = "image/BadanVertikal.png";
+
+//const beluk
+const belok = {
+ AtasKanan: new Image(),
+ AtasKiri: new Image(),
+ BawahKanan: new Image(),
+ BawahKiri: new Image(),
+};
+belok.AtasKanan.src = "image/BelokAtasKanan.png";
+belok.AtasKiri.src = "image/BelokAtasKiri.png";
+belok.BawahKanan.src = "image/BelokBawahKanan.png";
+belok.BawahKiri.src = "image/BelokBawahKiri.png";
+
+//bokong
+const bokong = {
+ kanan: new Image(),
+ kiri: new Image(),
+ atas: new Image(),
+ bawah: new Image(),
+};
+bokong.kanan.src = "image/BokongHorizontalKanan.png";
+bokong.kiri.src = "image/BokongHorizontalKiri.png";
+bokong.atas.src = "image/BokongVertikalAtas.png";
+bokong.bawah.src = "image/BokongVertikalBawah.png";
+
var ApelImage = new Image();
-ApelImage.src = "image/ApelLayer.png"; // Apel
+ApelImage.src = "image/ApelLayer.png";
var TembokImage = new Image();
-TembokImage.src = "image/Tembok.png"; // Tembok Batagor
+TembokImage.src = "image/Tembok.png";
//set posisi ular dan Apel
var Ular = { x: 528, y: 240, dx: grid, dy: 0, cells: [], maxCells: 4 };
@@ -48,355 +78,382 @@ var Tembok = [];
UpdateScore(0);
RandomizeApel();
-//mastiin gambar external generate dulu sebelum game start
-KepalaKeKanan.onload = function () {
- // Memastikan gambar termuat, meskipun fungsi ini tidak melakukan apa-apa selain deklarasi
- function gameLoop() {}
-};
+
+function getDirection(cell1, cell2) {
+ if (cell2.x > cell1.x) return "kanan";
+ if (cell2.x < cell1.x) return "kiri";
+ if (cell2.y > cell1.y) return "bawah";
+ if (cell2.y < cell1.y) return "atas";
+ return null;
+}
//ngatur biar game ga langsung jalan
function StartingGame(menantang) {
- ModeH = menantang;
- persiapan.style.display = "none";
- if (ModeH) {
- RandomSpawnWall();
- } else {
- Tembok = [];
- }
- GameStart = true;
+ ModeH = menantang;
+ persiapan.style.display = "none";
+ if (ModeH) {
+ RandomSpawnWall();
+ } else {
+ Tembok = [];
+ }
+ GameStart = true;
}
//buat ngatur batu spwan apa ga nanti
document.getElementById("mode-normal").addEventListener("click", function () {
- StartingGame(false);
+ StartingGame(false);
});
document.getElementById("mode-tambahan").addEventListener("click", function () {
- StartingGame(true);
+ StartingGame(true);
});
//play again pas gameover
function resetGame() {
- Ular.x = 528;
- Ular.y = 240;
- Ular.cells = [];
- Ular.maxCells = 4;
- Ular.dx = grid;
- Ular.dy = 0;
- Tembok = [];
- RandomizeApel();
- UpdateScore(0);
- ModeH = false;
- // Penting: Jangan set GameStart=false di sini jika ingin memulai ulang game loop
- // Kita set GameStart=false saat game over, lalu di sini kita persiapkan UI
+ Ular.x = 528;
+ Ular.y = 240;
+ Ular.cells = [];
+ Ular.maxCells = 4;
+ Ular.dx = grid;
+ Ular.dy = 0;
+ Tembok = [];
+ RandomizeApel();
+ UpdateScore(0);
}
//ngatur tombol pas gameover kemana abis di klik
PlayAgain.addEventListener("click", function () {
- UpDead.style.display = "none";
- resetGame();
- persiapan.style.display = "flex";
+ UpDead.style.display = "none";
+ resetGame();
+ ModeH = false;
+ persiapan.style.display = "flex";
});
Udahan.addEventListener("click", function () {
- UpDead.style.display = "none";
- resetGame();
- // Opsional: Redirect ke halaman lain
- // window.location.href = 'leaderboard.php';
+ UpDead.style.display = "none";
+ resetGame();
+ ModeH = false;
});
//gameover terus ngatur ular ke setting awal
function gameLoop() {
- if (!GameStart) {
- requestAnimationFrame(gameLoop);
- return;
- }
- ClearCanvas();
- Movement();
- IntiGame();
+ if (!GameStart) {
+ requestAnimationFrame(gameLoop);
+ return;
+ }
+ ClearCanvas();
+ Movement();
+ IntiGame();
- requestAnimationFrame(gameLoop);
+ requestAnimationFrame(gameLoop);
}
//random spawn Apel
function RandomizeApel() {
- var pembataslebar = Math.floor(canvas.width / grid);
- var pembatastinggi = Math.floor(canvas.height / grid);
-
- do {
- Apel.x = Math.floor(Math.random() * pembataslebar) * grid;
- Apel.y = Math.floor(Math.random() * pembatastinggi) * grid;
-
- // Pastikan Apel tidak spawn di atas ular
- var isOverlapSnake = Ular.cells.some(cell => cell.x === Apel.x && cell.y === Apel.y);
-
- // Pastikan Apel tidak spawn di atas tembok
- var isOverlapWall = Tembok.some(bata => bata.x === Apel.x && bata.y === Apel.y);
+ var pembataslebar = Math.floor(canvas.width / grid);
+ var pembatastinggi = Math.floor(canvas.height / grid);
+
+ do {
+ Apel.x = Math.floor(Math.random() * pembataslebar) * grid;
+ Apel.y = Math.floor(Math.random() * pembatastinggi) * grid;
+
+ //mastiin Apel gak spawn di atas ular
+ var isOverlapSnake = Ular.cells.some(cell => cell.x === Apel.x && cell.y === Apel.y);
+
+ //mastiin Apel gak spawn di atas tembok
+ var isOverlapWall = Tembok.some(bata => bata.x === Apel.x && bata.y === Apel.y);
- } while (isOverlapSnake || isOverlapWall);
+ } while (isOverlapSnake || isOverlapWall);
}
//random spawn tembok
function RandomSpawnWall() {
- var TembokX, TembokY;
- var kosong;
- var pembataslebar = Math.floor(canvas.width / grid);
- var pembatastinggi = Math.floor(canvas.height / grid);
+ var TembokX, TembokY;
+ var kosong;
+ var pembataslebar = Math.floor(canvas.width / grid);
+ var pembatastinggi = Math.floor(canvas.height / grid);
- //create tembok
- do {
- kosong = true;
+ //create tembok
+ do {
+ kosong = true;
- TembokX = Math.floor(Math.random() * pembataslebar) * grid;
- TembokY = Math.floor(Math.random() * pembatastinggi) * grid;
+ TembokX = Math.floor(Math.random() * pembataslebar) * grid;
+ TembokY = Math.floor(Math.random() * pembatastinggi) * grid;
- // cek untuk posisi yang mau di kasih tembok ada/tidak ada ularnya
- for (var i = 0; i < Ular.cells.length; i++) {
- // Hindari spawn di sekitar kepala ular (misal 5 kotak pertama)
- if (Math.abs(Ular.cells[i].x - TembokX) <= grid * 5 && Math.abs(Ular.cells[i].y - TembokY) <= grid * 5) {
- kosong = false;
- break;
- }
- }
+ //cek untuk posisi yang mau di kasih tembok ada/tidak ada ularnya
+ for (var i = 0; i < Ular.cells.length; i++) {
+ if (Math.abs(Ular.cells[i].x - TembokX) <= grid * 5 && Math.abs(Ular.cells[i].y - TembokY) <= grid * 5) {
+ kosong = false;
+ break;
+ }
+ }
- // tidak memperbolehkan tembok spawn sama dengan apel
- if (TembokX === Apel.x && TembokY === Apel.y) {
- kosong = false;
- }
+ // tidak memperbolehkan tembok spawn sama dengan apel
+ if (TembokX === Apel.x && TembokY === Apel.y) {
+ kosong = false;
+ }
- // Cek agar tembok tidak menumpuk
- for (var i = 0; i < Tembok.length; i++) {
- if (Tembok[i].x === TembokX && Tembok[i].y === TembokY) {
- kosong = false;
- break;
- }
- }
- } while (kosong === false);
- Tembok.push({ x: TembokX, y: TembokY });
+ //cek agar tembok tidak menumpuk
+ for (var i = 0; i < Tembok.length; i++) {
+ if (Tembok[i].x === TembokX && Tembok[i].y === TembokY) {
+ kosong = false;
+ break;
+ }
+ }
+ } while (kosong === false);
+ Tembok.push({ x: TembokX, y: TembokY });
}
//nambah tembok tiap score kelipatan
function PenambahanTembok() {
- if (ModeH) {
- // Tambah tembok setiap 2 skor, tapi jangan melebihi batas (misal 15 tembok)
- if (score > 0 && score % 2 === 0 && Tembok.length < 15 && Tembok.length < score / 2) {
- RandomSpawnWall();
- }
- }
+ if (ModeH) {
+ if (score > 0 && score % 2 === 0 && Tembok.length < 15 && Tembok.length < score / 2) {
+ RandomSpawnWall();
+ }
+ }
}
//set dan update score
function UpdateScore(amount) {
- score = amount > 0 ? score + amount : 0;
- // Highscore hanya di update jika skor > highscore yang TERCATAT LOKAL.
- // Highscore dari database biasanya diambil saat inisialisasi.
- highscore = score > highscore ? score : highscore;
-
- Text.innerHTML =
- "Score: " + score + "
Highscore: " + highscore + "
Speed: " + speed;
+ score = amount > 0 ? score + amount : 0;
+ highscore = score > highscore ? score : highscore;
+
+ Text.innerHTML =
+ "Score: " + score + "
Highscore: " + highscore + "
Speed: " + speed;
- PenambahanTembok();
+ PenambahanTembok();
}
//tampilin gameover
function GameOver() {
- GameStart = false;
- ClearCanvas();
+ GameStart = false;
+ ClearCanvas();
- const GameMode = ModeH ? "Tambahan" : "Normal";
-
- // Kirim skor ke server hanya jika skor lebih besar dari 0 (atau sesuai kriteria)
- if (score > 0) {
- kirimSkorKeServer(score, GameMode);
- }
-
- // TAMPILKAN POP-UP GAME OVER
- ScoreMain.innerHTML = "Score: " + score;
- UpDead.style.display = "flex";
+ const GameMode = ModeH ? "Tambahan" : "Normal";
+ if (score > 0) {
+ }
+
+ ScoreMain.innerHTML = "Score: " + score;
+ UpDead.style.display = "flex";
}
//reset isi canvas doang
function ClearCanvas() {
- content.clearRect(0, 0, canvas.width, canvas.height);
+ content.clearRect(0, 0, canvas.width, canvas.height);
}
//bagian utama:
//ular makan dan mati pas ketemu badannya
function IntiGame() {
- // buat gambarnya bisa keluar
- content.drawImage(ApelImage, Apel.x, Apel.y, grid, grid);
-
- // Gambar Tembok
- Tembok.forEach(function (bata) {
- content.drawImage(TembokImage, bata.x, bata.y, grid, grid);
- });
+ // buat gambarnya bisa keluar
+ content.drawImage(ApelImage, Apel.x, Apel.y, grid, grid);
+
+ // Gambar Tembok
+ Tembok.forEach(function (bata) {
+ content.drawImage(TembokImage, bata.x, bata.y, grid, grid);
+ });
- // Gambar Ular
+ // Gambar Ular
Ular.cells.forEach(function (cell, index) {
- if (index === 0) {
- // Logika Pemilihan Gambar Kepala Ular
- var posisiKepalaImage;
- if (Ular.dx === grid) { // KANAN
- posisiKepalaImage = KepalaKeKanan;
- } else if (Ular.dx === -grid) { // KIRI
- posisiKepalaImage = KepalaKeKiri;
- } else if (Ular.dy === -grid) { // ATAS
- posisiKepalaImage = KepalaKeAtas; // Perlu dicek, di atas Anda menamakannya KepalaKeBawah?
- } else if (Ular.dy === grid) { // BAWAH
- posisiKepalaImage = KepalaKeBawah; // Perlu dicek, di atas Anda menamakannya KepalaKeAtas?
- } else {
- posisiKepalaImage = KepalaKeKanan;
- }
- content.drawImage(posisiKepalaImage, cell.x, cell.y, grid, grid);
- } else {
- // Logika sederhana untuk badan: selalu horizontal
- // Catatan: untuk badan vertikal/belokan, perlu logika tambahan, tapi kita ikuti kode asli Anda.
- content.drawImage(BadanHori, cell.x, cell.y, grid, grid);
- }
+ var gambarUlar = null;
+ //pala ulo
+ if (index === 0) {
+ if (Ular.dx === grid) gambarUlar = kepala.kanan;
+ else if (Ular.dx === -grid) gambarUlar = kepala.kiri;
+ else if (Ular.dy === -grid) gambarUlar = kepala.atas;
+ else if (Ular.dy === grid) gambarUlar = kepala.bawah;
+ }
- // buat pas ular makan Apel (Deteksi tabrakan kepala vs Apel)
- if (index === 0 && cell.x === Apel.x && cell.y === Apel.y) {
- Ular.maxCells += 1;
- UpdateScore(1);
- RandomizeApel();
- }
+ //bokong
+ else if (index === Ular.cells.length - 1) {
+ var sebelum = Ular.cells[index - 1];
+ var arahEkor = getDirection(sebelum, cell);
- // tabrak tembok = mati (Hanya kepala yang dicek)
- if (index === 0) {
- Tembok.forEach(function (bata) {
- if (cell.x === bata.x && cell.y === bata.y) {
- GameOver();
- }
- });
- }
+ if (arahEkor === "kanan") gambarUlar = bokong.kanan;
+ else if (arahEkor === "kiri") gambarUlar = bokong.kiri;
+ else if (arahEkor === "atas") gambarUlar = bokong.atas;
+ else if (arahEkor === "bawah") gambarUlar = bokong.bawah;
+ }
- // buat pas ular mati kena badan sendiri (Hanya kepala vs sisa badan)
+ //badan
+ else {
+ var sebelum = Ular.cells[index - 1];
+ var sesudah = Ular.cells[index + 1];
+
+ var ArahMasuk = getDirection(sebelum, cell);
+ var ArahKeluar = getDirection(cell, sesudah);
+
+ if (ArahMasuk && ArahKeluar) {
+ if (ArahMasuk === ArahKeluar) {
+ // Badan Lurus (Horizontal/Vertical)
+ if (ArahMasuk === "kiri" || ArahMasuk === "kanan") {
+ gambarUlar = badan.horizontal;
+ } else {
+ gambarUlar = badan.vertical;
+ }
+ }
+
+ // Belokan (Dibalik: Atas menggunakan kondisi Bawah, Bawah menggunakan kondisi Atas)
+ else {
+ // belok.AtasKanan (Menggunakan logika BawahKanan sebelumnya)
+ if ((ArahMasuk === "bawah" && ArahKeluar === "kanan") || (ArahMasuk === "kiri" && ArahKeluar === "atas"))
+ gambarUlar = belok.AtasKanan;
+
+ // belok.AtasKiri (Menggunakan logika BawahKiri sebelumnya)
+ else if ((ArahMasuk === "bawah" && ArahKeluar === "kiri") || (ArahMasuk === "kanan" && ArahKeluar === "atas"))
+ gambarUlar = belok.AtasKiri;
+
+ // belok.BawahKanan (Menggunakan logika AtasKanan sebelumnya)
+ else if ((ArahMasuk === "atas" && ArahKeluar === "kanan") || (ArahMasuk === "kiri" && ArahKeluar === "bawah"))
+ gambarUlar = belok.BawahKanan;
+
+ // belok.BawahKiri (Menggunakan logika AtasKiri sebelumnya)
+ else if ((ArahMasuk === "atas" && ArahKeluar === "kiri") || (ArahMasuk === "kanan" && ArahKeluar === "bawah"))
+ gambarUlar = belok.BawahKiri;
+ }
+ }
+ }
+
+ if (gambarUlar) {
+ content.drawImage(gambarUlar, cell.x, cell.y, grid, grid);
+ }
+
+ //ular makan apel
if (index === 0) {
- for (var i = 1; i < Ular.cells.length; i++) { // Mulai dari index 1 (badan)
- if (cell.x === Ular.cells[i].x && cell.y === Ular.cells[i].y) {
- GameOver();
- }
- }
- }
- });
+ if (cell.x === Apel.x && cell.y === Apel.y) {
+ Ular.maxCells += 1;
+ UpdateScore(1);
+ RandomizeApel();
+ }
+
+ //nabrak tembok
+ Tembok.forEach(function (bata) {
+ if (cell.x === bata.x && cell.y === bata.y) {
+ GameOver();
+ }
+ });
+
+ //nabrak diri e dw
+ for (var i = 1; i < Ular.cells.length; i++) {
+ if (cell.x === Ular.cells[i].x && cell.y === Ular.cells[i].y) {
+ GameOver();
+ }
+ }
+ }
+ });
}
-//update teks pada speed kalau score update
+//update speed kalau score update
function Movement() {
- if (++count < speed) return;
- if (ArahUlar > 0) ArahUlar--;
- count = 0;
-
- // Pindahkan kepala
- Ular.x += Ular.dx;
- Ular.y += Ular.dy;
-
- // Cek batas layar
- if (
- Ular.x < 0 ||
- Ular.x >= canvas.width ||
- Ular.y < 0 ||
- Ular.y >= canvas.height
- )
- GameOver();
-
- // Tambahkan posisi baru ke sel pertama (Kepala)
- Ular.cells.unshift({ x: Ular.x, y: Ular.y });
-
- // Hapus sel terakhir (Ekor)
- if (Ular.cells.length > Ular.maxCells) Ular.cells.pop();
+ if (++count < speed) return;
+ if (ArahUlar > 0) ArahUlar--;
+ count = 0;
+
+ Ular.x += Ular.dx;
+ Ular.y += Ular.dy;
+
+ if (
+ Ular.x < 0 ||
+ Ular.x >= canvas.width ||
+ Ular.y < 0 ||
+ Ular.y >= canvas.height
+ )
+ GameOver();
+
+ Ular.cells.unshift({ x: Ular.x, y: Ular.y });
+
+ if (Ular.cells.length > Ular.maxCells) Ular.cells.pop();
}
//input keyboard
function InputKeyboard() {
- document.addEventListener("keydown", function (e) {
- if (!GameStart) return;
+ document.addEventListener("keydown", function (e) {
+ if (!GameStart) return;
- // Key A, D (Kiri/Kanan)
- if (
- ArahUlar == 0 &&
- ((e.code == "KeyA" && Ular.dx === 0) ||
- (e.code == "KeyD" && Ular.dx === 0))
- ) {
- ArahUlar = 1;
- Ular.dx = e.code === "KeyA" ? -grid : grid;
- Ular.dy = 0;
- }
- // Key W, S (Atas/Bawah)
- else if (
- ArahUlar == 0 &&
- ((e.code === "KeyW" && Ular.dy === 0) ||
- (e.code == "KeyS" && Ular.dy === 0))
- ) {
- ArahUlar = 1;
- Ular.dy = e.code == "KeyW" ? -grid : grid;
- Ular.dx = 0;
- }
- // Arrow Up, Down
- else if (
- ArahUlar == 0 &&
- ((e.code === "ArrowUp" && Ular.dy === 0) ||
- (e.code == "ArrowDown" && Ular.dy === 0))
- ) {
- ArahUlar = 1;
- Ular.dy = e.code == "ArrowUp" ? -grid : grid;
- Ular.dx = 0;
- }
- // Arrow Left, Right
- else if (
- ArahUlar == 0 &&
- ((e.code === "ArrowLeft" && Ular.dx === 0) ||
- (e.code == "ArrowRight" && Ular.dx === 0))
- ) {
- ArahUlar = 1;
- Ular.dx = e.code == "ArrowLeft" ? -grid : grid;
- Ular.dy = 0;
- }
+ if (
+ ArahUlar == 0 &&
+ ((e.code == "KeyA" && Ular.dx === 0) ||
+ (e.code == "KeyD" && Ular.dx === 0))
+ ) {
+ ArahUlar = 1;
+ Ular.dx = e.code === "KeyA" ? -grid : grid;
+ Ular.dy = 0;
+ }
- // Key E (Cepat/Kurangi speed), Key Q (Lambat/Tambah speed)
- if (e.code === "KeyE" || e.code == "KeyQ")
- speed =
- e.code == "KeyE" && speed > 2
- ? speed - 1
- : e.code == "KeyQ" && speed < 30
- ? speed + 1
- : speed;
- });
+ else if (
+ ArahUlar == 0 &&
+ ((e.code === "KeyW" && Ular.dy === 0) ||
+ (e.code == "KeyS" && Ular.dy === 0))
+ ) {
+ ArahUlar = 1;
+ Ular.dy = e.code == "KeyW" ? -grid : grid;
+ Ular.dx = 0;
+ }
+
+ else if (
+ ArahUlar == 0 &&
+ ((e.code === "ArrowUp" && Ular.dy === 0) ||
+ (e.code == "ArrowDown" && Ular.dy === 0))
+ ) {
+ ArahUlar = 1;
+ Ular.dy = e.code == "ArrowUp" ? -grid : grid;
+ Ular.dx = 0;
+ }
+
+ else if (
+ ArahUlar == 0 &&
+ ((e.code === "ArrowLeft" && Ular.dx === 0) ||
+ (e.code == "ArrowRight" && Ular.dx === 0))
+ ) {
+ ArahUlar = 1;
+ Ular.dx = e.code == "ArrowLeft" ? -grid : grid;
+ Ular.dy = 0;
+ }
+
+ if (e.code === "KeyE" || e.code == "KeyQ")
+ speed =
+ e.code == "KeyE" && speed > 2
+ ? speed - 1
+ : e.code == "KeyQ" && speed < 30
+ ? speed + 1
+ : speed;
+ });
}
+// nti ae la daud
// function kirimSkorKeServer(skor, GameMode) {
-// console.log(`Mengirim skor ${skor} (Mode: ${GameMode}) ke server...`);
+// console.log(`Mengirim skor ${skor} (Mode: ${GameMode}) ke server...`);
-// fetch('score.php', {
-// method: 'POST',
-// headers: {
-// 'Content-Type': 'application/json',
-// },
-// body: JSON.stringify({
-// score: skor,
-// mode: GameMode
-// }),
-// })
-// .then(response => {
-// if (!response.ok) {
-// return response.json().then(error => { throw new Error(error.message || 'Gagal menyimpan skor'); });
-// }
-// return response.json();
-// })
-// .then(data => {
-// if (data.status === 'success') {
-// console.log('✅ Berhasil:', data.message);
-// if (data.message.includes('Highscore baru')) {
-// highscore = skor;
-// UpdateScore(0);
-// }
-// } else {
-// console.error('❌ Error Server:', data.message);
-// }
-// })
-// .catch((error) => {
-// console.error('⚠️ Error Jaringan atau Proses:', error.message);
-// });
+// fetch('score.php', {
+// method: 'POST',
+// headers: {
+// 'Content-Type': 'application/json',
+// },
+// body: JSON.stringify({
+// score: skor,
+// mode: GameMode
+// }),
+// })
+// .then(response => {
+// if (!response.ok) {
+// return response.json().then(error => { throw new Error(error.message || 'Gagal menyimpan skor'); });
+// }
+// return response.json();
+// })
+// .then(data => {
+// if (data.status === 'success') {
+// console.log('✅ Berhasil:', data.message);
+// if (data.message.includes('Highscore baru')) {
+// highscore = skor;
+// UpdateScore(0);
+// }
+// } else {
+// console.error('❌ Error Server:', data.message);
+// }
+// })
+// .catch((error) => {
+// console.error('⚠️ Error Jaringan atau Proses:', error.message);
+// });
// }
InputKeyboard();
diff --git a/score.php b/score.php
new file mode 100644
index 0000000..1200b27
--- /dev/null
+++ b/score.php
@@ -0,0 +1,81 @@
+ 'error', 'message' => 'Metode tidak diizinkan.']);
+ exit;
+}
+
+if (!isset($_SESSION['id_user']) && !isset($_SESSION['username'])) {
+ http_response_code(401);
+ echo json_encode(['status' => 'error', 'message' => 'Anda harus login untuk menyimpan skor.']);
+ exit;
+}
+
+$input = json_decode(file_get_contents('php://input'), true);
+
+$final_score = (int)($input['score'] ?? 0);
+
+if ($final_score <= 0) {
+ http_response_code(400);
+ echo json_encode(['status' => 'error', 'message' => 'Skor tidak valid atau 0.']);
+ exit;
+}
+
+$user_id = null;
+if (isset($_SESSION['id_user'])) {
+ $user_id = $_SESSION['id_user'];
+} elseif (isset($_SESSION['username'])) {
+
+ $username = $_SESSION['username'];
+
+ $getID_sql = "SELECT id_user FROM users WHERE username = '$username'";
+ $result_id = mysqli_query($koneksi, $getID_sql);
+
+ if ($result_id && mysqli_num_rows($result_id) > 0) {
+ $row = mysqli_fetch_assoc($result_id);
+ $user_id = $row['id_user'];
+ }
+}
+
+if (!$user_id) {
+ http_response_code(401);
+ echo json_encode(['status' => 'error', 'message' => 'ID pengguna tidak ditemukan.']);
+ exit;
+}
+
+$sql = "UPDATE users SET score = ? WHERE id_user = ? AND score < ?";
+
+if ($stmt = mysqli_prepare($koneksi, $sql)) {
+ mysqli_stmt_bind_param($stmt, "iii", $final_score, $user_id, $final_score);
+ $exec = mysqli_stmt_execute($stmt);
+
+ if ($exec) {
+ $rows_affected = mysqli_stmt_affected_rows($stmt);
+
+ if ($rows_affected > 0) {
+ $message = 'Skor berhasil diperbarui. Ini adalah Highscore baru!';
+ } else {
+ $message = 'Skor berhasil dikirim, tetapi skor tidak lebih tinggi dari Highscore sebelumnya.';
+ }
+
+ echo json_encode([
+ 'status' => 'success',
+ 'message' => $message,
+ 'skor_terkirim' => $final_score
+ ]);
+ } else {
+ http_response_code(500);
+ echo json_encode(['status' => 'error', 'message' => 'Gagal menjalankan kueri update: ' . mysqli_stmt_error($stmt)]);
+ }
+ mysqli_stmt_close($stmt);
+
+} else {
+ http_response_code(500);
+ echo json_encode(['status' => 'error', 'message' => 'Gagal mempersiapkan statement: ' . mysqli_error($koneksi)]);
+}
+?>
\ No newline at end of file