亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

使用純javascript實現經典掃雷游戲

2019-11-20 12:37:17
字體:
來源:轉載
供稿:網友

很久以前寫的 當時都沒寫注釋的 剛加上了 (尼瑪,好多自己都不認識了 ... )

不足的地方就是本來想寫個游戲排名的統計的,等有空了再加上(好像每次都這么說 然后就等好久好久...)

還有就是沒有實現:點擊第一個格子不能是雷的功能

<style>  ul{padding:0;list-style:none;}  #mine{overflow:hidden;width:30px;height:30px;border:1px solid #966;}  #mine li{float:left;width:30px;height:30px;line-height:30px;text-align:center;font-size:14px;color:#222;}  #mine .mine_01{background:url(mine.gif) no-repeat;}  #mine .mine_02{background:url(mine.gif) -30px 0 no-repeat;}  #mine .mine_03{background:url(mine.gif) -60px 0 no-repeat;}  #mine .mine_04{background:url(mine.gif) -90px 0 no-repeat;}  #mine .mine_05{background:url(mine.gif) -120px 0 no-repeat;}  #mine .mine_06{background:url(mine.gif) -150px 0 no-repeat;}  #mine .mine_07{background:url(mine.gif) -180px 0 no-repeat;}  #count{font-size:12px;}  #time{color:#900;font-weight:bold;}</style> <select id="wh"> <option value="8*10">8*10</option> <option value="10*10">10*10</option> <option value="12*12">12*12</option> </select> <button id='ready'>重新開始</button><div id="count"> 計時: <span id="time">0</span></div><ul id="mine"></ul>ie6+ ff oprea 谷歌opera 早期版本 默認不支持document.oncontextmenu事件 沒有找到好的替代方法<script>var $ = function(id){return document.getElementById(id)};window.onload=function ready(){  var V=$('wh').value.split('*')  setMineField(Number(V[0]),Number(V[1]));    $('wh').onchange=$('ready').onclick=function(){    V=$('wh').value.split('*')    setMineField(Number(V[0]),Number(V[1]))  }}//---------------------------------------------------雷區var mineField={  _mineW:30,   //每一個雷的寬度 必須和樣式同步  _mineH:30,  _mineFieldBlock:$('mine'),  _mineFieldEle:$('mine').getElementsByTagName('li'),  _time:$('time'),    status:0,   //雷區狀態 0還沒開始 1開始了 已經在計時了 2游戲結束了    mineNum:0,   //雷數  clearPlace:0, //統計掃除的格子;  x:0,      //列  y:0,      //行  density:0.2,  //雷的密度 雷區密度不宜超過0.5 在有些尺寸的雷區下 過高的設置 無法生成mineMap數組  mineMap:[],  //雷區的二維圖,0 : 不是雷  -1 : 雷  time:-1,    //計時 s  debug:false   //調試模式}//mineField object endfunction timedCount(){  if(mineField.status!=1){return false}  mineField.time++;  mineField._time.innerHTML=mineField.time;  setTimeout("timedCount()",1000);}//--------------------------------------對雷的狀態設置function setThisMine(str,index){  var allMine=mineField._mineFieldEle;  //設置雷是否插旗  if(str=='setOn'){    var thisMine=allMine[index];    thisMine.on=thisMine.on<2?thisMine.on+1:0;    if(thisMine.on==1){thisMine.className='mine_03';}//插旗    else if(thisMine.on==2){thisMine.className='mine_04'}//取消插旗    else if(thisMine.on==0){thisMine.className='mine_01'}//取消插旗    return false;  }  //顯示方格  if(str=='show'){    if(Object.prototype.toString.call(index) === '[object Array]'){//顯示一大片      mineField.clearPlace=mineField.clearPlace+index.length;      for(var i=0;i<index.length;i++){        var thisMine=allMine[index[i]];        thisMine.innerHTML=mineField.mineMap[thisMine.index];        thisMine.className='mine_02';        thisMine.on=3;      }    }    else{//顯示單個非雷區域      mineField.clearPlace++;      allMine[index].on=3;      allMine[index].innerHTML=mineField.mineMap[index];      allMine[index].className='mine_02';    }    if(mineField.clearPlace==mineField.x*mineField.y-mineField.mineNum){//恭喜你      alert('恭喜你');      for(var i=0;i<allMine.length;i++){        if(mineField.mineMap[allMine[i].index]==-1){          allMine[i].className='mine_07';        }      }      mineField.status=2;      return false;    }  }  //顯示全部雷  if(str=='peng'){      for(var i=0;i<allMine.length;i++){        if(mineField.mineMap[allMine[i].index]==-1){          allMine[i].className=i==index?'mine_06':'mine_05';        }      }      mineField.status=2;  }}//-----------------------------------------------設置行數 和 列數function setMineField(a,b){    var thisMineFiele=mineField._mineFieldBlock;    DivBox=document.createElement("div"),    num=a*b,k=0;    thisMineFiele.innerHTML='';    //雷區參數調整    mineField.x=a;//有幾列    mineField.y=b;//有幾行    mineField.mineNum=Math.floor(a*b*mineField.density);    mineField.status=0;    mineField.time=-1;    mineField.clearPlace=0;    mineField.mineMap.length=0;    mineField._time.innerHTML=0;            //生成雷區地圖    setMineMap();    //生成雷區(創建li)    while(k<num){    var newLi=document.createElement("li");    if(mineField.debug) newLi.innerHTML=mineField.mineMap[k];//作弊    newLi.className='mine_01';    DivBox.appendChild(newLi);    k++;    }    thisMineFiele.style.height=mineField._mineW*b+'px';    thisMineFiele.style.width=mineField._mineH*a+'px';    thisMineFiele.innerHTML=DivBox.innerHTML;    DivBox=null;    setEvent();//事件}//-----------------------------------生成雷區地圖function setMineMap(){    var num=mineField.x*mineField.y,      mineNum=mineField.mineNum,      Interval=Math.floor(num/mineNum);    for(var i=0;i<num;i++){      if(i%Interval==0&&i<mineNum*Interval){mineField.mineMap[i]=-1;}else{mineField.mineMap[i]=0;}//雷等距離分布與數組中    }    mineField.mineMap.sort(function(){ return 0.5 - Math.random()})//打亂數組        //判斷方格周圍是否都是雷 如果是的話 要重新生成雷區 從而避免成片雷區的存在    var br=0,//所在行      x=mineField.x,      L_T,T,R_T,L,R,L_B,B,R_B;    for(var i=0;i<num;i++){      br=Math.ceil((i+1)/x);      L_T = i-x-1;      T  = i-x;      R_T = i-x+1;      L  = i-1;      R  = i+1;      L_B = i+x-1;      B  = i+x;      R_B = i+x+1;       //坐上角 如果在雷區 并且是在上一行 并且他不是雷 就進行下一方格檢測       if(L_T>=0&&Math.ceil((L_T+1)/x)==br-1&&mineField.mineMap[L_T]==0){continue}       if(T >=0&&Math.ceil((T +1)/x)==br-1&&mineField.mineMap[T ]==0){continue}       if(R_T>=0&&Math.ceil((R_T+1)/x)==br-1&&mineField.mineMap[R_T]==0){continue}              if(L>=0 &&Math.ceil((L+1)/x)==br&&mineField.mineMap[L]==0){continue}       if(R<num&&Math.ceil((R+1)/x)==br&&mineField.mineMap[R]==0){continue}              if(L_B<num&&Math.ceil((L_B+1)/x)==br+1&&mineField.mineMap[L_B]==0){continue}       if(B <num&&Math.ceil((B +1)/x)==br+1&&mineField.mineMap[B ]==0){continue}       if(R_B<num&&Math.ceil((R_B+1)/x)==br+1&&mineField.mineMap[R_B]==0){continue}              setMineMap();       return false    }    //統計非雷方格周圍的雷數    for(i=0;i<num;i++){       if(mineField.mineMap[i]==-1){continue}       var thisMineNum=0       br=Math.ceil((i+1)/x);       L_T = i-x-1;       T  = i-x;       R_T = i-x+1;       L  = i-1;       R  = i+1;       L_B = i+x-1;       B  = i+x;       R_B = i+x+1;              if(L_T>=0&&Math.ceil((L_T+1)/x)==br-1&&mineField.mineMap[L_T]==-1){thisMineNum++;}       if(T >=0&&Math.ceil((T +1)/x)==br-1&&mineField.mineMap[T ]==-1){thisMineNum++;}       if(R_T>=0&&Math.ceil((R_T+1)/x)==br-1&&mineField.mineMap[R_T]==-1){thisMineNum++;}              if(L>=0 &&Math.ceil((L+1)/x)==br&&mineField.mineMap[L]==-1){thisMineNum++;}       if(R<num&&Math.ceil((R+1)/x)==br&&mineField.mineMap[R]==-1){thisMineNum++;}              if(L_B<num&&Math.ceil((L_B+1)/x)==br+1&&mineField.mineMap[L_B]==-1){thisMineNum++;}       if(B <num&&Math.ceil((B +1)/x)==br+1&&mineField.mineMap[B ]==-1){thisMineNum++;}       if(R_B<num&&Math.ceil((R_B+1)/x)==br+1&&mineField.mineMap[R_B]==-1){thisMineNum++;}              mineField.mineMap[i]=thisMineNum;    }}//----------------------------------雷區事件function setEvent(){    var thisMineFiele=mineField._mineFieldBlock,      allMine=mineField._mineFieldEle,      iMax=mineField.x*mineField.y;    for(var i=0;i<iMax;i++){      allMine[i].index=i;      allMine[i].on=0;//0為默認 1為插旗 2為問號 3為顯示    }    thisMineFiele.onmouseup=function(e){      if(mineField.status==2){return false;}      if(mineField.status==0){mineField.status=1;timedCount();}      var e=e||window.event,        thisObj=e.target||e.srcElement;      if(thisObj.nodeName=='UL'||thisObj.on==3){return false;}            var Btn=getButton(e);      if(Btn== 0){//左鍵        if(thisObj.on==1){return false;}//插旗子了 就不能點了        if(mineField.mineMap[thisObj.index]==-1){//點雷了          setThisMine('peng',thisObj.index);        }else if(mineField.mineMap[thisObj.index]==0){//點到空地了 打開一大片          //alert('你運氣真好')          var allShowMine=minesShow(thisObj.index);          setThisMine('show',allShowMine)        }else{//顯示一個格子          setThisMine('show',thisObj.index)        }      }      if(Btn== 2){//右鍵       setThisMine('setOn',thisObj.index);      }    }}//--------------------------------按到空格時 顯示一大片function minesShow(I){      var allMine=mineField._mineFieldEle,        allShowMine=[I];//保存要顯示的雷的下標            allMine[I].on=3;            see(I);//查詢下標為I的周圍的方格      function see(allI){        var _allI=[];        if(Object.prototype.toString.call(allI) === '[object Array]'){          for(var i=0;i<allI.length;i++){f(allI[i])}        }        else{f(allI)}        function f(thisI){          var text,          x=mineField.x,          br,          num=x*mineField.y,          L_T,T,R_T,L,R,L_B,B,R_B;                  text='_'+allShowMine.join('_')+'_';//用來判斷下標是否已經寫入數組          br=Math.ceil((thisI+1)/x);          L_T = thisI-x-1;          T  = thisI-x;          R_T = thisI-x+1;          L  = thisI-1;          R  = thisI+1;          L_B = thisI+x-1;          B  = thisI+x;          R_B = thisI+x+1;         //左上角的方格 如果是在雷區 又是在上一行 又是沒翻開的格子 又是空格 那么就寫如_allI數組 來進行下一次檢索         if(L_T>=0&&Math.ceil((L_T+1)/x)==br-1&&allMine[L_T].on==0&&mineField.mineMap[L_T] == 0){_allI.push(L_T);}         if(T >=0&&Math.ceil((T +1)/x)==br-1&&allMine[T ].on==0&&mineField.mineMap[T ] == 0){_allI.push(T);}         if(R_T>=0&&Math.ceil((R_T+1)/x)==br-1&&allMine[R_T].on==0&&mineField.mineMap[R_T] == 0){_allI.push(R_T);}                if(L>=0&&Math.ceil((L+1)/x)==br&&allMine[L].on==0&&mineField.mineMap[L] == 0){_allI.push(L);}         if(R<num&&Math.ceil((R+1)/x)==br&&allMine[R].on==0&&mineField.mineMap[R] == 0){_allI.push(R);}                if(L_B<num&&Math.ceil((L_B+1)/x)==br+1&&allMine[L_B].on==0&&mineField.mineMap[L_B] == 0){_allI.push(L_B);}         if(B <num&&Math.ceil((B +1)/x)==br+1&&allMine[B ].on==0&&mineField.mineMap[B ] == 0){_allI.push(B);}         if(R_B<num&&Math.ceil((R_B+1)/x)==br+1&&allMine[R_B].on==0&&mineField.mineMap[R_B] == 0){_allI.push(R_B);}         //------------------------------------------------         //左上角的的格子 如果在雷區 又是在上一行 又是沒翻開的格子 又是沒寫入allShowMine數組的 那就寫入吧 并提前標記為翻開的格子         if(L_T>=0&&Math.ceil((L_T+1)/x)==br-1&&allMine[L_T].on==0&&text.indexOf('_'+L_T+'_') == -1){allShowMine.push(L_T);allMine[L_T].on=3}         if(T >=0&&Math.ceil((T +1)/x)==br-1&&allMine[T ].on==0&&text.indexOf('_'+T+'_') == -1){allShowMine.push(T);allMine[T].on=3}         if(R_T>=0&&Math.ceil((R_T+1)/x)==br-1&&allMine[R_T].on==0&&text.indexOf('_'+R_T+'_') == -1){allShowMine.push(R_T);allMine[R_T].on=3}                if(L>=0&&Math.ceil((L+1)/x)==br&&allMine[L].on==0&&text.indexOf('_'+L+'_') == -1){allShowMine.push(L);allMine[L].on=3}         if(R<num&&Math.ceil((R+1)/x)==br&&allMine[R].on==0&&text.indexOf('_'+R+'_') == -1){allShowMine.push(R);allMine[R].on=3}                if(L_B<num&&Math.ceil((L_B+1)/x)==br+1&&allMine[L_B].on==0&&text.indexOf('_'+L_B+'_') == -1){allShowMine.push(L_B);allMine[L_B].on=3}         if(B <num&&Math.ceil((B +1)/x)==br+1&&allMine[B ].on==0&&text.indexOf('_'+B+'_') == -1){allShowMine.push(B );allMine[B ].on=3}         if(R_B<num&&Math.ceil((R_B+1)/x)==br+1&&allMine[R_B].on==0&&text.indexOf('_'+R_B+'_') == -1){allShowMine.push(R_B);allMine[R_B].on=3}                  if(_allI.length!=0){see(_allI)}        }      }      return allShowMine}//--------------------------------------document.oncontextmenu=function(){return false;}//禁止右鍵菜單function getButton(e){  var Btn;  if(document.implementation.hasFeature('MouseEvents','2.0')){Btn=e.button;}  else{    switch(e.button){          case 0:          case 1:          case 3:          case 5:          case 7:           Btn=0;           break;          case 2:          case 6:           Btn=2;           break;          case 4:           Btn=9;           break;        }  }  return Btn;}</script>

以上所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产美女主播一区| 日韩欧美第一页| 久久久久国产精品一区| 日韩有码在线播放| 国产亚洲精品久久久久久777| 92版电视剧仙鹤神针在线观看| 久久精品成人欧美大片| 亚洲精品之草原avav久久| 亚洲成avwww人| 亚洲视频专区在线| 欧洲永久精品大片ww免费漫画| 性欧美xxxx| 亚洲欧美精品一区二区| 欧美性猛交xxxx久久久| 成人久久精品视频| 不用播放器成人网| 日韩电影大全免费观看2023年上| 色偷偷综合社区| 亚洲精品视频网上网址在线观看| 日韩高清av一区二区三区| 亚洲日韩中文字幕在线播放| xxav国产精品美女主播| 欧美性在线视频| 国产精品一区二区久久精品| 国产美女精彩久久| 在线看日韩av| 免费不卡在线观看av| 亚洲最大福利网站| 国产性猛交xxxx免费看久久| 91中文字幕在线观看| 亚洲最大在线视频| 夜夜躁日日躁狠狠久久88av| 欧美精品在线第一页| 91影视免费在线观看| 欧美与黑人午夜性猛交久久久| 欧美黄色www| 7777kkkk成人观看| 清纯唯美日韩制服另类| 久久九九国产精品怡红院| 国产精品高潮呻吟久久av无限| 91精品视频网站| 欧美国产精品人人做人人爱| 欧美大尺度激情区在线播放| 2019国产精品自在线拍国产不卡| 欧美孕妇毛茸茸xxxx| 久久久久国色av免费观看性色| 懂色av影视一区二区三区| 日本久久久久久久| 亚洲男人天堂手机在线| 亚洲福利在线播放| 亚洲v日韩v综合v精品v| 国产成人高潮免费观看精品| 国产亚洲精品美女久久久| 国产精品久久久久久网站| 色噜噜国产精品视频一区二区| 欧美国产日本高清在线| 欧美激情在线观看视频| 日本一本a高清免费不卡| 91欧美视频网站| 92国产精品视频| 国产91在线高潮白浆在线观看| 97婷婷涩涩精品一区| 欧美性videos高清精品| 午夜精品蜜臀一区二区三区免费| 欧美黄色性视频| 国产成人亚洲精品| 国产成人精品久久二区二区91| 亚洲永久在线观看| 欧美乱大交xxxxx另类电影| 青青久久aⅴ北条麻妃| 欧美日韩另类字幕中文| 欧美中文字幕视频在线观看| 成人免费视频网| 色哟哟亚洲精品一区二区| 一区二区三区 在线观看视| 91九色精品视频| 亚洲最大福利网| 91精品久久久久久久| 国产精品mp4| 国产视频在线观看一区二区| 国产精品ⅴa在线观看h| 欧美激情国产精品| 欧美大肥婆大肥bbbbb| 国产精品极品美女在线观看免费| 2020国产精品视频| 精品视频久久久久久久| 亚洲无限乱码一二三四麻| 色婷婷综合成人| 日韩亚洲一区二区| 国产精品久久久久久久久久久新郎| 亚洲男人的天堂在线| 国产成人鲁鲁免费视频a| 国产成人精品视频在线| 欧美洲成人男女午夜视频| 国产成人一区二区三区电影| 欧美交受高潮1| 久久久午夜视频| 97免费中文视频在线观看| 国产91在线播放九色快色| 国产精品av免费在线观看| 国产一区二区三区在线| 色婷婷**av毛片一区| 亚洲欧美日韩精品久久| 91亚洲一区精品| 黄色91在线观看| 欧美激情一区二区三区高清视频| 欧美一级免费看| 午夜精品一区二区三区在线视频| 久久久av一区| 亚洲精选在线观看| 欧美高清在线视频观看不卡| 亚洲精品不卡在线| 日韩欧美精品在线观看| 日韩欧美成人免费视频| 日韩av免费在线观看| 成人精品久久一区二区三区| 久久影视电视剧免费网站清宫辞电视| 日韩成人在线播放| 欧美专区福利在线| 国产精品高潮呻吟久久av黑人| 国内精品久久久久| 日韩精品在线免费观看| 亚洲视频专区在线| 欧美麻豆久久久久久中文| 最近2019年好看中文字幕视频| 欧美体内谢she精2性欧美| 日韩视频免费在线观看| 亚洲色图25p| 精品国产乱码久久久久久虫虫漫画| 亚洲激情在线观看视频免费| 亚洲国产美女久久久久| 亚洲电影在线观看| 奇米四色中文综合久久| 日韩精品视频免费| 亚洲热线99精品视频| 亚洲日本aⅴ片在线观看香蕉| 欧美日韩一区免费| 成人性生交大片免费看小说| 日韩电影视频免费| 亚洲精品www久久久久久广东| 亚洲精品视频在线观看视频| 欧美性猛交xxxx黑人猛交| 精品国产欧美一区二区五十路| 国产日韩精品电影| 欧美最近摘花xxxx摘花| 日韩高清av一区二区三区| 日韩精品在线观看一区| 欧美成人精品在线播放| 国产网站欧美日韩免费精品在线观看| 91精品国产沙发| 91最新在线免费观看| 国产自产女人91一区在线观看| 3344国产精品免费看| 久久中文字幕视频| 亚洲女人天堂视频| 色狠狠av一区二区三区香蕉蜜桃| 亚洲无线码在线一区观看| 日韩第一页在线| 亚洲国产欧美一区二区三区同亚洲| 成人a在线观看| 97国产精品久久| 国产精品美女网站| 在线免费看av不卡| 欧美黑人性视频|