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 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











JavaScript 문자열 교체 방법 및 FAQ에 대한 자세한 설명 이 기사는 JavaScript에서 문자열 문자를 대체하는 두 가지 방법 인 내부 JavaScript 코드와 웹 페이지의 내부 HTML을 탐색합니다. JavaScript 코드 내부의 문자열을 교체하십시오 가장 직접적인 방법은 대체 () 메소드를 사용하는 것입니다. str = str.replace ( "find", "replace"); 이 메소드는 첫 번째 일치 만 대체합니다. 모든 경기를 교체하려면 정규 표현식을 사용하고 전역 플래그 g를 추가하십시오. str = str.replace (/fi

그래서 여기 당신은 Ajax라는이 일에 대해 배울 준비가되어 있습니다. 그러나 정확히 무엇입니까? Ajax라는 용어는 역동적이고 대화식 웹 컨텐츠를 만드는 데 사용되는 느슨한 기술 그룹을 나타냅니다. 원래 Jesse J에 의해 만들어진 Ajax라는 용어

기사는 JavaScript 라이브러리 작성, 게시 및 유지 관리, 계획, 개발, 테스트, 문서 및 홍보 전략에 중점을 둡니다.

이 기사는 브라우저에서 JavaScript 성능을 최적화하기위한 전략에 대해 설명하고 실행 시간을 줄이고 페이지로드 속도에 미치는 영향을 최소화하는 데 중점을 둡니다.

매트릭스 영화 효과를 페이지에 가져 오십시오! 이것은 유명한 영화 "The Matrix"를 기반으로 한 멋진 jQuery 플러그인입니다. 플러그인은 영화에서 클래식 그린 캐릭터 효과를 시뮬레이션하고 사진을 선택하면 플러그인이 숫자로 채워진 매트릭스 스타일 사진으로 변환합니다. 와서 시도해보세요. 매우 흥미 롭습니다! 작동 방식 플러그인은 이미지를 캔버스에로드하고 픽셀 및 색상 값을 읽습니다. data = ctx.getImageData (x, y, settings.grainsize, settings.grainsize) .data 플러그인은 그림의 직사각형 영역을 영리하게 읽고 jQuery를 사용하여 각 영역의 평균 색상을 계산합니다. 그런 다음 사용하십시오

이 기사는 브라우저 개발자 도구를 사용하여 효과적인 JavaScript 디버깅, 중단 점 설정, 콘솔 사용 및 성능 분석에 중점을 둡니다.

이 기사에서는 jQuery 라이브러리를 사용하여 간단한 사진 회전 목마를 만들도록 안내합니다. jQuery를 기반으로 구축 된 BXSLIDER 라이브러리를 사용하고 회전 목마를 설정하기위한 많은 구성 옵션을 제공합니다. 요즘 그림 회전 목마는 웹 사이트에서 필수 기능이되었습니다. 한 사진은 천 단어보다 낫습니다! 그림 회전 목마를 사용하기로 결정한 후 다음 질문은 그것을 만드는 방법입니다. 먼저 고품질 고해상도 사진을 수집해야합니다. 다음으로 HTML과 일부 JavaScript 코드를 사용하여 사진 회전 목마를 만들어야합니다. 웹에는 다양한 방식으로 회전 목마를 만드는 데 도움이되는 라이브러리가 많이 있습니다. 오픈 소스 BXSLIDER 라이브러리를 사용할 것입니다. BXSLIDER 라이브러리는 반응 형 디자인을 지원 하므로이 라이브러리로 제작 된 회전 목마는

데이터 세트는 API 모델 및 다양한 비즈니스 프로세스를 구축하는 데 매우 필수적입니다. 그렇기 때문에 CSV 가져 오기 및 내보내기가 자주 필요한 기능인 이유입니다.이 자습서에서는 각도 내에서 CSV 파일을 다운로드하고 가져 오는 방법을 배웁니다.
