//bagian tempat main ama buat generate game 2d var canvas = document.getElementById("game"); var content = canvas.getContext("2d"); const Text = document.getElementById("text"); const GameoverText = document.getElementById("gameover"); //settingan awal var grid = 24; var count = 0; var speed = 10; var score = 0; var highscore = 0; var ArahUlar = 0; var GameOverTimer = 0; var GameStart = false; var ModeH = false; const persiapan = document.getElementById("start"); //generate gambar external var KepalaUlarImage = new Image(); KepalaUlarImage.src = "image/KepalaHorizontalKanan.png"; var KepalAtas = new Image(); KepalAtas.src = "image/KepalaVertikalAtas.png"; var KepalaBawah = new Image(); KepalaBawah.src = "image/KepalaVertikalBawah.png"; var KepalaKiri = new Image(); KepalaKiri.src = "image/KepalaHorizontalKiri.png"; var KepalaKanan = new Image(); KepalaKanan.src = "image/KepalaHorizontalKanan.png"; // ↑ kepala ular var BadanUlarImage = new Image(); BadanUlarImage.src = "image/BadanVertikal.png"; // ↑ badan ular var ApelImage = new Image(); ApelImage.src = "image/ApelLayer.png"; // Apel var TembokImage = new Image(); TembokImage.src = "image/Tembok.png"; // Tembok Batagor //D:\PROYEK UAS\Game ULAR\gambar\Tembok.png //set posisi ular dan Apel var Ular = { x: 528, y: 240, dx: grid, dy: 0, cells: [], maxCells: 4 }; var Apel = { x: 0, y: 0 }; var Tembok = []; UpdateScore(0); RandomizeApel(); //mastiin gambar external generate dulu sebelum game start KepalaUlarImage.onload = function () { function gameLoop() {} }; //ngatur biar game ga langsung jalan function StartingGame(menantang) { 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); }); document.getElementById("mode-tambahan").addEventListener("click", function () { StartingGame(true); }); //gameover terus ngatur ular ke setting awal function gameLoop() { if (!GameStart) { requestAnimationFrame(gameLoop); return; } if (GameOverTimer > 0) { GameOverTimer -= 0.006; GameoverText.innerHTML = GameOverTimer > 0 ? "Gameover " + GameOverTimer.toFixed(0).toString() : ""; if (GameOverTimer <= 0) { Ular.x = 528; Ular.y = 240; Ular.cells = []; Ular.maxCells = 4; Ular.dx = grid; Ular.dy = 0; RandomizeApel(); UpdateScore(0); if (ModeH) { RandomSpawnWall(); } else { Tembok = []; } } } else { InputKeyboard(); ClearCanvas(); Movement(); IntiGame(); } requestAnimationFrame(gameLoop); } //random spawn Apel function RandomizeApel() { var pembataslebar = Math.floor(canvas.width / grid); var pembatastinggi = Math.floor(canvas.height / grid); Apel.x = Math.floor(Math.random() * pembataslebar) * grid; Apel.y = Math.floor(Math.random() * pembatastinggi) * grid; } function RandomSpawnWall() { var TembokX, TembokY; var kosong; var pembataslebar = Math.floor(canvas.width / grid); var pembatastinggi = Math.floor(canvas.height / grid); //create tembok do { kosong = true; 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++) { if (Ular.cells[i].x === TembokX && Ular.cells[i].y === TembokY) { kosong = false; break; } } //tidak memperbolehkan tembok spawn sama dengan apel if (TembokX === Apel.x && TembokY === Apel.y) { kosong = false; } 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 ... berapa enaknya ya? 😁 function PenambahanTembok() { if (Tembok.length < Math.floor(score / 2)) { RandomSpawnWall(); } } //set dan update score function UpdateScore(amount) { score = amount > 0 ? score + amount : 0; highscore = score > highscore ? score : highscore; Text.innerHTML = "Score: " + score + "
Highscore: " + highscore + "
Speed: " + speed; PenambahanTembok(); } //gameover countdown function GameOver() { GameOverTimer = 3; } //reset isi canvas doang function ClearCanvas() { 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); Tembok.forEach(function (bata) { content.drawImage(TembokImage, bata.x, bata.y, grid, grid); }); Ular.cells.forEach(function (cell, index) { if (index === 0) { // Logika Pemilihan Gambar Kepala Ular var posisiKepalaImage; if (Ular.dx === grid) { // KANAN posisiKepalaImage = KepalaKanan; } else if (Ular.dx === -grid) { // KIRI posisiKepalaImage = KepalaKiri; } else if (Ular.dy === -grid) { // ATAS posisiKepalaImage = KepalAtas; } else if (Ular.dy === grid) { // BAWAH posisiKepalaImage = KepalaBawah; } else { // Default, misalnya saat game baru mulai (dx=grid, dy=0, atau default awal) posisiKepalaImage = KepalaKanan; } content.drawImage(posisiKepalaImage, cell.x, cell.y, grid, grid); } else { content.drawImage(BadanUlarImage, cell.x, cell.y, grid, grid); } }); //bagian generate ular Ular.cells.forEach(function (cell, index) { if (index === 0) { content.drawImage(KepalaUlarImage, cell.x, cell.y, grid, grid); } else { content.drawImage(BadanUlarImage, cell.x, cell.y, grid, grid); } //buat pas ular makan Apel if (cell.x === Apel.x && cell.y === Apel.y) { Ular.maxCells += 1; UpdateScore(1); RandomizeApel(); } //tabrak tembok = mati if (index === 0) { Tembok.forEach(function (bata) { if (cell.x === bata.x && cell.y === bata.y) { GameOver(); } }); } //buat pas ular mati kena badan sendiri for (var i = index + 1; i < Ular.cells.length; i++) if (cell.x === Ular.cells[i].x && cell.y === Ular.cells[i].y) GameOver(); }); } function Movement() { 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 buat jalan function InputKeyboard() { document.addEventListener("keydown", function (e) { 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; } 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; } if (e.code === "KeyE" || e.code == "KeyQ") speed = e.code == "KeyE" && speed > 4 ? speed - 1 : e.code == "KeyQ" && speed < 9 ? speed + 1 : speed; }); } gameLoop();