网页扫雷(简易版)(一)
生活随笔
收集整理的這篇文章主要介紹了
网页扫雷(简易版)(一)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
說(shuō)明:主要是做做玩玩的,先把主要功能實(shí)現(xiàn)。
掃雷主要分為這幾塊內(nèi)容:
- 生成一張N x N地圖
- 在地圖上隨機(jī)分布地雷
- 點(diǎn)擊地圖上每個(gè)格子事件
- 點(diǎn)擊到雷時(shí),Game Over;
- 點(diǎn)記到雷旁邊時(shí),顯示周圍雷的個(gè)數(shù);
- 點(diǎn)擊到空白時(shí),顯示大片安全區(qū)域;
頁(yè)面的基礎(chǔ)結(jié)構(gòu)
<!DOCTYPE html> <html> <head><title></title> </head> <body><div class="lei"><ul id="map"></ul></div> </body> </html> 這里有部分DOM元素操作,使用jquery庫(kù)。 雷圖片:ball.png,可隨便找一張。生成一張N x N地圖
掃雷界面主要通過(guò)ul、li來(lái)實(shí)現(xiàn)。
<ul><li></li><li></li><li></li> </ul>NxN的地圖,通過(guò)兩次for循環(huán)生成地圖數(shù)組,默認(rèn)值為0;
for (var i = 0; i < wi; i++) {maparr[i] = [];for (var j = 0; j < he; j++) {maparr[i][j]=0;} }在地圖上隨機(jī)分布地雷
for (var i = 0; i < bomb; i++) {var r = getRandomBetween(0,wi);var c = getRandomBetween(0,he);maparr[r][c]=-1; }獲取隨機(jī)數(shù),設(shè)置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); },根據(jù)雷的分布,獲取每個(gè)方格中應(yīng)填入的數(shù)值,顯示周圍的地雷數(shù)。
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;點(diǎn)擊地圖上每個(gè)格子事件
html+='<li class="mli" style="background-color:wheat" ai="'+i+'" aj="'+j+'" val="'+arr[i][j]+'" onclick="game.clkevent('+arr[i][j]+',this)"></li>';點(diǎn)擊到雷時(shí),游戲結(jié)束
布雷的方格處,arr[i][j]為-1, clkevent:function(s,__this) {var _this = this;__this.style.backgroundColor="#ccc";_this.farr = [];if(s===-1){//點(diǎn)擊到雷時(shí)_this.setHtmlDom2();$("#result").html("you lose!")} },點(diǎn)擊到空白時(shí),顯示大片安全區(qū)域
這種情況下,需要對(duì)周圍8個(gè)方格繼續(xù)檢測(cè),原理相同; 檢測(cè)過(guò)的方格不應(yīng)重復(fù)檢測(cè)。 if(s===0){//點(diǎn)擊到的方格周圍沒有雷var i = $(__this).attr("ai");var j = $(__this).attr("aj");_this.check([i,j]); }這邊比較冗余,分8種進(jìn)行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);}} },點(diǎn)記到雷旁邊時(shí),顯示周圍雷的個(gè)數(shù)
else{//點(diǎn)擊的到的方格周圍有雷,則直接顯示數(shù)值__this.innerText = s; }這上面是主要代碼,游戲非常簡(jiǎn)易,沒有實(shí)現(xiàn)右擊和鼠標(biāo)左右鍵同時(shí)點(diǎn)擊的檢測(cè),只是實(shí)現(xiàn)了掃雷最基本的功能。以后或許會(huì)優(yōu)化。下面是整個(gè)代碼。
<!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>總結(jié)
以上是生活随笔為你收集整理的网页扫雷(简易版)(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: (剑指Offer)面试题5:从尾到头打印
- 下一篇: 如何解决Filezilla 与虚拟机连接