js实现简单扫雷

本文实例为大家分享了js实现简单扫雷的具体代码,供大家参考,具体内容如下

实现效果:

总体思想:这个扫雷难点主要就两点:第一点就是雷的随机分布,我这里使用js动态生成了10X10的table表格,然后设定生成20个雷,然后在生成每个格子代表的数字,雷我们用9表示,因为0-8要被其他非雷格子使用,然后我们只要一格是雷区那么周围的格子都加一,这样我们的雷区就生成好了,然后玩法的编写主要难点就是在当点击数字为0时的格子时要把它周围的0区也显示出来,因此这里我们使用递归来实现

1、界面的生成

//生成界面
 function init() {
 document.write("<table border='1px' rules='all' cellpadding='10px '> ")
 for (var i = 1; i < 11; i++) {
 document.write("<tr>");
 for (var j = 1; j < 11; j++) {
 document.write("<td class='game'>" + arr3[i][j] + "</td>");
 }
 document.write("</tr>");
 }
 document.write("</table>")
 var t = document.getElementsByTagName('table')[0];
 var td = document.getElementsByTagName('td');
 for (var i = 0; i < td.length; i++) {
 td[i].style.background='#ffffff';
 td[i].style.opacity = '0';
 td[i].style.transition = 'all 4s'
 }
 //样式添加
 t.style.margin = '0px auto';

 document.close()
 }

2、我们表格是10X10的,但是后面的操作要计算每个格子的值,因此当格子在边界的话数组就会越界,所以我们这边定义二维数组12X12来表示10X10的表格中的数值,雷我们随机生成20个

//初始化数组
 function initarr() {
 var arr = new Array(12);
 for (var i = 0; i < 12; i++) {
 arr[i] = new Array(12);
 for (var j = 0; j < 12; j++) {
 arr[i][j] = 0;
 }
 }
 return arr;
 }
 //随机生成雷
 function rangemine() {
 var arr = initarr();

 var num = 0;
 for (var index = 0; index < 20; index++) {
 while (true) {
 var row = Math.floor(Math.random() * 10) + 1;
 var col = Math.floor(Math.random() * 10) + 1;
 if (arr[row][col] != 9) {
 arr[row][col] = 9;
 break;
 }
 }
 }
 return arr;
 }

3、生成每块对应的数值我们实现方法为遍历数组,如果为雷,则雷周围的八块的数值+1

//生成每块所对应的数字
 function num() {
 var arr2 = rangemine();

 for (var i = 1; i < 11; i++) {
 for (var j = 1; j < 11; j++) {
 if (arr2[i][j] >= 9) {
 arr2[i][j + 1] += 1;
 arr2[i][j - 1] += 1;
 arr2[i - 1][j] += 1;
 arr2[i + 1][j] += 1;
 arr2[i - 1][j + 1] += 1;
 arr2[i - 1][j - 1] += 1;
 arr2[i + 1][j - 1] += 1;
 arr2[i + 1][j + 1] += 1;

 }
 }
 }
 for (var i = 1; i < 11; i++) {
 for (var j = 1; j < 11; j++) {
 if (arr2[i][j] > 8) {
 arr2[i][j] = 9;
 }
 }
 }
 return arr2;

 }

4、添加监听器,我这里添加了touch事件,touch事件只用于移动端,因此pc端要运行要模拟移动端

//添加监听器
 function gostart() {
 var t = document.getElementsByTagName('td');
 for (var i = 0; i < t.length; i++) {
 {
 t[i].addEventListener('touchstart', start);
 t[i].addEventListener('touchend', end);
 }
 }
 }
 gostart();
 //开始函数
 function start(e) {
 console.log((e.touches[0]));
 var a = e.touches[0];

 }
 //结尾函数
 function end(e) {
 var a = e.touches[0];
 mix(e.srcElement.parentElement.rowIndex + 1, e.srcElement.cellIndex + 1, e.srcElement.parentElement);
 /* startgame(e.srcElement.parentElement.rowIndex,e.srcElement.cellIndex,e.srcElement); */
 }

5、递归实现扫雷,对周围没有雷的格子进行递归将其周围也是0的格子展示出来

//递归消除点到0块时显露出其他的块
 function mix(x, y, e) {
 var flag=0;

 if (x > 0 && x < 11 && y > 0 && y < 11 && arr3[x][y] == 0) {
 //防止无限递归
 e.parentElement.rows[x - 1].cells[y - 1].style.opacity = 1;
 e.parentElement.rows[x - 1].cells[y - 1].innerHTML="";
 e.parentElement.rows[x - 1].cells[y - 1].style.background = '#a4eaff';
 arr3[x][y] = 10;
 mix(x, y + 1, e);
 mix(x, y - 1, e);
 mix(x + 1, y, e);
 mix(x - 1, y, e);
 mix(x + 1, y + 1, e);
 mix(x - 1, y + 1, e);
 mix(x + 1, y - 1, e);
 mix(x - 1, y - 1, e);
 } else if (x > 0 && x < 11 && y > 0 && y < 11 && arr3[x][y] > 0 && arr3[x][y] < 9) {
 //颜色变红且透明度变为1
 arr3[x][y]=-1;
 e.parentElement.rows[x - 1].cells[y - 1].style.opacity = 1;
 e.parentElement.rows[x - 1].cells[y - 1].style.backgroundColor = '#a4eaff';
 //判断是否结束
 for(var i=1;i<arr3.length-1;i++){
 for(var j=1;j<arr3[i].length-1;j++){
 if(arr3[i][j]!=-1||arr3[i][j]!=9){
  flag=1;
  break;
 }
 }
 }
 if(flag==0){
 alert('成功');
 }
 return;
 } else if (x > 0 && x < 11 && y > 0 && y < 11 && arr3[x][y] == 9) {
 alert('你踩到地雷啦!!!');
 arr3 = num();
 //移除原来的表格
 var s = document.getElementsByTagName('table')[0];
 s.parentNode.removeChild(s);
 init();
 gostart();

 }

 }

6、全部js代码:

function initarr() {
 var arr = new Array(12);
 for (var i = 0; i < 12; i++) {
 arr[i] = new Array(12);
 for (var j = 0; j < 12; j++) {
 arr[i][j] = 0;
 }
 }
 return arr;
 }
 //随机生成雷
 function rangemine() {
 var arr = initarr();

 var num = 0;
 for (var index = 0; index < 20; index++) {
 while (true) {
 var row = Math.floor(Math.random() * 10) + 1;
 var col = Math.floor(Math.random() * 10) + 1;
 if (arr[row][col] != 9) {
 arr[row][col] = 9;
 break;
 }
 }
 }
 return arr;
 }
 //生成每块所对应的数字
 function num() {
 var arr2 = rangemine();

 for (var i = 1; i < 11; i++) {
 for (var j = 1; j < 11; j++) {
 if (arr2[i][j] >= 9) {
 arr2[i][j + 1] += 1;
 arr2[i][j - 1] += 1;
 arr2[i - 1][j] += 1;
 arr2[i + 1][j] += 1;
 arr2[i - 1][j + 1] += 1;
 arr2[i - 1][j - 1] += 1;
 arr2[i + 1][j - 1] += 1;
 arr2[i + 1][j + 1] += 1;

 }
 }
 }
 for (var i = 1; i < 11; i++) {
 for (var j = 1; j < 11; j++) {
 if (arr2[i][j] > 8) {
 arr2[i][j] = 9;
 }
 }
 }
 return arr2;

 }

 var arr3 = num()
 //生成界面
 function init() {
 document.write("<table border='1px' rules='all' cellpadding='10px '> ")
 for (var i = 1; i < 11; i++) {
 document.write("<tr>");
 for (var j = 1; j < 11; j++) {
 document.write("<td class='game'>" + arr3[i][j] + "</td>");
 }
 document.write("</tr>");
 }
 document.write("</table>")
 var t = document.getElementsByTagName('table')[0];
 var td = document.getElementsByTagName('td');
 for (var i = 0; i < td.length; i++) {
 td[i].style.background='#ffffff';
 td[i].style.opacity = '0';
 td[i].style.transition = 'all 4s'
 }
 //样式添加
 t.style.margin = '0px auto';

 document.close()
 }
 init();
 //添加监听器
 function gostart() {
 var t = document.getElementsByTagName('td');
 for (var i = 0; i < t.length; i++) {
 {
 t[i].addEventListener('touchstart', start);
 t[i].addEventListener('touchend', end);
 }
 }
 }
 gostart();
 //开始函数
 function start(e) {
 console.log((e.touches[0]));
 var a = e.touches[0];

 }
 //结尾函数
 function end(e) {
 var a = e.touches[0];
 mix(e.srcElement.parentElement.rowIndex + 1, e.srcElement.cellIndex + 1, e.srcElement.parentElement);
 /* startgame(e.srcElement.parentElement.rowIndex,e.srcElement.cellIndex,e.srcElement); */
 }

 //递归消除点到0块时显露出其他的块
 function mix(x, y, e) {
 var flag=0;

 if (x > 0 && x < 11 && y > 0 && y < 11 && arr3[x][y] == 0) {
 //防止无限递归
 e.parentElement.rows[x - 1].cells[y - 1].style.opacity = 1;
 e.parentElement.rows[x - 1].cells[y - 1].innerHTML="";
 e.parentElement.rows[x - 1].cells[y - 1].style.background = '#a4eaff';
 arr3[x][y] = 10;
 mix(x, y + 1, e);
 mix(x, y - 1, e);
 mix(x + 1, y, e);
 mix(x - 1, y, e);
 mix(x + 1, y + 1, e);
 mix(x - 1, y + 1, e);
 mix(x + 1, y - 1, e);
 mix(x - 1, y - 1, e);
 } else if (x > 0 && x < 11 && y > 0 && y < 11 && arr3[x][y] > 0 && arr3[x][y] < 9) {
 //颜色变红且透明度变为1
 arr3[x][y]=-1;
 e.parentElement.rows[x - 1].cells[y - 1].style.opacity = 1;
 e.parentElement.rows[x - 1].cells[y - 1].style.backgroundColor = '#a4eaff';
 //判断是否结束
 for(var i=1;i<arr3.length-1;i++){
 for(var j=1;j<arr3[i].length-1;j++){
 if(arr3[i][j]!=-1||arr3[i][j]!=9){
  flag=1;
  break;
 }
 }
 }
 if(flag==0){
 alert('成功');
 }
 return;
 } else if (x > 0 && x < 11 && y > 0 && y < 11 && arr3[x][y] == 9) {
 alert('你踩到地雷啦!!!');
 arr3 = num();
 //移除原来的表格
 var s = document.getElementsByTagName('table')[0];
 s.parentNode.removeChild(s);
 init();
 gostart();

 }

 }

7、总结

这次的扫雷最大的缺点就是不能保证第一次不点到雷,还有就是是否还没有进行测试。。因为我也没有玩过一整局可能会有些许小bug

更多有趣的经典小游戏实现专题,分享给大家:

C++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

JavaScript经典游戏 玩不停

java经典小游戏汇总

javascript经典小游戏汇总

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • javascript 扫雷游戏

    "); for (var i = 0; i "); for(var j = 0; j   "); buffer.append(" "); } buffer.append(" "); var workarea = document.getElementById("workarea"); workarea.innerHTML = buffer.toString(); mine(); // lay mines at the

  • javascript实现扫雷简易版

    本文实例为大家分享了javascript实现扫雷简易版的具体代码,供大家参考,具体内容如下 使用截图 说明 这个完成的建议版本,所以没有插旗子,没有计时,就是最基本的原理实现,熟练的大佬30min就能完成 代码讲解 初始数据 var MAPSIZE = 10; var BOMBNUM = 1; var BOMBPOSITION = {}; var SQUAERPOSITION = {}; var SQUARECHECK = {}; var end = false; 初始化地图(CreateMap

  • js实现扫雷小程序的示例代码

    初学javascript,写了一个扫雷程序练练手! 扫雷规则及功能 扫雷想必大家都不陌生,就是windows上点击排雷的小游戏,它的主要规则有 1.左键点击显示当前格子是否为雷,如果为雷的话,GameOver啦,如果不是雷的话,这个格子会显示周围八个格子内的雷数量. 2.鼠标右键标记,标记可能的雷,标记了之后取消需要再次右键点击该格子,左键无效果. 3.鼠标中键(滚轮)按下后,快捷扫雷(如果周围雷数和未被标记且未被翻开的格子相等,会将这些格子一并翻开) 主要功能基本完全复刻了windows7扫雷

  • HTML+JavaScript实现扫雷小游戏

    本文实例为大家分享了JavaScript实现扫雷小游戏的具体代码,供大家参考,具体内容如下 工具:Sublime Text / Dreamweaver /Hbuilder <!doctype html> <html> <head> <meta charset="utf-8"> <title>SaoLei</title> <style type="text/css"> table {

  • js版扫雷实现代码 原理不错

    效果图:以下代码复制粘贴到记事本后保存为.html文件,打开后会出现提示,右击允许即可: 寻雷-----by 魅月 var data=new Array( [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0

  • 使用纯javascript实现经典扫雷游戏

    很久以前写的 当时都没写注释的 刚加上了 (尼玛,好多自己都不认识了 ... ) 不足的地方就是本来想写个游戏排名的统计的,等有空了再加上(好像每次都这么说 然后就等好久好久...) 还有就是没有实现:点击第一个格子不能是雷的功能 <style> ul{padding:0;list-style:none;} #mine{overflow:hidden;width:30px;height:30px;border:1px solid #966;} #mine li{float:left;width

  • 分享自己用JS做的扫雷小游戏

    引用了jQuery,节省了很多鼠标点击上的判断.界面显然都是照搬Windows的扫雷啦,详细的内容注释里都有,我就不啰嗦啦~ 先上截图~ 引用了jQuery,节省了很多鼠标点击上的判断 界面显然都是照搬Windows的扫雷啦 详细的内容注释里都有,我就不啰嗦啦~ JS部分 var mineArray, //地雷数组 lastNum, //剩余雷数 countNum, //未被揭开的方块数 inGame = 0, //游戏状态,0为结束,1为进行中,2为初始化完毕但未开始 startTime; /

  • JavaScript制作windows经典扫雷小游戏

    代码其实很简单,这里就不多废话了 <html> <head> <meta http-equiv="Content-Language" content="zh-cn"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>扫雷-JavaScript Mine Sweeper

  • JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】

    本文实例讲述了JavaScript扫雷游戏.分享给大家供大家参考,具体如下: 翻出年初写的游戏贴上来,扫雷相信大家都玩过,先上图: 源码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.or

  • 通过javascript实现扫雷游戏代码实例

    这篇文章主要介绍了通过javascript实现扫雷游戏代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 html代码: <div id="mine"> <div class="level"> <button type="button">初级</button> <button type="button">中级&l

  • js+canvas实现简单扫雷小游戏

    扫雷小游戏作为windows自带的一个小游戏,受到很多人的喜爱,今天我们就来尝试使用h5的canvas结合js来实现这个小游戏. 要写游戏,首先要明确游戏的规则,扫雷游戏是一个用鼠标操作的游戏,通过点击方块,根据方块的数字推算雷的位置,标记出所有的雷,打开所有的方块,即游戏成功,若点错雷的位置或标记雷错误,则游戏失败. 具体的游戏操作如下 1.可以通过鼠标左键打开隐藏的方块,打开后若不是雷,则会向四个方向扩展 2.可以通过鼠标右键点击未打开的方块来标记雷,第二次点击取消标记 3.可以通过鼠标右键

随机推荐