“2048”游戏网页版html+css+js

[复制链接]
发表于 2024-11-8 00:37:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
“2048”游戏网页版html+css+js

 别忘了请点个赞+收藏+关注支持一下博主喵!!!
   2048 游戏是一个非常流行的数字拼图游戏,玩家通过移动方块使相同数字的方块合并,终极到达 2048 或更高分数。本教程将详细先容怎样使用 HTML、CSS 和 JavaScript 创建一个简朴的 2048 游戏网页。
  项目结构如下:(懒得搭vue了)
  1. 2048-game/
  2. ├── index.html
  3. ├── styles.css
  4. └── script.js
复制代码
1. index.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8"> <!-- 设置文档的字符编码为 UTF-8 -->
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- 使页面在移动设备上适配屏幕宽度 -->
  6.     <title>2048 Game</title> <!-- 页面标题 -->
  7.     <link rel="stylesheet" href="styles.css"> <!-- 引入外部 CSS 文件 -->
  8. </head>
  9. <body>
  10.     <div class="game-container"> <!-- 游戏容器,用于包裹整个游戏界面 -->
  11.         <div class="score-container">0</div> <!-- 分数显示区域 -->
  12.         <div class="grid-container"> <!-- 网格容器,用于包裹 4x4 的游戏网格 -->
  13.             <div class="grid-row"> <!-- 每一行的网格 -->
  14.                 <div class="grid-cell"></div> <!-- 每一个网格单元 -->
  15.                 <div class="grid-cell"></div>
  16.                 <div class="grid-cell"></div>
  17.                 <div class="grid-cell"></div>
  18.             </div>
  19.             <div class="grid-row">
  20.                 <div class="grid-cell"></div>
  21.                 <div class="grid-cell"></div>
  22.                 <div class="grid-cell"></div>
  23.                 <div class="grid-cell"></div>
  24.             </div>
  25.             <div class="grid-row">
  26.                 <div class="grid-cell"></div>
  27.                 <div class="grid-cell"></div>
  28.                 <div class="grid-cell"></div>
  29.                 <div class="grid-cell"></div>
  30.             </div>
  31.             <div class="grid-row">
  32.                 <div class="grid-cell"></div>
  33.                 <div class="grid-cell"></div>
  34.                 <div class="grid-cell"></div>
  35.                 <div class="grid-cell"></div>
  36.             </div>
  37.         </div>
  38.         <button id="restart-button">Restart</button> <!-- 重新开始按钮 -->
  39.     </div>
  40.     <script src="script.js"></script> <!-- 引入外部 JavaScript 文件 -->
  41. </body>
  42. </html>
复制代码
2. styles.css

  1. body {
  2.     display: flex; /* 使用 Flexbox 布局 */
  3.     justify-content: center; /* 水平居中 */
  4.     align-items: center; /* 垂直居中 */
  5.     height: 100vh; /* 占满整个视窗高度 */
  6.     margin: 0; /* 移除默认外边距 */
  7.     background-color: #faf8ef; /* 背景颜色 */
  8.     font-family: Arial, sans-serif; /* 字体设置 */
  9. }
  10. .game-container {
  11.     width: 500px; /* 容器宽度 */
  12.     height: 500px; /* 容器高度 */
  13.     position: relative; /* 相对定位 */
  14.     background-color: #bbada0; /* 背景颜色 */
  15.     border-radius: 10px; /* 圆角 */
  16.     box-shadow: 5px 5px 15px rgba(0, 0, 0, 0.3); /* 阴影效果 */
  17. }
  18. .score-container {
  19.     position: absolute; /* 绝对定位 */
  20.     top: 10px; /* 距离顶部 10px */
  21.     left: 10px; /* 距离左边 10px */
  22.     background-color: #eee4da; /* 背景颜色 */
  23.     padding: 10px; /* 内边距 */
  24.     border-radius: 5px; /* 圆角 */
  25.     font-size: 24px; /* 字体大小 */
  26.     font-weight: bold; /* 加粗字体 */
  27. }
  28. .grid-container {
  29.     width: 400px; /* 网格容器宽度 */
  30.     height: 400px; /* 网格容器高度 */
  31.     position: absolute; /* 绝对定位 */
  32.     top: 50%; /* 距离顶部 50% */
  33.     left: 50%; /* 距离左边 50% */
  34.     transform: translate(-50%, -50%); /* 居中对齐 */
  35.     display: grid; /* 使用 Grid 布局 */
  36.     grid-template-columns: repeat(4, 100px); /* 4 列,每列 100px */
  37.     grid-template-rows: repeat(4, 100px); /* 4 行,每行 100px */
  38.     gap: 10px; /* 网格间距 */
  39. }
  40. .grid-cell {
  41.     background-color: #cdc1b4; /* 背景颜色 */
  42.     border-radius: 3px; /* 圆角 */
  43.     display: flex; /* 使用 Flexbox 布局 */
  44.     justify-content: center; /* 水平居中 */
  45.     align-items: center; /* 垂直居中 */
  46.     font-size: 32px; /* 字体大小 */
  47.     font-weight: bold; /* 加粗字体 */
  48.     color: #776e65; /* 文字颜色 */
  49. }
  50. /* 不同数字的方块样式 */
  51. .grid-cell.number-2 { background-color: #eee4da; color: #776e65; }
  52. .grid-cell.number-4 { background-color: #ede0c8; color: #776e65; }
  53. .grid-cell.number-8 { background-color: #f2b179; color: #f9f6f2; }
  54. .grid-cell.number-16 { background-color: #f59563; color: #f9f6f2; }
  55. .grid-cell.number-32 { background-color: #f67c5f; color: #f9f6f2; }
  56. .grid-cell.number-64 { background-color: #f65e3b; color: #f9f6f2; }
  57. .grid-cell.number-128 { background-color: #edcf72; color: #f9f6f2; }
  58. .grid-cell.number-256 { background-color: #edcc61; color: #f9f6f2; }
  59. .grid-cell.number-512 { background-color: #edc850; color: #f9f6f2; }
  60. .grid-cell.number-1024 { background-color: #edc53f; color: #f9f6f2; }
  61. .grid-cell.number-2048 { background-color: #edc22e; color: #f9f6f2; }
  62. #restart-button {
  63.     position: absolute; /* 绝对定位 */
  64.     bottom: 10px; /* 距离底部 10px */
  65.     left: 50%; /* 距离左边 50% */
  66.     transform: translateX(-50%); /* 水平居中 */
  67.     padding: 10px 20px; /* 内边距 */
  68.     background-color: #8f7a66; /* 背景颜色 */
  69.     color: #f9f6f2; /* 文字颜色 */
  70.     border: none; /* 无边框 */
  71.     border-radius: 5px; /* 圆角 */
  72.     cursor: pointer; /* 鼠标指针样式 */
  73.     font-size: 18px; /* 字体大小 */
  74.     font-weight: bold; /* 加粗字体 */
  75. }
  76. #restart-button:hover {
  77.     background-color: #746655; /* 鼠标悬停时的背景颜色 */
  78. }
复制代码
3. 最难的script.js

  1. const grid = document.querySelector('.grid-container'); // 获取网格容器
  2. const cells = document.querySelectorAll('.grid-cell'); // 获取所有网格单元
  3. const scoreContainer = document.querySelector('.score-container'); // 获取分数显示区域
  4. const restartButton = document.getElementById('restart-button'); // 获取重新开始按钮
  5. let score = 0; // 初始化分数
  6. let hasWon = false; // 标记是否已经赢得游戏
  7. const matrix = [
  8.     [0, 0, 0, 0], // 初始化 4x4 的矩阵
  9.     [0, 0, 0, 0],
  10.     [0, 0, 0, 0],
  11.     [0, 0, 0, 0]
  12. ];
  13. const winNumber = 2048; // 赢得游戏的目标数字
  14. // 获取一个随机的空格子
  15. function getRandomEmptyCell() {
  16.     const emptyCells = []; // 存储所有空格子的坐标
  17.     for (let i = 0; i < 4; i++) {
  18.         for (let j = 0; j < 4; j++) {
  19.             if (matrix[i][j] === 0) { // 如果格子为空
  20.                 emptyCells.push({ row: i, col: j }); // 将坐标加入空格子列表
  21.             }
  22.         }
  23.     }
  24.     if (emptyCells.length > 0) { // 如果有空格子
  25.         const randomIndex = Math.floor(Math.random() * emptyCells.length); // 随机选择一个空格子
  26.         return emptyCells[randomIndex];
  27.     }
  28.     return null; // 没有空格子返回 null
  29. }
  30. // 在随机选择的空格子中添加一个新方块(2 或 4)
  31. function addRandomTile() {
  32.     const cell = getRandomEmptyCell();
  33.     if (cell) {
  34.         const value = Math.random() < 0.9 ? 2 : 4; // 90% 的概率生成 2,10% 的概率生成 4
  35.         matrix[cell.row][cell.col] = value; // 更新矩阵
  36.         updateGrid(); // 更新网格显示
  37.     }
  38. }
  39. // 更新 HTML 网格中的方块显示
  40. function updateGrid() {
  41.     cells.forEach((cell, index) => {
  42.         const row = Math.floor(index / 4); // 计算当前单元格所在的行
  43.         const col = index % 4; // 计算当前单元格所在的列
  44.         const value = matrix[row][col]; // 获取矩阵中的值
  45.         cell.textContent = value || ''; // 显示值,如果没有值则显示空字符串
  46.         cell.classList.remove('number-2', 'number-4', 'number-8', 'number-16', 'number-32', 'number-64', 'number-128', 'number-256', 'number-512', 'number-1024', 'number-2048'); // 移除所有样式类
  47.         if (value !== 0) { // 如果有值,添加对应的样式类
  48.             cell.classList.add(`number-${value}`);
  49.         }
  50.     });
  51. }
  52. // 向上移动
  53. function moveUp() {
  54.     for (let col = 0; col < 4; col++) { // 遍历每一列
  55.         let tempCol = []; // 临时存储非零值
  56.         for (let row = 0; row < 4; row++) {
  57.             if (matrix[row][col] !== 0) {
  58.                 tempCol.push(matrix[row][col]); // 将非零值加入临时列表
  59.             }
  60.         }
  61.         tempCol = mergeTiles(tempCol); // 合并相同的值
  62.         for (let row = 0; row < 4; row++) {
  63.             matrix[row][col] = tempCol[row] || 0; // 更新矩阵
  64.         }
  65.     }
  66.     addRandomTile(); // 添加新的方块
  67.     checkGameOver(); // 检查游戏是否结束
  68. }
  69. // 向下移动
  70. function moveDown() {
  71.     for (let col = 0; col < 4; col++) { // 遍历每一列
  72.         let tempCol = []; // 临时存储非零值
  73.         for (let row = 3; row >= 0; row--) {
  74.             if (matrix[row][col] !== 0) {
  75.                 tempCol.push(matrix[row][col]); // 将非零值加入临时列表
  76.             }
  77.         }
  78.         tempCol = mergeTiles(tempCol); // 合并相同的值
  79.         for (let row = 3; row >= 0; row--) {
  80.             matrix[row][col] = tempCol[3 - row] || 0; // 更新矩阵
  81.         }
  82.     }
  83.     addRandomTile(); // 添加新的方块
  84.     checkGameOver(); // 检查游戏是否结束
  85. }
  86. // 向左移动
  87. function moveLeft() {
  88.     for (let row = 0; row < 4; row++) { // 遍历每一行
  89.         let tempRow = []; // 临时存储非零值
  90.         for (let col = 0; col < 4; col++) {
  91.             if (matrix[row][col] !== 0) {
  92.                 tempRow.push(matrix[row][col]); // 将非零值加入临时列表
  93.             }
  94.         }
  95.         tempRow = mergeTiles(tempRow); // 合并相同的值
  96.         for (let col = 0; col < 4; col++) {
  97.             matrix[row][col] = tempRow[col] || 0; // 更新矩阵
  98.         }
  99.     }
  100.     addRandomTile(); // 添加新的方块
  101.     checkGameOver(); // 检查游戏是否结束
  102. }
  103. // 向右移动
  104. function moveRight() {
  105.     for (let row = 0; row < 4; row++) { // 遍历每一行
  106.         let tempRow = []; // 临时存储非零值
  107.         for (let col = 3; col >= 0; col--) {
  108.             if (matrix[row][col] !== 0) {
  109.                 tempRow.push(matrix[row][col]); // 将非零值加入临时列表
  110.             }
  111.         }
  112.         tempRow = mergeTiles(tempRow); // 合并相同的值
  113.         for (let col = 3; col >= 0; col--) {
  114.             matrix[row][col] = tempRow[3 - col] || 0; // 更新矩阵
  115.         }
  116.     }
  117.     addRandomTile(); // 添加新的方块
  118.     checkGameOver(); // 检查游戏是否结束
  119. }
  120. // 合并相同的值
  121. function mergeTiles(tiles) {
  122.     for (let i = 0; i < tiles.length - 1; i++) {
  123.         if (tiles[i] === tiles[i + 1]) { // 如果相邻的两个值相同
  124.             tiles[i] *= 2; // 合并值
  125.             tiles.splice(i + 1, 1); // 删除合并后的值
  126.             score += tiles[i]; // 更新分数
  127.             scoreContainer.textContent = score; // 更新分数显示
  128.             if (tiles[i] === winNumber && !hasWon) { // 如果达到目标值且未赢过
  129.                 alert('You Win!'); // 提示胜利
  130.                 hasWon = true; // 标记已赢
  131.             }
  132.         }
  133.     }
  134.     while (tiles.length < 4) { // 确保列表长度为 4
  135.         tiles.push(0);
  136.     }
  137.     return tiles;
  138. }
  139. // 检查游戏是否结束
  140. function checkGameOver() {
  141.     let gameOver = true; // 默认游戏结束
  142.     for (let i = 0; i < 4; i++) {
  143.         for (let j = 0; j < 4; j++) {
  144.             if (matrix[i][j] === 0 || // 如果有空格子
  145.                 (i < 3 && matrix[i][j] === matrix[i + 1][j]) || // 或者有相邻的相同值
  146.                 (j < 3 && matrix[i][j] === matrix[i][j + 1])) {
  147.                 gameOver = false; // 游戏未结束
  148.                 break;
  149.             }
  150.         }
  151.         if (!gameOver) break;
  152.     }
  153.     if (gameOver) {
  154.         alert('Game Over!'); // 提示游戏结束
  155.     }
  156. }
  157. // 重新开始游戏
  158. function restartGame() {
  159.     matrix.forEach(row => row.fill(0)); // 重置矩阵
  160.     score = 0; // 重置分数
  161.     hasWon = false; // 重置胜利标记
  162.     scoreContainer.textContent = score; // 更新分数显示
  163.     addRandomTile(); // 添加初始方块
  164.     addRandomTile(); // 添加初始方块
  165.     updateGrid(); // 更新网格显示
  166. }
  167. // 监听键盘事件
  168. document.addEventListener('keydown', (event) => {
  169.     switch (event.key) {
  170.         case 'ArrowUp': // 上箭头
  171.             moveUp();
  172.             break;
  173.         case 'ArrowDown': // 下箭头
  174.             moveDown();
  175.             break;
  176.         case 'ArrowLeft': // 左箭头
  177.             moveLeft();
  178.             break;
  179.         case 'ArrowRight': // 右箭头
  180.             moveRight();
  181.             break;
  182.     }
  183. });
  184. // 监听重新开始按钮点击事件
  185. restartButton.addEventListener('click', restartGame);
  186. // 初始化游戏
  187. restartGame();
复制代码
 别忘了请点个赞+收藏+关注支持一下博主喵!!!
累了,水一下吧。。。。。。∗︎˚(* ˃̤൬˂̤ *)˚∗︎
gitee:2048-game: html+css+js设计的一个2048游戏(网页)
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表