diff --git a/secret/snake/audio/dead.mp3 b/secret/snake/audio/dead.mp3 new file mode 100644 index 0000000..414bf65 Binary files /dev/null and b/secret/snake/audio/dead.mp3 differ diff --git a/secret/snake/audio/down.mp3 b/secret/snake/audio/down.mp3 new file mode 100644 index 0000000..03533a0 Binary files /dev/null and b/secret/snake/audio/down.mp3 differ diff --git a/secret/snake/audio/eat.mp3 b/secret/snake/audio/eat.mp3 new file mode 100644 index 0000000..076198c Binary files /dev/null and b/secret/snake/audio/eat.mp3 differ diff --git a/secret/snake/audio/left.mp3 b/secret/snake/audio/left.mp3 new file mode 100644 index 0000000..4d3d245 Binary files /dev/null and b/secret/snake/audio/left.mp3 differ diff --git a/secret/snake/audio/right.mp3 b/secret/snake/audio/right.mp3 new file mode 100644 index 0000000..64408ea Binary files /dev/null and b/secret/snake/audio/right.mp3 differ diff --git a/secret/snake/audio/up.mp3 b/secret/snake/audio/up.mp3 new file mode 100644 index 0000000..97cfbe9 Binary files /dev/null and b/secret/snake/audio/up.mp3 differ diff --git a/secret/snake/game.js b/secret/snake/game.js index 08d50d5..1dc78c9 100644 --- a/secret/snake/game.js +++ b/secret/snake/game.js @@ -1,150 +1,138 @@ "use strict"; -const upButton = document.getElementById("up"); -const downButton = document.getElementById("down"); -const leftButton = document.getElementById("left"); -const rightButton = document.getElementById("right"); -const startButton = document.getElementById("start"); -const grid = document.createElement("div"); -grid.id = "grid"; -document.querySelector(".game").appendChild(grid); +document.addEventListener("DOMContentLoaded", () => { + class SnakeGame { + constructor() { + this.cvs = document.getElementById("game"); + this.ctx = this.cvs.getContext("2d"); + this.startBtn = document.getElementById("start"); + this.description = document.getElementById("description"); + this.box = 32; -let snake = [{ x: 5, y: 5 }]; -let apple = { x: 8, y: 5 }; -let direction = { x: 0, y: 0 }; -let gameInterval = null; -let isGameRunning = false; -const gridSize = 10; + this.ground = new Image(); + this.ground.src = "img/ground.png"; -function initGame() { - grid.style.display = "grid"; - grid.style.gridTemplateColumns = `repeat(${gridSize}, 1fr)`; - grid.style.gridTemplateRows = `repeat(${gridSize}, 1fr)`; - grid.style.width = "350px"; - grid.style.height = "350px"; - document.getElementById("title").style.display = "none"; - document.getElementById("description").style.display = "none"; + this.foodImg = new Image(); + this.foodImg.src = "img/food.png"; - isGameRunning = true; - snake = [{ x: 5, y: 5 }]; - apple = spawnApple(); - direction = { x: 0, y: 0 }; + this.sounds = { + dead: new Audio("audio/dead.mp3"), + eat: new Audio("audio/eat.mp3"), + up: new Audio("audio/up.mp3"), + right: new Audio("audio/right.mp3"), + left: new Audio("audio/left.mp3"), + down: new Audio("audio/down.mp3"), + }; - clearInterval(gameInterval); - gameInterval = setInterval(gameLoop, 200); - render(); -} + this.snake = [{ x: 9 * this.box, y: 10 * this.box }]; + this.food = this.getRandomFoodPosition(); + this.score = 0; + this.direction = null; + this.game = null; -function spawnApple() { - let newApple; - do { - newApple = { - x: Math.floor(Math.random() * gridSize), - y: Math.floor(Math.random() * gridSize), - }; - } while ( - snake.some( - (segment) => segment.x === newApple.x && segment.y === newApple.y - ) - ); - return newApple; -} + document.addEventListener("keydown", (event) => + this.handleKeyPress(event) + ); + this.initControls(); + this.startBtn.addEventListener("click", () => this.startGame()); + } -function updateSnake() { - const newHead = { - x: snake[0].x + direction.x, - y: snake[0].y + direction.y, - }; + getRandomFoodPosition() { + return { + x: Math.floor(Math.random() * 17 + 1) * this.box, + y: Math.floor(Math.random() * 15 + 3) * this.box, + }; + } - if (newHead.x < 0) newHead.x = gridSize - 1; - if (newHead.y < 0) newHead.y = gridSize - 1; - if (newHead.x >= gridSize) newHead.x = 0; - if (newHead.y >= gridSize) newHead.y = 0; + handleKeyPress(event) { + const key = event.key.toLowerCase(); + if ((key === "arrowleft" || key === "a") && this.direction !== "RIGHT") + this.changeDirection("LEFT"); + if ((key === "arrowup" || key === "w") && this.direction !== "DOWN") + this.changeDirection("UP"); + if ((key === "arrowright" || key === "d") && this.direction !== "LEFT") + this.changeDirection("RIGHT"); + if ((key === "arrowdown" || key === "s") && this.direction !== "UP") + this.changeDirection("DOWN"); + } - if ( - snake.some((segment) => segment.x === newHead.x && segment.y === newHead.y) - ) { - gameOver(); - return; - } + initControls() { + document + .getElementById("up") + .addEventListener("click", () => this.changeDirection("UP")); + document + .getElementById("down") + .addEventListener("click", () => this.changeDirection("DOWN")); + document + .getElementById("left") + .addEventListener("click", () => this.changeDirection("LEFT")); + document + .getElementById("right") + .addEventListener("click", () => this.changeDirection("RIGHT")); + } - snake.unshift(newHead); + changeDirection(newDirection) { + this.direction = newDirection; + this.sounds[newDirection.toLowerCase()].play(); + } - if (newHead.x === apple.x && newHead.y === apple.y) { - apple = spawnApple(); - } else { - snake.pop(); - } -} + collision(head, array) { + return array.some( + (segment) => segment.x === head.x && segment.y === head.y + ); + } -function render() { - grid.innerHTML = ""; + draw() { + this.ctx.drawImage(this.ground, 0, 0); - for (let y = 0; y < gridSize; y++) { - for (let x = 0; x < gridSize; x++) { - const cell = document.createElement("div"); - cell.classList.add("cell"); + this.snake.forEach((segment, index) => { + this.ctx.fillStyle = index === 0 ? "green" : "white"; + this.ctx.fillRect(segment.x, segment.y, this.box, this.box); + this.ctx.strokeStyle = "red"; + this.ctx.strokeRect(segment.x, segment.y, this.box, this.box); + }); - if ((x + y) % 2 === 0) { - cell.classList.add("light-green"); + this.ctx.drawImage(this.foodImg, this.food.x, this.food.y); + + let snakeX = this.snake[0].x; + let snakeY = this.snake[0].y; + + if (this.direction === "LEFT") snakeX -= this.box; + if (this.direction === "UP") snakeY -= this.box; + if (this.direction === "RIGHT") snakeX += this.box; + if (this.direction === "DOWN") snakeY += this.box; + + if (snakeX === this.food.x && snakeY === this.food.y) { + this.score++; + this.sounds.eat.play(); + this.food = this.getRandomFoodPosition(); } else { - cell.classList.add("dark-green"); + this.snake.pop(); } - if (snake.some((segment) => segment.x === x && segment.y === y)) { - cell.classList.add("snake"); + let newHead = { x: snakeX, y: snakeY }; + if ( + snakeX < this.box || + snakeX > 17 * this.box || + snakeY < 3 * this.box || + snakeY > 17 * this.box || + this.collision(newHead, this.snake) + ) { + clearInterval(this.game); + this.sounds.dead.play(); } - if (apple.x === x && apple.y === y) { - cell.classList.add("apple"); - } + this.snake.unshift(newHead); + this.ctx.fillStyle = "white"; + this.ctx.font = "45px Changa one"; + this.ctx.fillText(this.score, 2 * this.box, 1.6 * this.box); + } - grid.appendChild(cell); + startGame() { + this.description.style.display = "none"; + this.game = setInterval(() => this.draw(), 100); } } -} -function gameLoop() { - if (!isGameRunning) return; - updateSnake(); - render(); -} - -function gameOver() { - alert("Game Over!"); - clearInterval(gameInterval); - isGameRunning = false; -} - -function handleDirectionInput(key) { - switch (key) { - case "ArrowUp": - case "w": - if (direction.y === 0) direction = { x: 0, y: -1 }; - break; - case "ArrowDown": - case "s": - if (direction.y === 0) direction = { x: 0, y: 1 }; - break; - case "ArrowLeft": - case "a": - if (direction.x === 0) direction = { x: -1, y: 0 }; - break; - case "ArrowRight": - case "d": - if (direction.x === 0) direction = { x: 1, y: 0 }; - break; - } -} - -upButton.addEventListener("click", () => handleDirectionInput("ArrowUp")); -downButton.addEventListener("click", () => handleDirectionInput("ArrowDown")); -leftButton.addEventListener("click", () => handleDirectionInput("ArrowLeft")); -rightButton.addEventListener("click", () => handleDirectionInput("ArrowRight")); -startButton.addEventListener("click", () => { - if (!isGameRunning) initGame(); -}); - -document.addEventListener("keydown", (event) => { - handleDirectionInput(event.key); + new SnakeGame(); }); diff --git a/secret/snake/img/food.png b/secret/snake/img/food.png new file mode 100644 index 0000000..921fe78 Binary files /dev/null and b/secret/snake/img/food.png differ diff --git a/secret/snake/img/ground.png b/secret/snake/img/ground.png new file mode 100644 index 0000000..218b190 Binary files /dev/null and b/secret/snake/img/ground.png differ