爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      手把手教你使用JavaScript打造一款扫雷游戏

      首页 知识中心 软件开发 文章详情页

      手把手教你使用JavaScript打造一款扫雷游戏

      2025-03-10 09:53:07 阅读次数:8

      div,标记,游戏,点击,页面

      扫雷大家都玩过,今天我们就是用JavaScript来打造扫雷游戏。废话不多说,直接看下效果;

      手把手教你使用JavaScript打造一款扫雷游戏

      上图是失败后的结果。

      一、思路分析

      我们新建一个首页,在首页放置一个点击​开始游戏​的按钮,动态生成100个小格,即100div;然后通过点击div进行扫雷操作,然后扫雷成功或者失败显示对应的结果;

      二、静态页面搭建

      2.1 结构层

      <body>
      <div class="wrapper">
      <div class="btn" id="btn"></div> <!-- 开始游戏按钮-->
      <div class="box" id="box"></div> <!-- 存放小雷的div-->
      <div class="flagBox" id="flagBox"> <!-- 游戏结束才显示的当前雷数的div-->
      当前剩余雷数:
      <span id="score">10</span>
      </div>
      <div class="alertBox" id="alertBox"> <!-- Game over弹出的框(窗口)-->
      <div class="alertImg" id="alertImg">
      <div class="close" id="close"></div>
      </div>
      </div>
      </div>
      </body>

      2.2 样式层

      ​清楚默认边距​

      *{
      margin:0;
      padding:0;
      }

      ​页面最大div​

      .wrapper {
      width:100%;
      height:1000px;
      position: fixed;
      top:0;
      left:0;
      background-image: url('img/bg.jpg');
      background-size: 100% 100%;
      }

      效果如下:

      手把手教你使用JavaScript打造一款扫雷游戏

      ​开始游戏按钮​

      .btn{
      height:140px;
      width:170px;
      position:absolute;
      left:50px;
      background-image: url('img/startGame.png');
      background-size: 100% 100%;
      cursor: pointer;
      }

      ​储存雷的大div​

      .box{
      height:500px;
      width:500px;
      transform: perspective(800px) rotateX(45deg);
      margin:20px auto;
      border-top:1px solid #B25F27;
      border-left:1px solid #B25F27;
      box-shadow: 5px 5px 5px rgba(0,0,0,0.3);
      display:none; /* 先设置为none,开始游戏后显示block */
      }

      ​每一个方块的小div(一共100个)​

      .block{
      width:49px;
      height:49px;
      border-right:1px solid #B25F27;
      border-bottom:1px solid #B25F27;
      box-shadow: 0 0 4px #333 inset;
      background-image: url('img/cao.jpg');
      float: left;
      }

      ​当前所剩雷数​

      .flagBox{
      position:absolute;
      top:50px;
      left:50%;
      width:200px;
      height:50px;
      margin-left:-100px;
      color:#333;
      font-size:20px;
      font-weight: bolder;
      display:none; /* 先设置为none,开始游戏后显示block */
      }

      ​Game Over​

      .alertBox{
      display:none; /* 先设置为none,开始结束显示block */
      position:absolute;
      width:100%;
      height:100%;
      left:0;
      top:0;
      background-color: rgba(0,0,0,0.2);
      }

      ​游戏结束弹出窗口右上角的X​

      .close{
      position:absolute;
      right:0;
      top:0;
      height:40px;
      width:40px;
      background-image: url('img/closeBtn.png');
      background-size: 100% 100%;
      cursor: pointer;

      }

      三、js页面交互

      3.1 获取元素及变量初始化

      var startBtn = document.getElementById('btn');
      var box = document.getElementById('box');
      var flagBox = document.getElementById('flagBox');
      var alertBox = document.getElementById('alertBox');
      var alertImg = document.getElementById('alertImg');
      var closeBtn = document.getElementById('close');
      var score = document.getElementById('score');
      // 先声明变量,但是不初始化
      var minesNum;
      var mineOver;
      var block;
      var mineMap = [];
      var startGameBool = true;

      3.2 10个雷的初始化设置

      function init() {
      minesNum = 10;
      mineOver = 10;
      score.innerHTML = mineOver;

      for (var i = 0; i < 10; i++) { // 双层循环 10 * 10 个div
      for (var j = 0; j < 10; j++) {
      var con = document.createElement('div');
      con.classList.add('block'); // 给创建出来的div添加类名 block
      con.setAttribute('id', i + '-' + j);
      box.appendChild(con);
      mineMap.push({ mine: 0 });
      }
      }
      block = document.getElementsByClassName('block');
      while (minesNum) { // 创建一个10次的循环,即设置10个雷
      var mineIndex = Math.floor(Math.random() * 100);
      if (mineMap[mineIndex].mine === 0) {
      mineMap[mineIndex].mine = 1;
      block[mineIndex].classList.add('isLei'); // 10个雷有小div的block类属性,还有自己的属性,isLei
      minesNum--;
      }
      }
      }

      3.3 游戏开始事件封装

      function bindEvent() {
      startBtn.onclick = function () { // 开始按钮点击事件
      if(startGameBool){
      box.style.display = 'block';
      flagBox.style.display = 'block';
      init();
      startGameBool = false;
      }
      }
      box.oncontextmenu = function () {
      return false;
      }
      box.onmousedown = function (e) { // 小div鼠标按下事件封装
      var event = e.target;
      if (e.which == 1) { //Netscape/Firefox/Opera中不支持 window.event.keyCode,需要用event.which代替
      leftClick(event);
      } else if (e.which == 3) {
      rightClick(event);
      }
      }
      closeBtn.onclick = function () { // 游戏结束,弹出game over窗口的关闭按钮事件封装
      alertBox.style.display = 'none';
      flagBox.style.display = 'none';
      box.style.display = 'none';
      box.innerHTML = '';
      startGameBool = true;
      }
      }

      3.4 核心事件函数封装

      ​leftClick​ 没有雷 --> 显示数字(代表以当前小格为中心周围8个格的雷数)扩散(当前周围八个格没有雷) 有雷 --> game Over

      function leftClick(dom) {
      if(dom.classList.contains('flag')){
      return;
      }
      var isLei = document.getElementsByClassName('isLei'); // 获得前面的10个雷的div
      if (dom && dom.classList.contains('isLei')) { // 判断是不是雷块
      for (var i = 0; i < isLei.length; i++) {
      isLei[i].classList.add('show'); // 显示地雷背景图
      }
      setTimeout(function () {
      alertBox.style.display = 'block';
      alertImg.style.backgroundImage = 'url("img/over.jpg")'; // 上面显示雷,标志游戏结束
      }, 800)
      } else { // 否则继续扫雷
      var n = 0;
      var posArr = dom && dom.getAttribute('id').split('-');
      var posX = posArr && +posArr[0];
      var posY = posArr && +posArr[1];
      dom && dom.classList.add('num');
      for (var i = posX - 1; i <= posX + 1; i++) {
      for (var j = posY - 1; j <= posY + 1; j++) {
      var aroundBox = document.getElementById(i + '-' + j);
      if (aroundBox && aroundBox.classList.contains('isLei')) {
      n++;
      }
      }
      }
      dom && (dom.innerHTML = n);
      if (n == 0) {
      for (var i = posX - 1; i <= posX + 1; i++) {
      for (var j = posY - 1; j <= posY + 1; j++) {
      var nearBox = document.getElementById(i + '-' + j);
      if (nearBox && nearBox.length != 0) {
      if (!nearBox.classList.contains('check')) {
      nearBox.classList.add('check');
      leftClick(nearBox);
      }
      }
      }
      }
      }
      }
      }

      ​rightClick​ 没有标记并且没有数字 --> 进行标记;

      有标记 --> 取消标记 --> 标记是否正确,10个都正确标记,提示成功;

      如果已经出现,则点击无效果;

      function rightClick(dom){
      if(dom.classList.contains('num')){ // 如果已经出现,则点击无效果
      return;
      }
      dom.classList.toggle('flag'); // 在元素中切换类名,切换为flag类名,显示红旗背景图;此处的雷被扫除了
      if(dom.classList.contains('isLei') && dom.classList.contains('flag')){
      mineOver --; // 雷数减一
      }
      if(dom.classList.contains('isLei') && !dom.classList.contains('flag')){
      mineOver ++;
      }

      score.innerHTML = mineOver;
      if(mineOver == 0){ // 扫完雷,标志雷数量为0
      alertBox.style.display = 'block';
      alertImg.style.backgroundImage = 'url("img/success.png")'; // 游戏胜利
      }
      }

      3.5 游戏开始

      bindEvent()

      四、总结

      本文我们通过JavaScript打造了简单的扫雷游戏,首先是设计下简单的界面样式,然后通过扫雷的逻辑动态构建雷块的位置,通过点击小方块进行扫雷,感兴趣的小伙伴可以去试一下。

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/u_13389043/5159785,作者:Python进阶者,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:快速排序-Java版本

      下一篇:【Hive】学习路线:架构、运维、Hsql实战、源码分析

      相关文章

      2025-05-13 09:53:13

      计算机初级选手的成长历程——扫雷详解

      计算机初级选手的成长历程——扫雷详解

      2025-05-13 09:53:13
      坐标 , 游戏
      2025-05-09 08:50:42

      下拉刷新

      下拉刷新

      2025-05-09 08:50:42
      动画 , 页面
      2025-05-08 09:03:21

      基于SSM框架实现的房屋租赁管理系统

      本项目是一套基于SSM框架实现的房屋租赁管理系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。

      2025-05-08 09:03:21
      列表 , 查询 , 模块 , 管理员 , 页面
      2025-05-08 09:03:21

      javaWeb基于SSM框架开发的社区医疗数据管理系统【项目源码+数据库脚本+报告】

      本项目是一套基于SSM框架开发的社区医疗数据管理系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。

      2025-05-08 09:03:21
      数据库 , 用户 , 页面 , 项目
      2025-05-07 09:08:08

      基于springboot框架个人博客管理系统

      本项目是一套基于springboot框架实现的个人博客管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。

      2025-05-07 09:08:08
      springboot , 文章 , 源码 , 页面 , 项目
      2025-05-07 09:07:56

      springmvc五种数据提交方式

      springmvc五种数据提交方式

      2025-05-07 09:07:56
      action , springmvc , 提交 , 数据 , 页面
      2025-05-07 09:07:56

      springmvc请求转发和重定向的四种跳转方式

      springmvc请求转发和重定向的四种跳转方式

      2025-05-07 09:07:56
      请求 , 跳转 , 重定向 , 页面
      2025-04-23 08:18:27

      VS 中调用调试DLL库的方法

      VS 中调用调试DLL库的方法

      2025-04-23 08:18:27
      dll , 点击 , 调试 , 配置
      2025-04-22 09:28:19

      Vue3中如何安装和配置静态路由

      Vue3中如何安装和配置静态路由

      2025-04-22 09:28:19
      router , 路由 , 跳转 , 配置 , 页面
      2025-04-22 09:24:51

      怎么只用语言实现扫雷?

      怎么只用语言实现扫雷?

      2025-04-22 09:24:51
      代码 , 实现 , 数组 , 游戏
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5274779

      查看更多

      最新文章

      怎么只用语言实现扫雷?

      2025-04-22 09:24:51

      使用PyCharm远程调试PY代码

      2025-04-11 07:08:26

      前端案例:像素鸟小游戏(js+dom操作,完整代码,附案例素材)

      2025-04-09 09:14:12

      JavaScript之事件

      2025-03-27 10:12:02

      spring boot项目设置默认访问路径(页面)方法,包括spring boot 2.0及以上版本实现方法

      2025-03-25 08:08:59

      【VBScript恶搞代码】关不掉的窗口

      2025-03-24 08:53:15

      查看更多

      热门文章

      【Python】字谜游戏

      2023-02-13 07:59:59

      SpringBoot入门二十五,默认的404错误页面引入css和js文件

      2024-09-24 06:31:08

      html页面间的跳转及导航栏制作

      2023-08-03 07:23:35

      H5 postMessage跨文档消息传递

      2023-07-19 08:32:21

      Spring MVC配置404或500等错误页面

      2023-07-06 09:42:22

      web入门之十 JS高级编程基础

      2022-12-19 11:21:44

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      web自动化测试常见面试题

      基于Java的公务员考试资料共享平台的设计与实现

      PHP+MySQL+Ajax实现注册功能

      【Python】异常处理相关练习

      【eclipse】eclipse插件开发(一)

      基于Python的pygame库的俄罗斯方块游戏的设计与实现

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号