用jquery写一个2048数字合并游戏
封面图
•
2025-10-16
•
jQuery
237
0
0
0
下面是一个使用 **jQuery** 实现的简单 **2048 数字合并游戏** 的基本版本。这个版本包含以下功能: - 4x4 的网格 - 使用方向键控制移动(上、下、左、右) - 数字合并逻辑 - 随机生成新数字(2 或 4) - 简单的胜利/失败判断 --- ### ✅ HTML + jQuery 实现 2048 游戏代码 ```html <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>2048 游戏</title> <style> body { font-family: Arial, sans-serif; text-align: center; background: #faf8ef; } #game { display: grid; grid-template-columns: repeat(4, 100px); grid-gap: 10px; margin: 50px auto; width: 420px; } .cell { width: 100px; height: 100px; background: #ccc0b3; border-radius: 5px; line-height: 100px; font-size: 24px; color: #776e65; text-align: center; } .cell[data-value="2"] { background: #eee4da; color: #776e65; } .cell[data-value="4"] { background: #ede0c8; color: #776e65; } .cell[data-value="8"] { background: #f2b179; color: #f9f6f2; } .cell[data-value="16"] { background: #f59563; color: #f9f6f2; } .cell[data-value="32"] { background: #f67c5f; color: #f9f6f2; } .cell[data-value="64"] { background: #f65e3b; color: #f9f6f2; } .cell[data-value="128"] { background: #edcf72; color: #f9f6f2; } .cell[data-value="256"] { background: #edcc61; color: #f9f6f2; } .cell[data-value="512"] { background: #edc850; color: #f9f6f2; } .cell[data-value="1024"] { background: #edc53f; color: #f9f6f2; } .cell[data-value="2048"] { background: #edc22e; color: #f9f6f2; } </style> </head> <body> <h1>2048 Game</h1> <div id="game"></div> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script> const gridSize = 4; let board = []; function initBoard() { board = Array.from({ length: gridSize }, () => Array(gridSize).fill(0)); addRandomTile(); addRandomTile(); renderBoard(); } function renderBoard() { $('#game').empty(); for (let row = 0; row < gridSize; row++) { for (let col = 0; col < gridSize; col++) { const value = board[row][col]; const cell = $('<div>').addClass('cell').attr('data-value', value); if (value !== 0) { cell.text(value); } $('#game').append(cell); } } } function addRandomTile() { const emptyCells = []; for (let row = 0; row < gridSize; row++) { for (let col = 0; col < gridSize; col++) { if (board[row][col] === 0) { emptyCells.push({ row, col }); } } } if (emptyCells.length === 0) return; const randomCell = emptyCells[Math.floor(Math.random() * emptyCells.length)]; board[randomCell.row][randomCell.col] = Math.random() < 0.9 ? 2 : 4; } function moveLeft() { let moved = false; for (let row = 0; row < gridSize; row++) { let merged = Array(gridSize).fill(0); let currentRow = board[row].filter(val => val !== 0); for (let i = 0; i < currentRow.length; i++) { if (i < currentRow.length - 1 && currentRow[i] === currentRow[i + 1]) { merged[i] = currentRow[i] * 2; i++; moved = true; } else { merged[i] = currentRow[i]; } } while (merged.length < gridSize) { merged.push(0); } if (!arraysEqual(board[row], merged)) { board[row] = merged; moved = true; } } return moved; } function moveRight() { let moved = false; for (let row = 0; row < gridSize; row++) { let merged = Array(gridSize).fill(0); let currentRow = board[row].filter(val => val !== 0).reverse(); for (let i = 0; i < currentRow.length; i++) { if (i < currentRow.length - 1 && currentRow[i] === currentRow[i + 1]) { merged[i] = currentRow[i] * 2; i++; moved = true; } else { merged[i] = currentRow[i]; } } merged = merged.reverse(); while (merged.length < gridSize) { merged.push(0); } if (!arraysEqual(board[row], merged)) { board[row] = merged; moved = true; } } return moved; } function moveUp() { let moved = false; for (let col = 0; col < gridSize; col++) { let merged = Array(gridSize).fill(0); let currentCol = []; for (let row = 0; row < gridSize; row++) { if (board[row][col] !== 0) currentCol.push(board[row][col]); } for (let i = 0; i < currentCol.length; i++) { if (i < currentCol.length - 1 && currentCol[i] === currentCol[i + 1]) { merged[i] = currentCol[i] * 2; i++; moved = true; } else { merged[i] = currentCol[i]; } } while (merged.length < gridSize) { merged.push(0); } for (let row = 0; row < gridSize; row++) { if (board[row][col] !== merged[row]) { board[row][col] = merged[row]; moved = true; } } } return moved; } function moveDown() { let moved = false; for (let col = 0; col < gridSize; col++) { let merged = Array(gridSize).fill(0); let currentCol = []; for (let row = 0; row < gridSize; row++) { if (board[row][col] !== 0) currentCol.push(board[row][col]); } currentCol = currentCol.reverse(); for (let i = 0; i < currentCol.length; i++) { if (i < currentCol.length - 1 && currentCol[i] === currentCol[i + 1]) { merged[i] = currentCol[i] * 2; i++; moved = true; } else { merged[i] = currentCol[i]; } } merged = merged.reverse(); while (merged.length < gridSize) { merged.push(0); } for (let row = 0; row < gridSize; row++) { if (board[row][col] !== merged[row]) { board[row][col] = merged[row]; moved = true; } } } return moved; } function arraysEqual(a, b) { return a.length === b.length && a.every((val, index) => val === b[index]); } function checkGameOver() { for (let row = 0; row < gridSize; row++) { for (let col = 0; col < gridSize; col++) { if (board[row][col] === 0) return false; if (row < gridSize - 1 && board[row][col] === board[row + 1][col]) return false; if (col < gridSize - 1 && board[row][col] === board[row][col + 1]) return false; } } return true; } $(document).keydown(function (e) { let moved = false; switch (e.key) { case 'ArrowLeft': moved = moveLeft(); break; case 'ArrowRight': moved = moveRight(); break; case 'ArrowUp': moved = moveUp(); break; case 'ArrowDown': moved = moveDown(); break; } if (moved) { addRandomTile(); renderBoard(); if (checkGameOver()) { alert("Game Over!"); } } }); initBoard(); </script> </body> </html> ``` --- ### 📌 功能说明 - **初始化**: 创建一个 4x4 的网格,随机放置两个 `2`。 - **移动逻辑**: 上下左右四个方向的移动,合并相同数字。 - **添加新数字**: 每次移动后,如果还有空位,就随机添加一个 `2` 或 `4`。 - **游戏结束**: 当没有可移动空间时,弹出“Game Over”提示。 --- ### 🧠 可扩展性 你可以进一步扩展这个游戏: - 添加分数系统 - 增加动画效果 - 加入“重新开始”按钮 - 使用本地存储保存最高分 --- 如果你需要我帮你实现更高级的功能(如动画、得分统计等),欢迎继续提问!
上一篇:
jQuery或者js给当前页面设置标题
下一篇:
用jquery实现Flappy Bird小游戏
标题录入,一次不能超过6条
返回顶部
留言
留言
评论