| const gameBoard = document.querySelector(".game-board"); | |
| const scoreDisplay = document.querySelector("#score"); | |
| let board = []; | |
| let score = 0; | |
| function initBoard() { | |
| board = [ | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| ]; | |
| addTile(); | |
| addTile(); | |
| renderBoard(); | |
| } | |
| function addTile() { | |
| let emptyTiles = []; | |
| for (let i = 0; i < 4; i++) { | |
| for (let j = 0; j < 4; j++) { | |
| if (board[i][j] === 0) { | |
| emptyTiles.push({ row: i, col: j }); | |
| } | |
| } | |
| } | |
| if (emptyTiles.length > 0) { | |
| let randomTile = emptyTiles[Math.floor(Math.random() * emptyTiles.length)]; | |
| board[randomTile.row][randomTile.col] = Math.random() < 0.9 ? 2 : 4; | |
| } | |
| } | |
| function renderBoard() { | |
| gameBoard.innerHTML = ""; | |
| for (let i = 0; i < 4; i++) { | |
| for (let j = 0; j < 4; j++) { | |
| const tileValue = board[i][j]; | |
| const tile = document.createElement("div"); | |
| tile.classList.add("tile"); | |
| if (tileValue > 0) { | |
| tile.classList.add(`tile-${tileValue}`); | |
| tile.textContent = tileValue; | |
| } | |
| gameBoard.appendChild(tile); | |
| } | |
| } | |
| scoreDisplay.textContent = score; | |
| } | |
| function moveTiles(direction) { | |
| let moved = false; | |
| if (direction === "ArrowUp") { | |
| for (let j = 0; j < 4; j++) { | |
| for (let i = 1; i < 4; i++) { | |
| if (board[i][j] !== 0) { | |
| let k = i; | |
| while (k > 0 && board[k - 1][j] === 0) { | |
| board[k - 1][j] = board[k][j]; | |
| board[k][j] = 0; | |
| k--; | |
| moved = true; | |
| } | |
| if (k > 0 && board[k - 1][j] === board[k][j]) { | |
| board[k - 1][j] *= 2; | |
| score += board[k - 1][j]; | |
| board[k][j] = 0; | |
| moved = true; | |
| } | |
| } | |
| } | |
| } | |
| } else if (direction === "ArrowDown") { | |
| for (let j = 0; j < 4; j++) { | |
| for (let i = 2; i >= 0; i--) { | |
| if (board[i][j] !== 0) { | |
| let k = i; | |
| while (k < 3 && board[k + 1][j] === 0) { | |
| board[k + 1][j] = board[k][j]; | |
| board[k][j] = 0; | |
| k++; | |
| moved = true; | |
| } | |
| if (k < 3 && board[k + 1][j] === board[k][j]) { | |
| board[k + 1][j] *= 2; | |
| score += board[k + 1][j]; | |
| board[k][j] = 0; | |
| moved = true; | |
| } | |
| } | |
| } | |
| } | |
| } else if (direction === "ArrowLeft") { | |
| for (let i = 0; i < 4; i++) { | |
| for (let j = 1; j < 4; j++) { | |
| if (board[i][j] !== 0) { | |
| let k = j; | |
| while (k > 0 && board[i][k - 1] === 0) { | |
| board[i][k - 1] = board[i][k]; | |
| board[i][k] = 0; | |
| k--; | |
| moved = true; | |
| } | |
| if (k > 0 && board[i][k - 1] === board[i][k]) { | |
| board[i][k - 1] *= 2; | |
| score += board[i][k - 1]; | |
| board[i][k] = 0; | |
| moved = true; | |
| } | |
| } | |
| } | |
| } | |
| } else if (direction === "ArrowRight") { | |
| for (let i = 0; i < 4; i++) { | |
| for (let j = 2; j >= 0; j--) { | |
| if (board[i][j] !== 0) { | |
| let k = j; | |
| while (k < 3 && board[i][k + 1] === 0) { | |
| board[i][k + 1] = board[i][k]; | |
| board[i][k] = 0; | |
| k++; | |
| moved = true; | |
| } | |
| if (k < 3 && board[i][k + 1] === board[i][k]) { | |
| board[i][k + 1] *= 2; | |
| score += board[i][k + 1]; | |
| board[i][k] = 0; | |
| moved = true; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| if (moved) { | |
| addTile(); | |
| renderBoard(); | |
| } | |
| } | |
| document.addEventListener("keydown", (event) => { | |
| moveTiles(event.key); | |
| }); | |
| initBoard(); | |