2048是一款流行的滑动方块游戏,玩家通过滑动屏幕将相同数字的方块合并,最终目标是得到一个2048的方块。以下是使用JavaScript编写2048游戏的基础概念和相关内容:
以下是一个简单的2048游戏实现:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>2048 Game</title>
<style>
.game-board {
display: grid;
grid-template-columns: repeat(4, 100px);
grid-gap: 10px;
}
.cell {
width: 100px;
height: 100px;
background-color: #bbada0;
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
color: white;
}
</style>
</head>
<body>
<div id="game-board" class="game-board"></div>
<script>
const size = 4;
let board = createBoard(size);
renderBoard(board);
addRandomTile(board);
addRandomTile(board);
document.addEventListener('keydown', (event) => {
switch (event.key) {
case 'ArrowUp':
board = moveUp(board);
break;
case 'ArrowDown':
board = moveDown(board);
break;
case 'ArrowLeft':
board = moveLeft(board);
break;
case 'ArrowRight':
board = moveRight(board);
break;
}
renderBoard(board);
addRandomTile(board);
checkGameOver(board);
});
function createBoard(size) {
return Array.from({ length: size }, () => Array(size).fill(0));
}
function renderBoard(board) {
const gameBoard = document.getElementById('game-board');
gameBoard.innerHTML = '';
board.forEach(row => {
row.forEach(cell => {
const div = document.createElement('div');
div.className = 'cell';
div.textContent = cell === 0 ? '' : cell;
gameBoard.appendChild(div);
});
});
}
function addRandomTile(board) {
const emptyCells = [];
board.forEach((row, i) => {
row.forEach((cell, j) => {
if (cell === 0) emptyCells.push({ i, j });
});
});
if (emptyCells.length > 0) {
const { i, j } = emptyCells[Math.floor(Math.random() * emptyCells.length)];
board[i][j] = Math.random() < 0.9 ? 2 : 4;
}
}
function moveLeft(board) {
return board.map(row => {
return row.filter(cell => cell !== 0).reduce((acc, cell) => {
if (acc.length > 0 && acc[acc.length - 1] === cell) {
acc[acc.length - 1] *= 2;
} else {
acc.push(cell);
}
return acc;
}, []);
}).map(row => row.concat(Array(size - row.length).fill(0)));
}
function moveRight(board) {
return board.map(row => {
return row.filter(cell => cell !== 0).reduceRight((acc, cell) => {
if (acc.length > 0 && acc[0] === cell) {
acc[0] *= 2;
} else {
acc.unshift(cell);
}
return acc;
}, []).reverse();
}).map(row => Array(size - row.length).fill(0).concat(row));
}
function moveUp(board) {
return transpose(board).map(row => moveLeft(row)).map(row => transpose(row));
}
function moveDown(board) {
return transpose(board).map(row => moveRight(row)).map(row => transpose(row));
}
function transpose(matrix) {
return matrix[0].map((_, colIndex) => matrix.map(row => row[colIndex]));
}
function checkGameOver(board) {
for (let i = 0; i < size; i++) {
for (let j = 0; j < size; j++) {
if (board[i][j] === 0) return;
if (i > 0 && board[i][j] === board[i - 1][j]) return;
if (i < size - 1 && board[i][j] === board[i + 1][j]) return;
if (j > 0 && board[i][j] === board[i][j - 1]) return;
if (j < size - 1 && board[i][j] === board[i][j + 1]) return;
}
}
alert('Game Over!');
}
</script>
</body>
</html>
moveLeft
、moveRight
、moveUp
、moveDown
函数中的逻辑,确保每次移动和合并都正确处理。Math.random()
生成随机数时,确保逻辑正确,可以通过多次测试验证随机性。checkGameOver
函数中的逻辑,确保所有可能的移动方向都被正确检测。通过以上代码和解释,你应该能够理解并实现一个基本的2048游戏。如果有更多具体问题,可以进一步探讨。
领取专属 10元无门槛券
手把手带您无忧上云