原生js实现扫雷游戏
展示页面:https://shalltears.github.io/sweep-Mine/ ;
源码下载页面:https://download.csdn.net/download/zmdmwh/10816787 ;
截图:最后是胜利的滚动效果。
画布就不说了,使用的是相当于二维数组的一个9乘9的数组。
1.如何创建地雷(保证10个)
首先两个0-9的随机数,创建随机二维坐标赋值给数组,然后创建一个字符串去重函数如下:
disArr: function (str) {//字符串去重var obj = {};var sum = [];var arr = str.split('_');for (i = 0; i < arr.length; i++) {if (obj[arr[i]] == undefined) {obj[arr[i]] = 'seat';//占位}}for (var pop in obj) {sum.push(pop.split(''));}return sum;}
根据出来的去重数组长度来判断生成随机地雷是否有重复,然后使用while循环,不足10个就要接着生成。
2.如何把周围地雷的数量给标注上
使用两个for循环,遍历二维数组,如果这个这个元素是地雷(我用999来代表是地雷),那么它周围的8个元素的值全部+1,循环走完就得到一个类似扫雷地图的二维数组,999是地雷,数字代表雷的数目,使用try是防止越界报错,越界自动不执行。
for (var i = 0; i < 9; i++) {for (var j = 0; j < 9; j++) {var cont = 0;if (this.main[i][j] == 999) { continue; }try { this.main[i - 1][j - 1] == 999 ? cont++ : 0 } catch{ }try { this.main[i - 1][j] == 999 ? cont++ : 0 } catch{ }try { this.main[i - 1][j + 1] == 999 ? cont++ : 0 } catch{ }try { this.main[i][j - 1] == 999 ? cont++ : 0 } catch{ }try { this.main[i][j + 1] == 999 ? cont++ : 0 } catch{ }try { this.main[i + 1][j - 1] == 999 ? cont++ : 0 } catch{ }try { this.main[i + 1][j] == 999 ? cont++ : 0 } catch{ }try { this.main[i + 1][j + 1] == 999 ? cont++ : 0 } catch{ }this.main[i][j] = cont;}}
3.如何把数组转换成方格放在界面
这里同样使用两个for循环,第一个循环可以创建9个ul,第二个循环在每个ul里生成9个li,根据不同的数字给li们用setAttribute增加上不同的类名(可以设置不同数值的样式,后面这个类名还可以区分是不是雷)。
for (var i = 0; i < 9; i++) {var ul = document.createElement('ul');for (var j = 0; j < 9; j++) {var li = document.createElement('li');switch (this.main[i][j]) {case 0: li.setAttribute('class', 'li-0'); break;case 1: li.setAttribute('class', 'li-1'); break;case 2: li.setAttribute('class', 'li-2'); break;case 3: li.setAttribute('class', 'li-3'); break;case 4: li.setAttribute('class', 'li-4'); break;case 5: li.setAttribute('class', 'li-5'); break;case 6: li.setAttribute('class', 'li-6'); break;case 999: li.setAttribute('class', 'li-999'); break;}ul.appendChild(li);}this.map.appendChild(ul);}
4.点击后的扩散
在点击事件中增加如下判断:
parseInt(this.getAttribute('class').substring(3)) == 999 ? sweepMine.fail() : sweepMine.goOn(li, i);
不是雷的话就去执行goOn; goOn里有两部分,①先把当前点击的方格的数值显示出来,当然可以把它的类名截取出来赋值上就行了。②是边界判断,因为这里获取的是81个li,不是二维数组了,所以要加个边界判断,我这里只是很简单的把边界调出来分别处理了,再次调用当前位置的上下左右八个方格的点击事件就完成了扩散的效果。
为什么数值不为0的会停止扩散呢?因为不为0的在goOn的前面被拦截下来了,不为0就只是把状态设为1,然后显示数值。
还有两个需要注意的地方:
1.要使用try catch,因为访问元素可能会越界,越界后不加处理就可以了;
2.要加入状态位,被点击后的li要把状态位设为1,不然扩散时会有很多重复的操作影响性能。
5.结尾
剩下的就是较简单的逻辑优化有初始化了,在不同操作的时候有对应的不通操作,比如重新开始后怎么样,失败和胜利后怎么样,只要把流程多走几遍就能优化的差不多了。
原生js实现扫雷游戏相关推荐
- H5原生js简单拼图游戏
H5原生js简单拼图游戏 演示地址 效果展示 源码 index.html puzzle.css puzzle.js 源码下载 演示地址 链接: 演示地址 效果展示 源码 index.html < ...
- 原生js canvas 碰撞游戏的开发笔记
-----------------------------------------------福利--------------------------------------------- ----- ...
- 原生JS实现拼图游戏
前面的话 练习了10几个原生js小游戏的案例,刚开始是无从下手,而现在有了自己的思路,不再觉得那么的难了.总结起来,还是那句话,"好的代码是时间熬出来的,多练是硬道理!",这篇文章 ...
- 原生js做打地鼠游戏
学原生js的语法其实是容易的,最主要的练习逻辑思维.对于刚刚学完js的语法的我来说,写这个打地鼠游戏真的花费了我一整天的时间.整体感觉写出来的js代码,其实就是平时练习的一些小案例的代码拼起来的,js ...
- 原生js实现打字游戏
本文实例为大家分享了js实现打字游戏的具体代码,供大家参考,具体内容如下 1.HTML代码如下 <!DOCTYPE html> <html lang="en"&g ...
- 原生js制作扫雷-自定义难度
游戏功能: 1.有四个难度 2.可以自定难度 1.html相关代码 <!DOCTYPE html> <html lang="en"><head> ...
- JS实现扫雷游戏(源代码带注释)
运行结果: 超级简单,下面直接下面贴上源代码,一共两个文件 扫雷.html 和 saolei.js 扫雷.html <!DOCTYPE html> <html lang=&quo ...
- 利用原生js制作小游戏
1.编写函数: 该函数对游戏间隔时间.影响游戏的对象的绑定.开始.结束进行编写 /*** * @param {*} duration 间隔时间* @param {*} thisObj 绑定的this对 ...
- 原生JS 实现小游戏 贪吃蛇
文章目录 (1) 游戏场景搭建 (2) 获取标签.准备数据 (3)贪吃蛇移动 (4) 控制贪吃蛇移动 (5) 随机生成食物 (6) 完成食物消化 (7) 边界判断 (8) 积分判断 (9) 暂停继续 ...
最新文章
- Flask显示图片并设置图片的缓存时间
- codevs 2612 最有分解方案 (贪心)
- ava线程池ThreadPoolExecutor的keepAliveTime=0时,表示超过core线程数的线程在空闲时立即结束
- 【.NET Core项目实战-统一认证平台】第十一章 授权篇-密码授权模式
- 7.2图的存储结构(十字链表、邻接多重表、边集数组)
- 串行通信(一):I2C
- 综合金融服务方案模板
- 详解MES系统在钢铁企业的应用分析
- 昂达平板不能开机刷机_手把手教你平板电脑刷机方法
- 网络RJ45接口详解
- 北航计算机本科生考研,和计算机考研的师弟师妹们分享一下经验本人本科北航...
- 从技术问题变成RPWT
- html canvas 绘制转盘,Canvas绘制转盘
- id 查找apple,怎么查找我的apple id?
- 本土战略 Ubuntu创始人宣布将发中国版
- 关于Jquery导出word文档
- Linux 编程之非局部跳转:longjmp siglongjmp
- 零基础重庆自考本科行政管理难吗?
- Windows中编译wireshark3.0以上版本指南
- 操作系统实验3 页式地址重定位模拟
热门文章
- 基于IIC和SPI协议的温湿度采集与OLED显示
- vs 生成动态库不生产lib文件
- 视频编码(3):H.266 编码性能比 H.265 再提升 49% 的关键丨音视频基础
- 猪齿鱼Choerodon UI中,对保存校验失败的提示语进行优化,自动提示所有校验失败的字段,而不是简单的提示“数据校验不通过”
- echarts柱状图属性
- 基于Android的仿美团外卖系统设计与实现 文档+源码+视频
- biopython中文指南_Biopython新手指南-第1部分
- Python3 中的 cmp_to_key 函数
- Java Integer128陷阱详解
- 视频上有水印怎么去除?如何去掉视频上的水印?