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

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 16:18:40
字體:
來源:轉載
供稿:網友

本文給大家分享的是個人剛開始學習javascript的時候寫的仿windows經典的掃雷游戲的代碼,當時只是寫了下來,沒加注釋,這里補上,有需要的小伙伴可以參考下。

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

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

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

 

 
  1. <style> 
  2. ul{padding:0;list-style:none;} 
  3. #mine{overflow:hidden;width:30px;height:30px;border:1px solid #966;} 
  4. #mine li{float:left;width:30px;height:30px;line-height:30px;text-align:center;font-size:14px;color:#222;} 
  5. #mine .mine_01{background:url(mine.gif) no-repeat;} 
  6. #mine .mine_02{background:url(mine.gif) -30px 0 no-repeat;} 
  7. #mine .mine_03{background:url(mine.gif) -60px 0 no-repeat;} 
  8. #mine .mine_04{background:url(mine.gif) -90px 0 no-repeat;} 
  9. #mine .mine_05{background:url(mine.gif) -120px 0 no-repeat;} 
  10. #mine .mine_06{background:url(mine.gif) -150px 0 no-repeat;} 
  11. #mine .mine_07{background:url(mine.gif) -180px 0 no-repeat;} 
  12.  
  13. #count{font-size:12px;} 
  14. #time{color:#900;font-weight:bold;} 
  15. </style> 
  16. <select id="wh"
  17. <option value="8*10">8*10</option> 
  18. <option value="10*10">10*10</option> 
  19. <option value="12*12">12*12</option> 
  20. </select> 
  21. <button id='ready'>重新開始</button> 
  22. <div id="count"
  23. 計時: <span id="time">0</span> 
  24. </div> 
  25.  
  26. <ul id="mine"
  27.  
  28. </ul> 
  29.  
  30. ie6+ ff oprea 谷歌 
  31. opera 早期版本 默認不支持document.oncontextmenu事件 沒有找到好的替代方法 
  32. <script> 
  33. var $ = function(id){return document.getElementById(id)}; 
  34. window.onload=function ready(){ 
  35. var V=$('wh').value.split('*'
  36. setMineField(Number(V[0]),Number(V[1])); 
  37.  
  38. $('wh').onchange=$('ready').onclick=function(){ 
  39. V=$('wh').value.split('*'
  40. setMineField(Number(V[0]),Number(V[1])) 
  41. //---------------------------------------------------雷區 
  42. var mineField={ 
  43. _mineW:30, //每一個雷的寬度 必須和樣式同步 
  44. _mineH:30, 
  45. _mineFieldBlock:$('mine'), 
  46. _mineFieldEle:$('mine').getElementsByTagName('li'), 
  47. _time:$('time'), 
  48.  
  49. status:0, //雷區狀態 0還沒開始 1開始了 已經在計時了 2游戲結束了  
  50. mineNum:0, //雷數 
  51. clearPlace:0, //統計掃除的格子; 
  52. x:0, //列 
  53. y:0, //行 
  54. density:0.2, //雷的密度 雷區密度不宜超過0.5 在有些尺寸的雷區下 過高的設置 無法生成mineMap數組 
  55. mineMap:[], //雷區的二維圖,0 : 不是雷 -1 : 雷 
  56. time:-1, //計時 s 
  57. debug:false //調試模式 
  58. }//mineField object end 
  59.  
  60. function timedCount(){ 
  61. if(mineField.status!=1){return false
  62. mineField.time++; 
  63. mineField._time.innerHTML=mineField.time; 
  64. setTimeout("timedCount()",1000); 
  65. //--------------------------------------對雷的狀態設置 
  66. function setThisMine(str,index){ 
  67.  
  68. var allMine=mineField._mineFieldEle; 
  69. //設置雷是否插旗 
  70. if(str=='setOn'){ 
  71. var thisMine=allMine[index]; 
  72. thisMine.on=thisMine.on<2?thisMine.on+1:0; 
  73. if(thisMine.on==1){thisMine.className='mine_03';}//插旗 
  74. else if(thisMine.on==2){thisMine.className='mine_04'}//取消插旗 
  75. else if(thisMine.on==0){thisMine.className='mine_01'}//取消插旗 
  76. return false
  77. //顯示方格 
  78. if(str=='show'){ 
  79. if(Object.prototype.toString.call(index) === '[object Array]'){//顯示一大片 
  80. mineField.clearPlace=mineField.clearPlace+index.length; 
  81. for(var i=0;i<index.length;i++){ 
  82. var thisMine=allMine[index[i]]; 
  83. thisMine.innerHTML=mineField.mineMap[thisMine.index]; 
  84. thisMine.className='mine_02'
  85. thisMine.on=3; 
  86. else{//顯示單個非雷區域 
  87. mineField.clearPlace++; 
  88. allMine[index].on=3; 
  89. allMine[index].innerHTML=mineField.mineMap[index]; 
  90. allMine[index].className='mine_02'
  91. if(mineField.clearPlace==mineField.x*mineField.y-mineField.mineNum){//恭喜你 
  92. alert('恭喜你'); 
  93. for(var i=0;i<allMine.length;i++){ 
  94. if(mineField.mineMap[allMine[i].index]==-1){ 
  95. allMine[i].className='mine_07'
  96. mineField.status=2; 
  97. return false
  98. //顯示全部雷 
  99. if(str=='peng'){ 
  100. for(var i=0;i<allMine.length;i++){ 
  101. if(mineField.mineMap[allMine[i].index]==-1){ 
  102. allMine[i].className=i==index?'mine_06':'mine_05'
  103. mineField.status=2; 
  104. //-----------------------------------------------設置行數 和 列數 
  105. function setMineField(a,b){ 
  106. var thisMineFiele=mineField._mineFieldBlock; 
  107. DivBox=document.createElement("div"), 
  108. num=a*b,k=0; 
  109. thisMineFiele.innerHTML=''
  110. //雷區參數調整 
  111. mineField.x=a;//有幾列 
  112. mineField.y=b;//有幾行 
  113. mineField.mineNum=Math.floor(a*b*mineField.density); 
  114. mineField.status=0; 
  115. mineField.time=-1; 
  116. mineField.clearPlace=0; 
  117. mineField.mineMap.length=0; 
  118. mineField._time.innerHTML=0; 
  119.  
  120. //生成雷區地圖 
  121. setMineMap(); 
  122. //生成雷區(創建li) 
  123. while(k<num){ 
  124. var newLi=document.createElement("li"); 
  125. if(mineField.debug) newLi.innerHTML=mineField.mineMap[k];//作弊 
  126. newLi.className='mine_01'
  127. DivBox.appendChild(newLi); 
  128. k++; 
  129. thisMineFiele.style.height=mineField._mineW*b+'px'
  130. thisMineFiele.style.width=mineField._mineH*a+'px'
  131. thisMineFiele.innerHTML=DivBox.innerHTML; 
  132. DivBox=null
  133. setEvent();//事件 
  134. //-----------------------------------生成雷區地圖 
  135. function setMineMap(){ 
  136. var num=mineField.x*mineField.y, 
  137. mineNum=mineField.mineNum, 
  138. Interval=Math.floor(num/mineNum); 
  139. for(var i=0;i<num;i++){ 
  140. if(i%Interval==0&&i<mineNum*Interval){mineField.mineMap[i]=-1;}else{mineField.mineMap[i]=0;}//雷等距離分布與數組中 
  141. mineField.mineMap.sort(function(){ return 0.5 - Math.random()})//打亂數組 
  142.  
  143. //判斷方格周圍是否都是雷 如果是的話 要重新生成雷區 從而避免成片雷區的存在 
  144. var br=0,//所在行 
  145. x=mineField.x, 
  146. L_T,T,R_T,L,R,L_B,B,R_B; 
  147. for(var i=0;i<num;i++){ 
  148. br=Math.ceil((i+1)/x); 
  149. L_T = i-x-1; 
  150. T = i-x; 
  151. R_T = i-x+1; 
  152. L = i-1; 
  153. R = i+1; 
  154. L_B = i+x-1; 
  155. B = i+x; 
  156. R_B = i+x+1; 
  157. //坐上角 如果在雷區 并且是在上一行 并且他不是雷 就進行下一方格檢測 
  158. if(L_T>=0&&Math.ceil((L_T+1)/x)==br-1&&mineField.mineMap[L_T]==0){continue
  159. if(T >=0&&Math.ceil((T +1)/x)==br-1&&mineField.mineMap[T ]==0){continue
  160. if(R_T>=0&&Math.ceil((R_T+1)/x)==br-1&&mineField.mineMap[R_T]==0){continue
  161.  
  162. if(L>=0 &&Math.ceil((L+1)/x)==br&&mineField.mineMap[L]==0){continue
  163. if(R<num&&Math.ceil((R+1)/x)==br&&mineField.mineMap[R]==0){continue
  164.  
  165. if(L_B<num&&Math.ceil((L_B+1)/x)==br+1&&mineField.mineMap[L_B]==0){continue
  166. if(B <num&&Math.ceil((B +1)/x)==br+1&&mineField.mineMap[B ]==0){continue
  167. if(R_B<num&&Math.ceil((R_B+1)/x)==br+1&&mineField.mineMap[R_B]==0){continue
  168.  
  169. setMineMap(); 
  170. return false 
  171. //統計非雷方格周圍的雷數 
  172. for(i=0;i<num;i++){ 
  173. if(mineField.mineMap[i]==-1){continue
  174. var thisMineNum=0 
  175. br=Math.ceil((i+1)/x); 
  176. L_T = i-x-1; 
  177. T = i-x; 
  178. R_T = i-x+1; 
  179. L = i-1; 
  180. R = i+1; 
  181. L_B = i+x-1; 
  182. B = i+x; 
  183. R_B = i+x+1; 
  184.  
  185. if(L_T>=0&&Math.ceil((L_T+1)/x)==br-1&&mineField.mineMap[L_T]==-1){thisMineNum++;} 
  186. if(T >=0&&Math.ceil((T +1)/x)==br-1&&mineField.mineMap[T ]==-1){thisMineNum++;} 
  187. if(R_T>=0&&Math.ceil((R_T+1)/x)==br-1&&mineField.mineMap[R_T]==-1){thisMineNum++;} 
  188.  
  189. if(L>=0 &&Math.ceil((L+1)/x)==br&&mineField.mineMap[L]==-1){thisMineNum++;} 
  190. if(R<num&&Math.ceil((R+1)/x)==br&&mineField.mineMap[R]==-1){thisMineNum++;} 
  191.  
  192. if(L_B<num&&Math.ceil((L_B+1)/x)==br+1&&mineField.mineMap[L_B]==-1){thisMineNum++;} 
  193. if(B <num&&Math.ceil((B +1)/x)==br+1&&mineField.mineMap[B ]==-1){thisMineNum++;} 
  194. if(R_B<num&&Math.ceil((R_B+1)/x)==br+1&&mineField.mineMap[R_B]==-1){thisMineNum++;} 
  195.  
  196. mineField.mineMap[i]=thisMineNum; 
  197. //----------------------------------雷區事件 
  198. function setEvent(){ 
  199. var thisMineFiele=mineField._mineFieldBlock, 
  200. allMine=mineField._mineFieldEle, 
  201. iMax=mineField.x*mineField.y; 
  202. for(var i=0;i<iMax;i++){ 
  203. allMine[i].index=i; 
  204. allMine[i].on=0;//0為默認 1為插旗 2為問號 3為顯示 
  205. thisMineFiele.onmouseup=function(e){ 
  206. if(mineField.status==2){return false;} 
  207. if(mineField.status==0){mineField.status=1;timedCount();} 
  208. var e=e||window.event, 
  209. thisObj=e.target||e.srcElement; 
  210. if(thisObj.nodeName=='UL'||thisObj.on==3){return false;} 
  211.  
  212. var Btn=getButton(e); 
  213. if(Btn== 0){//左鍵 
  214. if(thisObj.on==1){return false;}//插旗子了 就不能點了 
  215.  
  216. if(mineField.mineMap[thisObj.index]==-1){//點雷了 
  217. setThisMine('peng',thisObj.index); 
  218. }else if(mineField.mineMap[thisObj.index]==0){//點到空地了 打開一大片 
  219. //alert('你運氣真好') 
  220. var allShowMine=minesShow(thisObj.index); 
  221. setThisMine('show',allShowMine) 
  222. }else{//顯示一個格子 
  223. setThisMine('show',thisObj.index) 
  224. if(Btn== 2){//右鍵 
  225. setThisMine('setOn',thisObj.index); 
  226. //--------------------------------按到空格時 顯示一大片 
  227. function minesShow(I){ 
  228. var allMine=mineField._mineFieldEle, 
  229. allShowMine=[I];//保存要顯示的雷的下標 
  230.  
  231. allMine[I].on=3; 
  232.  
  233. see(I);//查詢下標為I的周圍的方格 
  234. function see(allI){ 
  235. var _allI=[]; 
  236. if(Object.prototype.toString.call(allI) === '[object Array]'){ 
  237. for(var i=0;i<allI.length;i++){f(allI[i])} 
  238. else{f(allI)} 
  239. function f(thisI){ 
  240. var text, 
  241. x=mineField.x, 
  242. br, 
  243. num=x*mineField.y, 
  244. L_T,T,R_T,L,R,L_B,B,R_B; 
  245.  
  246. text='_'+allShowMine.join('_')+'_';//用來判斷下標是否已經寫入數組 
  247. br=Math.ceil((thisI+1)/x); 
  248. L_T = thisI-x-1; 
  249. T = thisI-x; 
  250. R_T = thisI-x+1; 
  251. L = thisI-1; 
  252. R = thisI+1; 
  253. L_B = thisI+x-1; 
  254. B = thisI+x; 
  255. R_B = thisI+x+1; 
  256. //左上角的方格 如果是在雷區 又是在上一行 又是沒翻開的格子 又是空格 那么就寫如_allI數組 來進行下一次檢索 
  257. 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);} 
  258. if(T >=0&&Math.ceil((T +1)/x)==br-1&&allMine[T ].on==0&&mineField.mineMap[T ] == 0){_allI.push(T);} 
  259. 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);} 
  260.  
  261. if(L>=0&&Math.ceil((L+1)/x)==br&&allMine[L].on==0&&mineField.mineMap[L] == 0){_allI.push(L);} 
  262. if(R<num&&Math.ceil((R+1)/x)==br&&allMine[R].on==0&&mineField.mineMap[R] == 0){_allI.push(R);} 
  263.  
  264. 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);} 
  265. if(B <num&&Math.ceil((B +1)/x)==br+1&&allMine[B ].on==0&&mineField.mineMap[B ] == 0){_allI.push(B);} 
  266. 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);} 
  267. //------------------------------------------------ 
  268. //左上角的的格子 如果在雷區 又是在上一行 又是沒翻開的格子 又是沒寫入allShowMine數組的 那就寫入吧 并提前標記為翻開的格子 
  269. 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} 
  270. 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} 
  271. 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} 
  272.  
  273. if(L>=0&&Math.ceil((L+1)/x)==br&&allMine[L].on==0&&text.indexOf('_'+L+'_') == -1){allShowMine.push(L);allMine[L].on=3} 
  274. if(R<num&&Math.ceil((R+1)/x)==br&&allMine[R].on==0&&text.indexOf('_'+R+'_') == -1){allShowMine.push(R);allMine[R].on=3} 
  275.  
  276. 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} 
  277. 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} 
  278. 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} 
  279.  
  280. if(_allI.length!=0){see(_allI)} 
  281. return allShowMine 
  282. //-------------------------------------- 
  283. document.oncontextmenu=function(){return false;}//禁止右鍵菜單 
  284. function getButton(e){ 
  285. var Btn; 
  286. if(document.implementation.hasFeature('MouseEvents','2.0')){Btn=e.button;} 
  287. elseswitch(e.button){ 
  288. case 0: 
  289. case 1: 
  290. case 3: 
  291. case 5: 
  292. case 7: 
  293. Btn=0; 
  294. break
  295. case 2: 
  296. case 6: 
  297. Btn=2; 
  298. break
  299. case 4: 
  300. Btn=9; 
  301. break
  302. return Btn; 
  303. </script> 

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
伦伦影院午夜日韩欧美限制| 久久久久久国产| 久久激情视频久久| 亚洲综合大片69999| 亚洲精品黄网在线观看| 最近2019中文字幕一页二页| 亚洲人成在线播放| 亚洲а∨天堂久久精品喷水| 久久综合亚洲社区| 国产视频综合在线| 国产精品极品美女在线观看免费| 精品免费在线视频| 国产精品一区二区三区免费视频| 亚洲精品wwwww| 欧美电影在线观看| 国产视频久久久| 在线午夜精品自拍| 亚洲色图美腿丝袜| 国产精品美女久久久久av超清| 精品久久久久久中文字幕大豆网| 成人亚洲综合色就1024| 欧美激情精品久久久久久免费印度| 亚洲第一区中文99精品| 成人免费网站在线| 国产激情视频一区| 91国产精品91| 欧美日韩国产成人高清视频| 亚洲一区二区国产| 亚洲aⅴ男人的天堂在线观看| 97福利一区二区| 欧美大片大片在线播放| 亚洲wwwav| 久久人人爽人人| 欧美激情一区二区三级高清视频| 日韩av电影院| 色琪琪综合男人的天堂aⅴ视频| 国外成人在线视频| 91精品国产综合久久香蕉的用户体验| 国产精品男人的天堂| 成人激情电影一区二区| 狠狠躁夜夜躁人人爽超碰91| 爽爽爽爽爽爽爽成人免费观看| 日韩成人av网址| 精品无人区太爽高潮在线播放| 久久久久久国产精品| 青草热久免费精品视频| 日韩精品视频在线播放| 亚洲男人天堂网站| 欧美一级片一区| 伊人久久五月天| 2019国产精品自在线拍国产不卡| 人人澡人人澡人人看欧美| 欧美精品在线视频观看| 免费av在线一区| 少妇av一区二区三区| 国产精品久久久久77777| 国产在线精品成人一区二区三区| 成人网欧美在线视频| 欧美日本精品在线| 亚洲片国产一区一级在线观看| 亚洲视频一区二区三区| 欧美成人激情在线| 日韩欧美在线国产| 精品少妇一区二区30p| 色先锋资源久久综合5566| 国产精品美腿一区在线看| 成人精品视频在线| 中文字幕综合在线| 亚洲精品久久7777777| 欧美贵妇videos办公室| 久久精品视频中文字幕| 国产精品一区二区在线| 成人精品久久av网站| 欧美大片在线看免费观看| 国产精品第三页| 91精品国产777在线观看| 欧美在线视频一区二区| 性欧美xxxx视频在线观看| 国产在线视频2019最新视频| 亚洲欧美日韩综合| 欧美激情极品视频| 国产深夜精品福利| 久久免费视频在线观看| 成人午夜小视频| 亚洲国产日韩欧美在线动漫| 538国产精品视频一区二区| 亚洲欧美日韩精品久久| 国产一区二区在线免费视频| 91色中文字幕| 国产精品久久久久久亚洲调教| 精品无人区乱码1区2区3区在线| 国产日韩欧美黄色| 亚洲福利视频网站| 久久久久久国产免费| 亚洲成年网站在线观看| 91免费在线视频| 久久久99免费视频| 伊人久久久久久久久久久久久| 欧美孕妇毛茸茸xxxx| 国产日产久久高清欧美一区| 欧美大尺度激情区在线播放| 国产精品专区一| 亚洲天堂日韩电影| 欧美另类99xxxxx| 欧美日韩免费看| 4444欧美成人kkkk| 久久视频精品在线| 91精品国产综合久久香蕉922| 国内精品一区二区三区四区| 亚洲一区免费网站| 欧美性猛交视频| 久久亚洲国产成人| 久色乳综合思思在线视频| 97人人爽人人喊人人模波多| 亚洲综合中文字幕在线| 欧美放荡办公室videos4k| 日韩免费黄色av| 亚洲欧洲日本专区| 欧美在线视频a| 久久久久国产精品www| 91亚洲精华国产精华| 欧美精品九九久久| 久久夜色精品国产| 精品国产1区2区| 欧美精品www在线观看| 在线日韩日本国产亚洲| 久久躁日日躁aaaaxxxx| 日本不卡高字幕在线2019| 久久久国产精品视频| 另类色图亚洲色图| 欧美激情va永久在线播放| 色噜噜狠狠狠综合曰曰曰| 97视频在线观看免费高清完整版在线观看| 日韩免费av片在线观看| 欧美成年人视频网站欧美| 国产成人精品av在线| 国产偷亚洲偷欧美偷精品| 日韩精品免费电影| 亚洲精品美女在线观看播放| 伊人久久久久久久久久久| 国产精品久久国产精品99gif| 成人欧美一区二区三区黑人| 岛国视频午夜一区免费在线观看| 亚洲欧美日韩在线一区| 国产一区二区三区视频在线观看| 久久综合九色九九| 欧美在线激情视频| 在线日韩欧美视频| 另类天堂视频在线观看| 欧美成人在线免费| 亚洲aⅴ男人的天堂在线观看| 91久久久在线| 91高清视频免费观看| 午夜精品理论片| 亚洲国产精品久久精品怡红院| 4p变态网欧美系列| 国产精品96久久久久久又黄又硬| 日韩av电影国产| 久久69精品久久久久久国产越南| 日韩电影大片中文字幕| 性欧美在线看片a免费观看| 九色精品免费永久在线| 国产精品电影一区| 国产有码在线一区二区视频|