分享自己用JS做的掃雷小遊戲_javascript技巧
引用了jQuery,节省了很多鼠标点击上的判断。界面显然都是照搬Windows的扫雷啦,详细的内容注释里都有,我就不啰嗦啦~
先上截图~
引用了jQuery,节省了很多鼠标点击上的判断
界面显然都是照搬Windows的扫雷啦
详细的内容注释里都有,我就不啰嗦啦~
JS部分
var mineArray, //地雷数组 lastNum, //剩余雷数 countNum, //未被揭开的方块数 inGame = 0, //游戏状态,0为结束,1为进行中,2为初始化完毕但未开始 startTime; //开始时间 //以下操作1表示揭开一个方块,操作2表示标记一个小旗,操作3表示标记一个问号,操作4表示若某个方块周围的地雷全都标记完,则将其周围剩下的方块挖开 $(function(){ $('#main').mouseup(function(e) { var clicked = $(e.target), id = clicked.attr('id'), cX = parseInt(id.substring(1, id.indexOf('-'))), //所点击方格的X坐标 cY = parseInt(id.substring(id.indexOf('-') + 1)); //所点击方格的Y坐标 if(inGame == 1) { if(e.which == 1) { if(clicked.hasClass('hidden') && !clicked.hasClass('flag')) { openBlock(cX,cY); //左键点击未揭开且未插旗方块即执行操作1 } else if(!clicked.hasClass('hidden')) { openNearBlock(cX,cY); //由于同时点击左右键实现起来比较麻烦,所以改成用点击左键实现操作4 } } else if(e.which == 3 && clicked.hasClass('hidden')) { //右键点击操作2,如果允许使用问号标记,则可执行操作3 if(clicked.hasClass('flag')) { clicked.removeClass('flag'); if($('#check').attr('checked')) clicked.addClass('check'); lastNum ++; countNum ++; } else if(clicked.hasClass('check')) { clicked.removeClass('check'); } else { clicked.addClass('flag'); lastNum --; countNum --; } $('#lastnum').text(lastNum); } if(lastNum == countNum) endGame(1); //因为最后剩下的方块均为雷时应直接结束游戏,因此设置为剩余雷数和未被揭开的方块数相等的时候结束游戏 } else if(inGame == 2) { if(e.which == 1) { //初始化完毕后只允许点击左键开始游戏 openBlock(cX,cY); inGame = 1; var now = new Date(); startTime = now.getTime(); timer(); } } }); $('#main').bind('contextmenu', function(){ return false; }); //阻止默认右击事件 }); //初始化 function init(x, y, mine) { countNum = x * y; inGame = 2; lastNum = mine; mineArray = new Array(y + 2); $.each(mineArray, function(key) { mineArray[key] = new Array(x + 2); }); for(var i = 1; i <= y; i ++) { for(var j = 1; j <= x; j ++) { mineArray[i][j] = 0; } } while(mine > 0) { //随机布雷,-1为有雷 var i = Math.ceil(Math.random() * y); var j = Math.ceil(Math.random() * x); if(mineArray[i][j] != -1) { mineArray[i][j] = -1; mine --; } } for(var i = 1; i <= y; i ++) { //遍历地雷数组,统计每个格子四周地雷的数量 for(var j = 1; j <= x; j ++) { if(mineArray[i][j] != -1) { if(i > 1 && j > 1 && mineArray[i - 1][j - 1] == -1) mineArray[i][j] ++; if(i > 1 && mineArray[i - 1][j] == -1) mineArray[i][j] ++; if(i > 1 && j < x && mineArray[i - 1][j + 1] == -1) mineArray[i][j] ++; if(j < x && mineArray[i][j + 1] == -1) mineArray[i][j] ++; if(i < y && j < x && mineArray[i + 1][j + 1] == -1) mineArray[i][j] ++; if(i < y && mineArray[i + 1][j] == -1) mineArray[i][j] ++; if(i < y && j > 1 && mineArray[i + 1][j - 1] == -1) mineArray[i][j] ++; if(j > 1 && mineArray[i][j - 1] == -1) mineArray[i][j] ++; } } } var block = ''; for(var i = 1, row = mineArray.length - 1; i < row; i ++) { for(var j = 1, col = mineArray[0].length - 1; j < col; j ++) { block += '<div id="b' + i + '-' + j + '" style="left:' + (j - 1) * 20 + 'px;top:' + (i - 1) * 20 + 'px;" class="hidden"></div>'; } } $('#main').html(block).width(x * 20 + 1).height(y * 20 + 1).show(); //绘图 $('#warning').html(''); $('#submenu').show(); $('#lastnum').text(lastNum); } //揭开方块 function openBlock(x, y) { var current = $('#b' + x + '-' + y); if(mineArray[x][y] == -1) { if(inGame == 1) { //触雷时如游戏进行中,则失败结束游戏 current.addClass('cbomb'); endGame(); } else if(inGame == 2) { //如游戏初始化后还未开始,则重新初始化地雷阵,再揭开此方块,以保证第一次点击不触雷 init(mineArray[0].length - 2, mineArray.length - 2, lastNum); openBlock(x, y); } else { //游戏结束时需揭开全部方块,标记地雷位置 if(!current.hasClass('flag')) current.addClass('bomb'); } } else if(mineArray[x][y] > 0) { if(current.hasClass('flag')) { //若在无雷的方块上标记了小旗,如果周围的广场执行操作4时波及到此方块,则触发失败结束游戏 current.addClass('wrong'); if(inGame) endGame(); } else { current.html(mineArray[x][y]).addClass('num' + mineArray[x][y]).removeClass('hidden'); //显示周边的地雷数量 if(current.hasClass('check')) current.removeClass('check'); if(inGame) countNum --; } } else { if(current.hasClass('flag')) { //同上 current.addClass('wrong'); if(inGame) endGame(); } else { current.removeClass('hidden'); if(current.hasClass('check')) current.removeClass('check'); if(inGame) { //点击到周边无雷的方块时,自动揭开周围方块 countNum --; var row = mineArray.length - 2, col = mineArray[0].length - 2; if(x > 1 && y > 1 && $('#b' + (x - 1) + '-' + (y - 1)).hasClass('hidden')) openBlock(x - 1, y - 1); if(x > 1 && $('#b' + (x - 1) + '-' + y).hasClass('hidden')) openBlock(x - 1, y); if(x > 1 && y < col && $('#b' + (x - 1) + '-' + (y + 1)).hasClass('hidden')) openBlock(x - 1, y + 1); if(y < col && $('#b' + x + '-' + (y + 1)).hasClass('hidden')) openBlock(x, y + 1); if(x < row && y < col && $('#b' + (x + 1) + '-' + (y + 1)).hasClass('hidden')) openBlock(x + 1, y + 1); if(x < row && $('#b' + (x + 1) + '-' + y).hasClass('hidden')) openBlock(x + 1, y); if(x < row && y > 1 && $('#b' + (x + 1) + '-' + (y - 1)).hasClass('hidden')) openBlock(x + 1, y - 1); if(y > 1 && $('#b' + x + '-' + (y - 1)).hasClass('hidden')) openBlock(x, y - 1); } } } } //揭开格子邻近确认无雷的方块 function openNearBlock(x, y) { var flagNum = 0, hiddenNum = 0; for(i = x - 1; i < x + 2; i ++) { for(j = y - 1; j < y + 2; j ++) { if(mineArray[i][j] != undefined) { if($('#b' + i + '-' + j).hasClass('flag')) flagNum ++; //统计方块周围的旗帜数和未揭开的方块数 if($('#b' + i + '-' + j).hasClass('hidden')) hiddenNum ++; } } } if(flagNum == mineArray[x][y] && hiddenNum > flagNum) { //旗帜数和雷数相等且有未揭开方块且未插旗的方块时,则揭开它 for(i = x - 1; i < x + 2; i ++) { for(j = y - 1; j < y + 2; j ++) { if(mineArray[i][j] >= 0 && $('#b' + i + '-' + j).hasClass('hidden')) openBlock(i, j); } } } } //计时 function timer(){ if(inGame == 1) { //只在游戏进行中计时 var now = new Date(), ms = now.getTime(); $('#time').text(Math.ceil((ms - startTime) / 1000)); if(inGame == 1) setTimeout(function() { timer(); }, 500); } else if(inGame == 2) { $('#time').text('0'); } } //结束游戏 function endGame(isWin) { inGame = 0; for(var i = 1, row = mineArray.length - 1; i < row; i ++) { for(var j = 1, col = mineArray[0].length - 1; j < col; j ++) { if(isWin) { if($('#b' + i + '-' + j).hasClass('hidden') && !$('#b' + i + '-' + j).hasClass('flag')) $('#b' + i + '-' + j).addClass('flag'); lastNum = 0; $('#lastnum').text(lastNum); } else { openBlock(i, j); } } } $('#warning').text(isWin ? 'You Win!' : 'You Lose!'); }
HTML部分
<div id="menu"> <a href="javascript:;" onclick="init(10,10,10);">初级</a> <a href="javascript:;" onclick="init(16,16,40);">中级</a> <a href="javascript:;" onclick="init(30,16,99);">高级</a> <input type="checkbox" id="check" /><label for="check">是否使用标记(?)</label> </div> <div id="submenu"> 剩余雷数:<span id="lastnum"></span> 时间:<span id="time"></span>秒 <span id="warning"></span> </div> <div id="main"></div>
CSS部分
body{background:#fff;font-size:14px;} #submenu{display:none;} #warning{color:#ff0000;} #main{background:#ddd;border:1px solid #888;display:none;position:relative;} #main div{border:1px solid #888;font-weight:bold;height:19px;height:21px\9;line-height:18px;cursor:default;position:absolute;text-align:center;width:19px;width:21px\9;} .hidden{background:url(mine.gif) 0 0;} .flag{background:url(mine.gif) -19px 0;} .check{background:url(mine.gif) -38px 0;} .bomb{background:url(mine.gif) -57px 0;} .cbomb{background:url(mine.gif) -57px 0 #ff0000;} .wrong{background:url(mine.gif) -76px 0;} .num1{color:#0000ff;} .num2{color:#008000;} .num3{color:#ff0000;} .num4{color:#000080;} .num5{color:#800000;} .num6{color:#008080;} .num7{color:#000000;} .num8{color:#808080;}
以上所述是小编给大家分享自己用JS做的扫雷小游戏,希望对大家有所帮助。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

JavaScript字符串替換方法詳解及常見問題解答 本文將探討兩種在JavaScript中替換字符串字符的方法:在JavaScript代碼內部替換和在網頁HTML內部替換。 在JavaScript代碼內部替換字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 該方法僅替換第一個匹配項。要替換所有匹配項,需使用正則表達式並添加全局標誌g: str = str.replace(/fi

本文討論了在瀏覽器中優化JavaScript性能的策略,重點是減少執行時間並最大程度地減少對頁面負載速度的影響。

本文討論了使用瀏覽器開發人員工具的有效JavaScript調試,專注於設置斷點,使用控制台和分析性能。

將矩陣電影特效帶入你的網頁!這是一個基於著名電影《黑客帝國》的酷炫jQuery插件。該插件模擬了電影中經典的綠色字符特效,只需選擇一張圖片,插件就會將其轉換為充滿數字字符的矩陣風格畫面。快來試試吧,非常有趣! 工作原理 插件將圖片加載到畫布上,讀取像素和顏色值: data = ctx.getImageData(x, y, settings.grainSize, settings.grainSize).data 插件巧妙地讀取圖片的矩形區域,並利用jQuery計算每個區域的平均顏色。然後,使用

本文將引導您使用jQuery庫創建一個簡單的圖片輪播。我們將使用bxSlider庫,它基於jQuery構建,並提供許多配置選項來設置輪播。 如今,圖片輪播已成為網站必備功能——一圖胜千言! 決定使用圖片輪播後,下一個問題是如何創建它。首先,您需要收集高質量、高分辨率的圖片。 接下來,您需要使用HTML和一些JavaScript代碼來創建圖片輪播。網絡上有很多庫可以幫助您以不同的方式創建輪播。我們將使用開源的bxSlider庫。 bxSlider庫支持響應式設計,因此使用此庫構建的輪播可以適應任何

數據集對於構建API模型和各種業務流程至關重要。這就是為什麼導入和導出CSV是經常需要的功能。在本教程中,您將學習如何在Angular中下載和導入CSV文件

核心要点 利用 JavaScript 增强结构化标记可以显著提升网页内容的可访问性和可维护性,同时减小文件大小。 JavaScript 可有效地用于为 HTML 元素动态添加功能,例如使用 cite 属性自动在块引用中插入引用链接。 将 JavaScript 与结构化标记集成,可以创建动态用户界面,例如无需页面刷新的选项卡面板。 确保 JavaScript 增强功能不会妨碍网页的基本功能至关重要;即使禁用 JavaScript,页面也应保持功能正常。 可以使用高级 JavaScript 技术(
