H5+JS 4096小游戏

news2024/11/15 10:25:15

主要实现

1.使用WASD方向按钮控制游戏
2.最高值4096,玩到4096视为胜利
3.随机生成2、4、8方块
4.移动方块
5.合并方块

JS代码干了什么

初始化游戏界面:创建游戏板和控制按钮。
定义游戏相关变量:如棋盘大小、棋盘状态、得分等。
初始化棋盘:创建棋盘元素并添加到页面。
生成新的方块:根据一定概率生成 2、4 或 8 的方块。
更新棋盘显示:根据方块的值设置背景颜色。移动方块:根据用户操作或键盘按键,实现方块的上、下、左、右移动。
合并方块:在移动过程中,相同值的方块会合并。
处理游戏结束:判断是否无法再进行移动。
监听用户操作:通过点击按钮或键盘按键触发移动操作。

HTML布局

  `game-container`游戏板块
   |`game-board`游戏棋盘板块         
   |`controls`游戏控制按钮版块         

不同数字的配色

数字颜色
2#eee4da
4#ede0c8
8#f2b179
16#f59563
32#f67c5f
64#f65e3b
128#edcf72
256#edcc61
512#edc850
1024#edc53f
2048#edc22e
4096#ed9e1f

效果图

无描述内容

源代码


<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>4096 Game</title>
  <style>
* {
      box-sizing: border-box;
      margin: 0;
      padding: 0;
      font-family: 'Arial', sans-serif;
    }

    body {
      display: flex;
      justify-content: center;
      align-items: center;
      height: 100vh;
      background-color: #faf8ef;
    }

    #game-container {
      display: flex;
      flex-direction: column;
      align-items: center;
    }

    #game-board {
      display: grid;
      grid-template-columns: repeat(4, 1fr);
      grid-template-rows: repeat(4, 1fr);
      gap: 10px;
      background-color: #bbada0;
      padding: 10px;
      border-radius: 10px;
      margin-bottom: 20px;
    }

  .tile {
      width: 80px;
      height: 80px;
      background-color: #cdc1b4;
      display: flex;
      justify-content: center;
      align-items: center;
      font-size: 24px;
      border-radius: 10px;
      transition: all 0.2s ease-in-out;
    }

    #controls {
      display: flex;
      gap: 10px;
    }

    button {
      width: 60px;
      height: 60px;
      font-size: 20px;
      border-radius: 10px;
      background-color: #8f7a66;
      color: white;
      border: none;
      cursor: pointer;
    }

    button:hover {
      background-color: #9f8b76;
    }

    
</style>
</head>

<body>
  <div id="game-container">
    <div id="game-board"></div>
    <div id="controls">
      <button id="up">W</button>
      <button id="left">A</button>
      <button id="down">S</button>
      <button id="right">D</button>
    </div>
  </div>

  <script>
    document.addEventListener('DOMContentLoaded', () => {
      const boardSize = 4;
      let board = [];
      let score = 0;

      const gameBoard = document.getElementById('game-board');
      const buttons = {
        up: document.getElementById('up'),
        down: document.getElementById('down'),
        left: document.getElementById('left'),
        right: document.getElementById('right')
      };

      function initBoard() {
        for (let i = 0; i < boardSize * boardSize; i++) {
          const tile = document.createElement('div');
          tile.classList.add('tile');
          gameBoard.appendChild(tile);
        }
        board = Array.from(document.querySelectorAll('.tile'));
        generateTile();
        generateTile();
        updateBoard();
      }

      function generateTile() {
        let emptyTiles = board.filter(tile =>!tile.textContent);
        if (emptyTiles.length > 0) {
          let randomTile = emptyTiles[Math.floor(Math.random() * emptyTiles.length)];
          let randomValue = Math.random() < 0.9? '2' : Math.random() < 0.1? '4' : '8';
          randomTile.textContent = randomValue;
        }
      }

      function updateBoard() {
        board.forEach(tile => {
          const value = tile.textContent;
          tile.style.backgroundColor = getTileColor(value);
        });
      }

      function getTileColor(value) {
        switch (value) {
          case '2':
            return '#eee4da';
          case '4':
            return '#ede0c8';
          case '8':
            return '#f2b179';
          case '16':
            return '#f59563';
          case '32':
            return '#f67c5f';
          case '64':
            return '#f65e3b';
          case '128':
            return '#edcf72';
          case '256':
            return '#edcc61';
          case '512':
            return '#edc850';
          case '1024':
            return '#edc53f';
          case '2048':
            return '#edc22e';
          case '4096':
            return '#ed9e1f';
          default:
            return '#cdc1b4';
        }
      }

      function move(direction) {
        switch (direction) {
          case 'up':
            moveUp();
            break;
          case 'down':
            moveDown();
            break;
          case 'left':
            moveLeft();
            break;
          case 'right':
            moveRight();
            break;
        }
        generateTile();
        updateBoard();
      }

      function moveUp() {
        for (let i = 0; i < boardSize; i++) {
          let column = [];
          for (let j = 0; j < boardSize; j++) {
            column.push(board[i + j * boardSize].textContent);
          }
          let newColumn = slideTiles(column);
          for (let j = 0; j < boardSize; j++) {
            board[i + j * boardSize].textContent = newColumn[j];
          }
        }
      }

      function moveDown() {
        for (let i = 0; i < boardSize; i++) {
          let column = [];
          for (let j = 0; j < boardSize; j++) {
            column.push(board[i + j * boardSize].textContent);
          }
          let newColumn = slideTiles(column.reverse()).reverse();
          for (let j = 0; j < boardSize; j++) {
            board[i + j * boardSize].textContent = newColumn[j];
          }
        }
      }

      function moveLeft() {
        for (let i = 0; i < boardSize; i++) {
          let row = [];
          for (let j = 0; j < boardSize; j++) {
            row.push(board[i * boardSize + j].textContent);
          }
          let newRow = slideTiles(row);
          for (let j = 0; j < boardSize; j++) {
            board[i * boardSize + j].textContent = newRow[j];
          }
        }
      }

      function moveRight() {
        for (let i = 0; i < boardSize; i++) {
          let row = [];
          for (let j = 0; j < boardSize; j++) {
            row.push(board[i * boardSize + j].textContent);
          }
          let newRow = slideTiles(row.reverse()).reverse();
          for (let j = 0; j < boardSize; j++) {
            board[i * boardSize + j].textContent = newRow[j];
          }
        }
      }

      function slideTiles(tiles) {
        let newTiles = tiles.filter(tile => tile);
        for (let i = 0; i < newTiles.length - 1; i++) {
          if (newTiles[i] === newTiles[i + 1]) {
            newTiles[i] = (parseInt(newTiles[i]) * 2).toString();
            newTiles[i + 1] = '';
          }
        }
        newTiles = newTiles.filter(tile => tile);
        while (newTiles.length < boardSize) {
          newTiles.push('');
        }
        return newTiles;
      }

      buttons.up.addEventListener('click', () => move('up'));
      buttons.down.addEventListener('click', () => move('down'));
      buttons.left.addEventListener('click', () => move('left'));
      buttons.right.addEventListener('click', () => move('right'));

      document.addEventListener('keydown', (e) => {
        switch (e.key) {
          case 'w':
            move('up');
            break;
          case's':
            move('down');
            break;
          case 'a':
            move('left');
            break;
          case 'd':
            move('right');
            break;
        }
      });

      initBoard();
    });
  </script>
</body>

</html>


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1964459.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MATLAB源码】机器视觉与图像识别技术实战示例文档---鱼苗面积预测计数

系列文章目录 第一篇文章&#xff1a;【MATLAB源码】机器视觉与图像识别技术—视觉系统的构成(视频与图像格式转换代码及软件下载) 第二篇文章&#xff1a;【MATLAB源码】机器视觉与图像识别技术(2)—图像分割基础 第三篇文章&#xff1a;【MATLAB源码】机器视觉与图像识别技术…

三星半导体业务动态:3nm技术及AI/HPC销售展望

#### 第二季度财报概览 7月31日&#xff0c;三星公布了2024年第二季度的财务报告&#xff0c;显示合并营业收入为74.07万亿韩元&#xff0c;营业利润为10.44万亿韩元&#xff08;约75亿美元&#xff09;。其中&#xff0c;DS&#xff08;设备解决方案&#xff09;部门的合并营…

深入探讨 Docker 容器文件系统

引言 随着云计算和微服务架构的兴起&#xff0c;Docker 容器技术迅速成为开发和运维人员的首选工具。Docker 容器不仅提供了一种轻量级的虚拟化方式&#xff0c;还简化了应用程序的部署和管理。在众多的技术细节中&#xff0c;Docker 容器文件系统是一个至关重要的组成部分。本…

Harmony学习(三)------ArkUI(3)

1.模版字符串 let name:string 模版字符串 let age:number 18 console.log(字符串:,${name}和${age})2.字符串和数字互相转换 //字符串转数字 let str1:string 1.1 console.log(转换,Number(str1)) //output: 1.1 console.log(转换,parseInt(str1)) //output: 1 conso…

笔记:VGGnet的实现

本文为B站UP 霹雳吧啦Wz 图片分类课程学习笔记&#xff0c;用于记录学习历程和个人复习 程序共分为三部分&#xff1a;model,train,predict。model.py用于存放模型&#xff0c;train.py用于存放训练时的程序&#xff0c;predict.py用于存放预测的程序&#xff0c;vgg16Net.pth…

从技术博客到个人 IP 矩阵:全面攻略与实战示例

文章目录 摘要引言创建博客选择平台设计和布局 内容规划明确目标受众设定内容方向制定发布计划 SEO 优化关键词研究内链和外链元标签优化 社交媒体推广选择社交平台制定推广策略 可运行的 Demo 代码模块QA 环节问&#xff1a;如何增加博客的曝光度&#xff1f;问&#xff1a;如…

使用 ChatGPT 检测媒体偏见的潜力和局限性

概述 随着数字时代的到来&#xff0c;信息瞬间传遍全球&#xff0c;但其中也不乏各种偏见。媒体偏见"&#xff0c;即对某些观点的选择性报道&#xff0c;会影响人们对某一事件或问题的看法&#xff0c;并对公众舆论产生重大影响。事实上&#xff0c;许多人都认为主要媒体…

国内本地化OCSP服务的SSL证书:提升安全与效率的新选择

在数字化时代&#xff0c;网络安全成为企业运营和用户体验的重要基石。HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;作为一种安全的网络协议&#xff0c;通过SSL&#xff08;Secure Sockets Layer&#xff09;加密技术&#xff0c;保障了数据传输的机密性…

网络协议二 : 使用Cisco Packet Traceer工具模拟网络环境,集线器,网桥,交换机,路由器,MAC,IP,同一网段,子网掩码,子网划分

1. 安装 Cisco Packet Tracer baidu 网盘地址&#xff0c;感谢大神分享 安装&#xff0c;破解&#xff0c;中文化&#xff0c;都有说明&#xff0c;建议使用7.x的那个版本&#xff0c;感觉比8.x的翻译要完整一点 https://pan.baidu.com/s/18iWBOfhJJRhqgQqdNQcfMQ?pwddcch#…

【考研数学】概率论中集合间的运算图示

今天要给大家分享的笔记是&#xff1a;《概率论中的4种“集”&#xff1a;交集、并集、差集、补集》&#xff1a;

修复msvcp120.dll丢失的问题的几种简单方法,msvcp120.dll是什么

在使用电脑时&#xff0c;你可能会遭遇一个提示称“msvcp120.dll丢失”的错误信息。这个问题比较普遍&#xff0c;主要是因为你的系统中缺失了某个特定的动态链接库&#xff08;DLL&#xff09;文件。msvcp120.dll是由 Microsoft Visual C 可再发行包提供的关键文件&#xff0c…

【C++】C++11新增语法(右值引用、完美转法)

文章目录 1.C11新增常用语法1.1 统一的列表初始化1.2 initializer_list初始化1.3 声明相关1.4 继承与多态相关 2. 右值引用与移动语义2.1 左值引用与右值引用2.2 右值引用与移动语义的使用场景2.3 右值引用引用左值(move) 3. 完美转发4. 新的类功能4.1 新增两个默认成员函数4.2…

测试开发面试题,助你拿高薪offer

进入金九银十&#xff0c;很多小伙伴有被动跳槽的打算&#xff0c;所以更新一些测试开发 面试题&#xff0c;希望能帮到大家。 一 请说一下HTTP 状态码 HTTP状态码大致分为5类&#xff1a; 常见的http状态码如下: 二 python中“” 和“ is ”的区别 is 和 都可以进行对象比…

bash: llamafactory-cli: command not found解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

探索翻译新世界:2024年超越期待的翻译应用推荐

现在社会因为交通、互联网的便利&#xff0c;不同国家之间的交流变得简单起来。无论是商务合作、学术研究还是日常沟通&#xff0c;准确、快速地跨越语言障碍都显得尤为重要。今天我来介绍一些和百度翻译类似的多用途的翻译工具。 1.福昕在线翻译 链接一下>>https://fa…

《LeetCode热题100》---<4.子串篇三道>

本篇博客讲解LeetCode热题100道子串篇中的三道题 第一道&#xff1a;和为 K 的子数组 第二道&#xff1a;滑动窗口最大值 第三道&#xff1a;最小覆盖子串 第一道&#xff1a;和为 K 的子数组&#xff08;中等&#xff09; 法一&#xff1a;暴力枚举 class Solution {public in…

C语言进阶 13. 文件

C语言进阶 13. 文件 文章目录 C语言进阶 13. 文件13.1. 格式化输入输出13.2. 文件输入输出13.3. 二进制文件13.4. 按位运算13.5. 移位运算13.6. 位运算例子13.7. 位段 13.1. 格式化输入输出 格式化输入输出: printf %[flags][width][.prec][hlL]type scanf %[flags]type %[fl…

yolo格式数据集之空中及地面拍摄道路病害检测7种数据集已划分好|可以直接使用|yolov5|v6|v7|v8|v9|v10通用

yolo格式数据集之空中及地面拍摄道路病害检测7种数据集已划分好|可以直接使用|yolov5|v6|v7|v8|v9|v10通用 本数据为空中及地面拍摄道路病害检测检测数据集&#xff0c;数据集数量如下&#xff1a; 总共有:33585张 训练集&#xff1a;6798张 验证集&#xff1a;3284张 测试集&a…

视频监控国标GB28181平台EasyGBS如何更换默认的SQLite数据库?

视频流媒体安防监控国标GB28181平台EasyGBS视频能力丰富&#xff0c;部署灵活&#xff0c;既能作为业务平台使用&#xff0c;也能作为安防监控视频能力层被业务管理平台调用。国标GB28181视频EasyGBS平台可提供流媒体接入、处理、转发等服务&#xff0c;支持内网、公网的安防视…

数据集相关类代码回顾理解 | np.mean\transforms.Normalize\transforms.Compose\xxx.transform

数据集相关类代码回顾理解 | StratifiedShuffleSplit\transforms.ToTensor\Counter 目录 np.mean transforms.Normalize transforms.Compose xxx.transform np.mean meanRGB[np.mean(x.numpy(),axis(1,2)) for x,_ in train_ds] 计算每个样本的&#xff08;RGB&#xff0…