[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周圍單元格顯示周圍雷數量,這樣就和掃雷完全一樣了,可以點擊出現一大片,有時間我再完善它

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 掃雷是我第一個取得顯著成就的游戲,但一直沒有機會寫一篇關于它的文章。前不久,一家游戲媒體約我就掃雷做個采訪,列舉了...
    深加思考閱讀 2,831評論 4 5
  • 最近在做手冊核銷,幾百條甚至上千條的電子數據要進行比對,尤其是報關單號這一塊,關務數據和稅局比對不上的時候,要把差...
    早安雅清閱讀 470評論 0 0
  • 若我年輕稚嫩的雙手 蛻變為白骨…… 再難尋覓于你的人生 致如初!
    a還初閱讀 274評論 0 0