日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

网页扫雷(简易版)(一)

發布時間:2023/12/10 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 网页扫雷(简易版)(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

說明:主要是做做玩玩的,先把主要功能實現。
掃雷主要分為這幾塊內容:

  • 生成一張N x N地圖
  • 在地圖上隨機分布地雷
  • 點擊地圖上每個格子事件
    - 點擊到雷時,Game Over;
    - 點記到雷旁邊時,顯示周圍雷的個數;
    - 點擊到空白時,顯示大片安全區域;

頁面的基礎結構

<!DOCTYPE html> <html> <head><title></title> </head> <body><div class="lei"><ul id="map"></ul></div> </body> </html> 這里有部分DOM元素操作,使用jquery庫。 雷圖片:ball.png,可隨便找一張。

生成一張N x N地圖

掃雷界面主要通過ul、li來實現。

<ul><li></li><li></li><li></li> </ul>

NxN的地圖,通過兩次for循環生成地圖數組,默認值為0;

for (var i = 0; i < wi; i++) {maparr[i] = [];for (var j = 0; j < he; j++) {maparr[i][j]=0;} }

在地圖上隨機分布地雷

for (var i = 0; i < bomb; i++) {var r = getRandomBetween(0,wi);var c = getRandomBetween(0,he);maparr[r][c]=-1; }

獲取隨機數,設置r行c列處為雷。然后渲染dom元素

setHtmlDom:function(arr) {var html="";for (var i = 0; i < arr.length; i++) {for (var j = 0; j < arr[i].length; j++) {html+='<li class="mli" style="background-color:wheat" ai="'+i+'" aj="'+j+'" val="'+arr[i][j]+'" onclick="game.clkevent('+arr[i][j]+',this)"></li>';}}$("#map").html(html); },

根據雷的分布,獲取每個方格中應填入的數值,顯示周圍的地雷數。

for (var i = 0; i < maparr.length; i++) {for (var j = 0; j < maparr[i].length; j++) {var a = maparr[i][j]if(a!==-1){(i-1>=0)&&(j-1>=0)&&(maparr[i-1][j-1]===-1)&&(a+=1);(i-1>=0)&&(maparr[i-1][j]===-1)&&(a+=1);(i-1>=0)&&(j+1<=he-1)&&(maparr[i-1][j+1]===-1)&&(a+=1);(j+1<=he-1)&&(maparr[i][j+1]===-1)&&(a+=1);(j-1>=0)&&(maparr[i][j-1]===-1)&&(a+=1);(i+1<=wi-1)&&(j-1>=0)&&(maparr[i+1][j-1]===-1)&&(a+=1);(i+1<=wi-1)&&(maparr[i+1][j]===-1)&&(a+=1);(i+1<=wi-1)&&(j+1<=he-1)&&(maparr[i+1][j+1]===-1)&&(a+=1);maparr[i][j]=a;}} } return maparr;

點擊地圖上每個格子事件

html+='<li class="mli" style="background-color:wheat" ai="'+i+'" aj="'+j+'" val="'+arr[i][j]+'" onclick="game.clkevent('+arr[i][j]+',this)"></li>';
點擊到雷時,游戲結束
布雷的方格處,arr[i][j]為-1, clkevent:function(s,__this) {var _this = this;__this.style.backgroundColor="#ccc";_this.farr = [];if(s===-1){//點擊到雷時_this.setHtmlDom2();$("#result").html("you lose!")} },
點擊到空白時,顯示大片安全區域
這種情況下,需要對周圍8個方格繼續檢測,原理相同; 檢測過的方格不應重復檢測。 if(s===0){//點擊到的方格周圍沒有雷var i = $(__this).attr("ai");var j = $(__this).attr("aj");_this.check([i,j]); }

這邊比較冗余,分8種進行check;

check:function(arr) {var _this = this;var index = isInArray(arr,_this.farr);if(index===-1){_this.farr.push(arr);var i = parseInt(arr[0]);var j = parseInt(arr[1]);var len = _this.map[0].length;var indexli = i*len+j;var li = $("#map li")[indexli];$("#map").find(li)[0].style.backgroundColor="#ccc";if((i-1>=0)&&(j-1>=0)&&(_this.map[i-1][j-1]===0)){var index = isInArray([i-1,j-1],_this.farr);if(index===-1){_this.check([i-1,j-1]);}}else{(i-1>=0)&&(j-1>=0)&&_this.elsef(i-1,j-1);}if((i-1>=0)&&(_this.map[i-1][j]===0)){var index = isInArray([i-1,j],_this.farr);if(index===-1){_this.check([i-1,j]);}}else{(i-1>=0)&&_this.elsef(i-1,j);}if((i-1>=0)&&(j+1<=cols-1)&&(_this.map[i-1][j+1]===0)){var index = isInArray([i-1,j+1],_this.farr);if(index===-1){_this.check([i-1,j+1]);}}else{(i-1>=0)&&(j+1<=cols-1)&&_this.elsef(i-1,j+1);}if((j+1<=cols-1)&&(_this.map[i][j+1]===0)){var index = isInArray([i,j+1],_this.farr);if(index===-1){_this.check([i,j+1]);}}else{(j+1<=cols-1)&&_this.elsef(i,j+1);}if((j-1>=0)&&(_this.map[i][j-1]===0)){var index = isInArray([i,j-1],_this.farr);if(index===-1){_this.check([i,j-1]);}}else{(j-1>=0)&&_this.elsef(i,j-1);}if((i+1<=rows-1)&&(j-1>=0)&&(_this.map[i+1][j-1]===0)){var index = isInArray([i+1,j-1],_this.farr);if(index===-1){_this.check([i+1,j-1]);}}else{(i+1<=rows-1)&&(j-1>=0)&&_this.elsef(i+1,j-1);}if((i+1<=rows-1)&&(_this.map[i+1][j]===0)){var index = isInArray([i+1,j],_this.farr);if(index===-1){_this.check([i+1,j]);}}else{(i+1<=rows-1)&&_this.elsef(i+1,j);}if((i+1<=rows-1)&&(j+1<=cols-1)&&(_this.map[i+1][j+1]===0)){var index = isInArray([i+1,j+1],_this.farr);if(index===-1){_this.check([i+1,j+1]);}}else{(i+1<=rows-1)&&(j+1<=cols-1)&&_this.elsef(i+1,j+1);}} },
點記到雷旁邊時,顯示周圍雷的個數
else{//點擊的到的方格周圍有雷,則直接顯示數值__this.innerText = s; }

這上面是主要代碼,游戲非常簡易,沒有實現右擊和鼠標左右鍵同時點擊的檢測,只是實現了掃雷最基本的功能。以后或許會優化。下面是整個代碼。

<!DOCTYPE html> <html> <head><meta charset="utf-8"><title></title><style type="text/css">ul{margin: 0;padding: 0;list-style: none;}ul li{background-color:#ccc;width:30px;height: 30px;float: left;border:1px solid #efd;}#map{width: 320px;}#ctrl{text-align: center;}#ctrl div{margin: 12px 0 0 0;}.sel{width: 25%;border-radius: 25px;height: 25px;box-shadow:2px 2px 5px #8B4789}</style><script type="text/javascript" src="./jquery.min.js"></script> </head> <body><div class="lei"><ul id="map"></ul></div><div id="ctrl"><div><label id="nums">12</label></div><div><select class="sel" id="range"><option value="25">25</option><option value="20">20</option><option value="15">15</option></select></div> <div><select class="sel" id="diff"><option value="0.9">very hard</option><option value="0.6">hard</option><option value="0.3">commom</option><option value="0.1">easy</option></select></div><div><button id="start" onclick="game.init()">開始</button></div> <div><label id="result" style="color:red"></label></div> </div><script type="text/javascript">var game = {map:[],warr:[],farr:[],rows:0,cols:0,init:function() {var _this= this;rows = cols = $("#range").val();var width = rows*32+"px";$("#map").css({width:width})_this.map = _this.getRandomArray(rows,cols);_this.setHtmlDom(_this.map);},getRandomArray:function(wi,he) {var diff = $("#diff").val();var bomb = parseInt(wi*he*diff);$("#nums").html(bomb);if(bomb===0){bomb=2;}var maparr=[];for (var i = 0; i < wi; i++) {maparr[i] = [];for (var j = 0; j < he; j++) {maparr[i][j]=0;}}for (var i = 0; i < bomb; i++) {var r = getRandomBetween(0,wi);var c = getRandomBetween(0,he);maparr[r][c]=-1;}for (var i = 0; i < maparr.length; i++) {for (var j = 0; j < maparr[i].length; j++) {var a = maparr[i][j]if(a!==-1){(i-1>=0)&&(j-1>=0)&&(maparr[i-1][j-1]===-1)&&(a+=1);(i-1>=0)&&(maparr[i-1][j]===-1)&&(a+=1);(i-1>=0)&&(j+1<=he-1)&&(maparr[i-1][j+1]===-1)&&(a+=1);(j+1<=he-1)&&(maparr[i][j+1]===-1)&&(a+=1);(j-1>=0)&&(maparr[i][j-1]===-1)&&(a+=1);(i+1<=wi-1)&&(j-1>=0)&&(maparr[i+1][j-1]===-1)&&(a+=1);(i+1<=wi-1)&&(maparr[i+1][j]===-1)&&(a+=1);(i+1<=wi-1)&&(j+1<=he-1)&&(maparr[i+1][j+1]===-1)&&(a+=1);maparr[i][j]=a;}}}return maparr;},setHtmlDom:function(arr) {var html="";for (var i = 0; i < arr.length; i++) {for (var j = 0; j < arr[i].length; j++) {html+='<li class="mli" style="background-color:wheat" ai="'+i+'" aj="'+j+'" val="'+arr[i][j]+'" onclick="game.clkevent('+arr[i][j]+',this)"></li>';}}$("#map").html(html);},setHtmlDom2:function() {var arr = this.map;var html="";for (var i = 0; i < arr.length; i++) {for (var j = 0; j < arr[i].length; j++) {if(arr[i][j]===-1){html+='<li class="mli" style="background:#eac0ce url(./ball.png);background-size:cover;" val="'+arr[i][j]+'" onclick="game.clkevent('+arr[i][j]+',this)"></li>';}else if(arr[i][j]===0){html+='<li class="mli" style="background-color:efe" val="'+arr[i][j]+'" onclick="game.clkevent('+arr[i][j]+',this)"></li>';}else{html+='<li class="mli" style="background-color:efe" val="'+arr[i][j]+'" onclick="game.clkevent('+arr[i][j]+',this)">'+arr[i][j]+'</li>';}}}$("#map").html(html);},clkevent:function(s,__this) {var _this = this;__this.style.backgroundColor="#ccc";_this.farr = [];if(s===-1){_this.setHtmlDom2();$("#result").html("you lose!")}if(s===0){var i = $(__this).attr("ai");var j = $(__this).attr("aj");_this.check([i,j]);}else{__this.innerText = s;}},check:function(arr) {var _this = this;var index = isInArray(arr,_this.farr);if(index===-1){_this.farr.push(arr);var i = parseInt(arr[0]);var j = parseInt(arr[1]);var len = _this.map[0].length;var indexli = i*len+j;var li = $("#map li")[indexli];$("#map").find(li)[0].style.backgroundColor="#ccc";if((i-1>=0)&&(j-1>=0)&&(_this.map[i-1][j-1]===0)){var index = isInArray([i-1,j-1],_this.farr);if(index===-1){_this.check([i-1,j-1]);}}else{(i-1>=0)&&(j-1>=0)&&_this.elsef(i-1,j-1);}if((i-1>=0)&&(_this.map[i-1][j]===0)){var index = isInArray([i-1,j],_this.farr);if(index===-1){_this.check([i-1,j]);}}else{(i-1>=0)&&_this.elsef(i-1,j);}if((i-1>=0)&&(j+1<=cols-1)&&(_this.map[i-1][j+1]===0)){var index = isInArray([i-1,j+1],_this.farr);if(index===-1){_this.check([i-1,j+1]);}}else{(i-1>=0)&&(j+1<=cols-1)&&_this.elsef(i-1,j+1);}if((j+1<=cols-1)&&(_this.map[i][j+1]===0)){var index = isInArray([i,j+1],_this.farr);if(index===-1){_this.check([i,j+1]);}}else{(j+1<=cols-1)&&_this.elsef(i,j+1);}if((j-1>=0)&&(_this.map[i][j-1]===0)){var index = isInArray([i,j-1],_this.farr);if(index===-1){_this.check([i,j-1]);}}else{(j-1>=0)&&_this.elsef(i,j-1);}if((i+1<=rows-1)&&(j-1>=0)&&(_this.map[i+1][j-1]===0)){var index = isInArray([i+1,j-1],_this.farr);if(index===-1){_this.check([i+1,j-1]);}}else{(i+1<=rows-1)&&(j-1>=0)&&_this.elsef(i+1,j-1);}if((i+1<=rows-1)&&(_this.map[i+1][j]===0)){var index = isInArray([i+1,j],_this.farr);if(index===-1){_this.check([i+1,j]);}}else{(i+1<=rows-1)&&_this.elsef(i+1,j);}if((i+1<=rows-1)&&(j+1<=cols-1)&&(_this.map[i+1][j+1]===0)){var index = isInArray([i+1,j+1],_this.farr);if(index===-1){_this.check([i+1,j+1]);}}else{(i+1<=rows-1)&&(j+1<=cols-1)&&_this.elsef(i+1,j+1);}}},elsef:function(i,j) {var _this = this;var len = _this.map[0].length;var indexli = i*len+j;var li =$("#map li")[indexli];var ad = $("#map").find(li)[0].attributes["val"];$("#map").find(li)[0].style.backgroundColor="#ccc";$("#map").find(li)[0].innerText = $("#map").find(li)[0].attributes["val"].textContent;}}function getRandomBetween(A,B) {return Math.floor(Math.random()*(B-A)+A);}function isInArray(arr,arrs) {if(arrs.length===0){return -1;}for (var i = 0; i < arrs.length; i++) {if(arrs[i][0]==arr[0]&&arrs[i][1]==arr[1]){return 2;}}return -1}game.init();</script> </body> </html>

總結

以上是生活随笔為你收集整理的网页扫雷(简易版)(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。