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