[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閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容

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