[JS篇]教你用原生JS简单做一个扫雷


直接上代码,挺好理解的,可以进一步完善

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <script type="text/javascript">

  window.onload = function(){

    /*点击开始*/
      document.getElementById("start_draw").onclick = function(){
      init();
    };

    /*调范围按钮*/
    document.getElementById("seleArea").onchange = function () {
      Common.WIDTH = this.value;
      Common.HEIGHT = this.value;
      init();
    };

    /*调大小按钮*/
    document.getElementById("selSize").onchange = function () {
      Common.TABLE_WIDTH = this.value;
      Common.TBALE_HEIGHT = this.value;
      init();
    };

    /*调布雷数量*/
    document.getElementById("selCount").onchange = function () {
      Common.BOOMACOUNT = this.value;
      init();
    };
}

  /*方格属性*/
  var Common = new function () {
    this.ARRAY= [];
    this.WIDTH =20;
    this.HEIGHT = 20;
    this.TABLE_WIDTH = 20;
    this.TBALE_HEIGHT = 20;
    this.BOOMACOUNT = 30;
    this.BOOMARROUNDCOUNT=0;
  };

  /*初始化属性*/
  function init(){
    Common.ARRAY = makeArray(Common.WIDTH, Common.HEIGHT);
    var BOOMEARA = [];
    BOOMEARA = initBOOM(Common.ARRAY,Common.BOOMACOUNT);
    console.log("初始化Eare:"+BOOMEARA);
    document.getElementById('game_area').innerHTML =  makeTable(Common.ARRAY);
  }

  /*初始化雷区*/
  function initBOOM( arr, num) {
    for (var i = 0; i < num; i++) {
      var area = makeRandomBoom(arr);
      console.log("初始化雷区:"+area);
      if( "a" == arr[ area[0] ][ area[1] ] ){
        arr[ area[0] ][ area[1] ] = "b";
      }
      console.log( "a or b:" + arr[ area[0] ][ area[1] ] );
    }
    return arr;
  }

  /*根据二维数组生成表格*/
  function makeTable(array) {
    x = array[0].length;
    y = array.length;
    var html = [];
    html.push("<table border='0' bgcolor='#00' cellspacing='1'  id='gtable'>");
    for (var i = 0; i < x; i++) {
      html.push("<tr>");
      for (var j = 0; j < y; j++) {
        html.push("<td width="+ Common.TABLE_WIDTH+" height="+ Common.TBALE_HEIGHT+" bgcolor='#808080' onclick='tableOnclik("+i+","+j+")'></td>");
      }
      html.push("</tr>");
    }
    html.push("</table>");
    // console.log("html:"+html);
    return html;
  }

  //表格单元被点击
  function tableOnclik(x,y){
    console.log("点击坐标:"+"("+x+","+y+")");
    if( "a" == Common.ARRAY[x][y]){
      draw(x,y, "white");
      document.getElementById('gtable').rows[x].cells[y].innerHTML = boomCount(x,y);
      //点击如果雷数为零,让周围变为白色
      if ( boomCount(x,y) == 0) {
        var arr = Common.ARRAY;
        if( "a" == arr[x-1][y-1]){draw(x-1,y-1, "white");}
        if( "a" == arr[x-1][y]){draw(x-1,y, "white");}
        if( "a" == arr[x-1][y+1]){draw(x-1,y+1, "white");}
        if( "a" == arr[x][y-1]){draw(x,y-1, "white");}
        if( "a" == arr[x][y+1]){draw(x,y+1, "white");}
        if( "a" == arr[x+1][y-1]){draw(x+1,y-1, "white");}
        if( "a" == arr[x+1][y]){ draw(x+1,y, "white");}
        if( "a" == arr[x+1][y+1]){draw(x+1,y+1, "white");}
      }
    }else if( "b" == Common.ARRAY[x][y]){
      console.log("----------------踩住雷了-------------------------");
      drawAllColor(Common.ARRAY);
      //gameOver();
    }
  }

  /*画点*/
  function draw( i,j,color ) {
    var x=document.getElementById('gtable').rows[i].cells[j];
    x.style.background = color;
  }


  function drawAllColor( arr) {
    var x = arr[0].length;
    var y = arr.length;
    // console.log("坐标:"+"("+x+","+y+")");
    for (var i = 0; i < x; i++) {
      for (var j = 0; j < y; j++) {
          if( "b" == arr[i][j]){
            draw(i,j, "red");
            document.getElementById('gtable').rows[i].cells[j].innerHTML = " * ";
          }else{;
            draw(i,j, "white");
          }
      }
    }
    return arr;
  }

  /*游戏结束*/
  function gameOver(){
    if (Common.BOOMARROUNDCOUNT == 0) {
        alert("-出师未捷身先死-");
    }else {
        alert("-GAME OVER-");
    }

    init();
  }

  /*周围雷的个数*/
  function boomCount(x,y){
    console.log("boomCount-点击坐标:"+"("+x+","+y+")");
    var arr = Common.ARRAY;
    //将周围雷的个数置零
    Common.BOOMARROUNDCOUNT = 0;

    //中间
    if(x!=0 && y!=0 && x!=Common.WIDTH -1 && y!=Common.HEIGHT-1) {

      if( "b" == arr[x-1][y-1]){ Common.BOOMARROUNDCOUNT = Common.BOOMARROUNDCOUNT + 1;}
      if( "b" == arr[x-1][y]){ Common.BOOMARROUNDCOUNT = Common.BOOMARROUNDCOUNT + 1;}
      if( "b" == arr[x-1][y+1]){ Common.BOOMARROUNDCOUNT = Common.BOOMARROUNDCOUNT + 1;}
      if( "b" == arr[x][y-1]){ Common.BOOMARROUNDCOUNT = Common.BOOMARROUNDCOUNT + 1;}
      if( "b" == arr[x][y+1]){ Common.BOOMARROUNDCOUNT = Common.BOOMARROUNDCOUNT + 1;}
      if( "b" == arr[x+1][y-1]){ Common.BOOMARROUNDCOUNT = Common.BOOMARROUNDCOUNT + 1;}
      if( "b" == arr[x+1][y]){ Common.BOOMARROUNDCOUNT = Common.BOOMARROUNDCOUNT + 1;}
      if( "b" == arr[x+1][y+1]){ Common.BOOMARROUNDCOUNT = Common.BOOMARROUNDCOUNT + 1;}
      // console.log("-=count=-"+Common.BOOMARROUNDCOUNT);
    }

    //边角
    else if((x==0 && y==0)
      || (x==Common.WIDTH-1 && y==Common.HEIGHT-1)
      ||(x==Common.WIDTH-1 && y==0)
      ||(x==0 && y==Common.HEIGHT-1))
    {
      console.log("边角");
      if ((x==0 && y==0)  &&  ("b" == arr[x][y+1] || "b" == arr[x+1][y] ||  "b" == arr[x+1][y+1])) {Common.BOOMARROUNDCOUNT = Common.BOOMARROUNDCOUNT + 1;}
      else if ((x==Common.WIDTH-1 && y==Common.HEIGHT-1)  &&  ("b" == arr[x][y-1] || "b" ==  arr[x-1][y] || "b" == arr[x-1][y-1] )) { Common.BOOMARROUNDCOUNT = Common.BOOMARROUNDCOUNT + 1;}
      else if (x==0 && y==Common.HEIGHT-1){
        if("b" == arr[x][y-1] || "b" == arr[x+1][y] || "b" == arr[x+1][y-1]) {Common.BOOMARROUNDCOUNT = Common.BOOMARROUNDCOUNT + 1;}
      }else if (x==Common.WIDTH-1 && y==0) {
        if ("b" == arr[x-1][y] || "b" == arr[x][y+1] || "b" == arr[x-1][y+1]){ Common.BOOMARROUNDCOUNT = Common.BOOMARROUNDCOUNT + 1;}
      }
    }

    //边框
    else
    {
      console.log("边框");
      if ((x==0 && y!=0)  && ("b" == arr[x][y-1]|| "b" == arr[x][y+1] || "b" == arr[x+1][y-1]|| "b" == arr[x+1][y] || "b" == arr[x+1][y+1])){ Common.BOOMARROUNDCOUNT = Common.BOOMARROUNDCOUNT + 1;}
      if ((y==0 && x!=0) && ("b" == arr[x-1][y] || "b" == arr[x-1][y+1] || "b" == arr[x][y+1] || "b" == arr[x+1][y] || "b" == arr[x+1][y+1])){ Common.BOOMARROUNDCOUNT = Common.BOOMARROUNDCOUNT + 1;}
      if ((y==Common.HEIGHT-1 && x!=0) && ("b" == arr[x-1][y-1] ||"b" == arr[x-1][y]|| "b" == arr[x][y-1] || "b" == arr[x+1][y-1] || "b" == arr[x+1][y])){ Common.BOOMARROUNDCOUNT = Common.BOOMARROUNDCOUNT + 1;}
      if ((x==Common.WIDTH-1 && y!=0) &&  ("b" == arr[x-1][y-1] || "b" == arr[x-1][y] || "b" == arr[x-1][y+1] || "b" == arr[x][y-1] || "b" == arr[x][y+1])){ Common.BOOMARROUNDCOUNT = Common.BOOMARROUNDCOUNT + 1;}
    }

    return Common.BOOMARROUNDCOUNT;
  }

  /*初始化数组*/
  function makeArray( x, y) {
    var array = [];
    for (var i = 0; i < x; i++) {
      var row = [];
      for (var j = 0; j < y; j++) {
          row.push('a');
      }
      array.push(row);
    }
    return array;
  }



  /*产生随机的雷*/
  function makeRandomBoom(arr){
    var x = Math.floor( Math.random()*arr[0].length % arr[0].length );
    var y = Math.floor( Math.random()*arr.length % arr.length );
    var arrArea = [];
    arrArea[0] = x;
    arrArea[1] = y;
    return arrArea;
  }
  </script>

  <body>
      <div id='game_area'></div>

      <p>表格范围</p>
      <select id="seleArea">
        <option value="20">20*20</option>
        <option value="30">30*30</option>
        <option value="40">40*40</option>
      </select>

      <p>表格大小</p>
      <select id="selSize">
        <option value="20">20*20</option>
        <option value="26">26*26</option>
        <option value="30">30*30</option>
      </select>

      <p>布雷数量</p>
      <select id="selCount">
        <option value="30">30</option>
        <option value="50">50</option>
        <option value="80">80</option>
      </select>

      <br><br>
      <button id="start_draw" type="button">开始游戏</button>
  </body>
</html>

Paste_Image.png
Paste_Image.png

可以进一步完善,利用嵌套回调调用0周围单元格显示周围雷数量,这样就和扫雷完全一样了,可以点击出现一大片,有时间我再完善它

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,468评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,620评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,427评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,160评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,197评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,334评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,775评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,444评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,628评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,459评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,508评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,210评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,767评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,850评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,076评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,627评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,196评论 2 341

推荐阅读更多精彩内容

  • 扫雷是我第一个取得显著成就的游戏,但一直没有机会写一篇关于它的文章。前不久,一家游戏媒体约我就扫雷做个采访,列举了...
    深加思考阅读 2,735评论 4 5
  • 最近在做手册核销,几百条甚至上千条的电子数据要进行比对,尤其是报关单号这一块,关务数据和税局比对不上的时候,要把差...
    早安雅清阅读 448评论 0 0
  • 若我年轻稚嫩的双手 蜕变为白骨…… 再难寻觅于你的人生 致如初!
    a还初阅读 266评论 0 0