| 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(); |
|
|