From 1c3434d6d1c510fb40ed66644ec01fed2d6a9f88 Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Sun, 5 Mar 2017 11:24:38 +0800 Subject: A little code refactoring and minor bug fixes. --- index.html | 16 ++- minesweeper.js | 326 ++++++++++++++++++++++++++++----------------------------- 2 files changed, 174 insertions(+), 168 deletions(-) diff --git a/index.html b/index.html index 3c814ec..3b1decf 100644 --- a/index.html +++ b/index.html @@ -15,6 +15,12 @@ div#OptionsContainer text-align:center; margin:auto; } +select +{ + background-color:#CCC; + border:1px #999 solid; + padding:0.5em 0.2em; +} button { border:none; @@ -127,23 +133,23 @@ document.getElementsByTagName("head")[0].appendChild(link);
  • Minesweeper

  • Difficulty: -
  • Multimine: - +
  • Effects: - +
  • Sounds: - +
  • Help
  • -
  • version: 0.8.7+b1
  • +
  • version: 0.8.7+b3
  • diff --git a/minesweeper.js b/minesweeper.js index 99730fe..b7984fa 100644 --- a/minesweeper.js +++ b/minesweeper.js @@ -1,9 +1,7 @@ //Chris Xiong 2017 //The MIT License var dimpx,dimx,dimy,cc,firstclick; -var boardn=null; -var boards=null; -var boarde=null; +var cell=null; var ismobile,effects=true,multimine=false,sfxe=true; var dead,st,solved,animating; var dx=[-1,-1,-1, 0, 0, 1, 1, 1]; @@ -11,32 +9,44 @@ var dy=[-1, 0, 1,-1, 1,-1, 0, 1]; var classes=["one","two","three","four","five","six","seven","eight"]; var queue=[],newqueue=[],flags=[]; var mines=[],detx,dety,cmines=[],sfx=[]; +var ui={}; function randomInt(min,max) { seed*=214013;seed+=2531011;seed&=0xffffffff; return min+(seed^seed>>15)%(max-min+1); } +function setupui() +{ + ui.pbefx=document.getElementById('efx'); + ui.pbsfx=document.getElementById('sfx'); + ui.pbmul=document.getElementById('multim'); + ui.cbbsz=document.getElementById('bsize'); + ui.lbres=document.getElementById('result'); + ui.pbstt=document.getElementById('st'); + ui.lbmns=document.getElementById('mines'); + ui.cwctn=document.getElementById('containerDiv'); +} function efxtoggle() { effects=!effects; - document.getElementById('efx').classList.toggle('off'); - document.getElementById('efx').innerHTML=effects?"On":"Off"; + ui.pbefx.classList.toggle('off'); + ui.pbefx.innerHTML=effects?"On":"Off"; for(var i=0;i40)||(custy&&custy>40)||(ccc&&custx&&custy&&(ccc>custx*custy-9))) {console.log("Are you insane?");return;} - firstclick=true;dead=false;solved=false;for(var i=0;i<7;++i)flags[i]=cmines[i]=0; - document.getElementById("result").style.opacity="0"; - document.getElementById("result").style.zIndex="-999";animating=false; - for(var nd=document.getElementById("containerDiv");nd.hasChildNodes();nd.removeChild(nd.lastChild)); - if(document.getElementById("bsize").value=="1") - {dimx=9;dimy=9;cc=10;} - if(document.getElementById("bsize").value=="2") - {dimx=16;dimy=16;cc=40;} - if(document.getElementById("bsize").value=="3") - {dimx=16;dimy=30;cc=99;} + firstclick=true;dead=solved=false;for(var i=0;i<7;++i)flags[i]=cmines[i]=0; + ui.lbres.style.opacity="0";ui.lbres.style.zIndex="-999";animating=false; + for(;ui.cwctn.hasChildNodes();ui.cwctn.removeChild(ui.cwctn.lastChild)); + switch(ui.cbbsz.value) + { + case "1":dimx=9;dimy=9;cc=10;break; + case "2":dimx=16;dimy=16;cc=40;break; + case "3":dimx=16;dimy=30;cc=99;break; + } if(custx&&custy&&ccc){dimx=custx;dimy=custy;cc=ccc;} if((window.innerWidth>window.innerHeight)^(dimxwindow.innerHeight*0.8) { dimpx=window.innerHeight*(ismobile?0.9:0.8); - document.getElementById("containerDiv").style.width=dimpx/dimx*dimy+"px"; - document.getElementById("containerDiv").style.height=dimpx+"px"; + ui.cwctn.style.width=dimpx/dimx*dimy+"px"; + ui.cwctn.style.height=dimpx+"px"; } else { dimpx=window.innerWidth*(ismobile?0.9:0.8); - document.getElementById("containerDiv").style.width=dimpx+"px"; - document.getElementById("containerDiv").style.height=dimpx/dimy*dimx+"px"; + ui.cwctn.style.width=dimpx+"px"; + ui.cwctn.style.height=dimpx/dimy*dimx+"px"; } - boards=new Array(dimx+4);for(var i=0;i32)--boardn[x][y]; - if(rnd>57)--boardn[x][y]; - if(rnd>77)--boardn[x][y]; - if(rnd>87)--boardn[x][y]; - if(rnd>95)--boardn[x][y]; + if(rnd>32)--cell[x][y].n; + if(rnd>57)--cell[x][y].n; + if(rnd>77)--cell[x][y].n; + if(rnd>87)--cell[x][y].n; + if(rnd>95)--cell[x][y].n; } - ++cmines[-boardn[x][y]]; + ++cmines[-cell[x][y].n]; for(var j=0;j<8;++j) { var cx=x+dx[j],cy=y+dy[j]; - if(cx>=0&&cx=0&&cy=0) - boardn[cx][cy]-=boardn[x][y]; + if(cx>=0&&cx=0&&cy=0) + cell[cx][cy].n-=cell[x][y].n; } }st=new Date();updateflags(); } @@ -179,15 +182,15 @@ function mclick(e) if(ismobile) { if(multimine) - {if(boards[x][y]>=0)flag(x,y);} - else{if(boards[x][y]==1)deflag(x,y);else if(boards[x][y]==0)flag(x,y);} - if(boards[x][y]==-1)autodig(x,y); + {if(cell[x][y].s>=0)flag(x,y);} + else{if(cell[x][y].s==1)deflag(x,y);else if(cell[x][y].s==0)flag(x,y);} + if(cell[x][y].s==-1)autodig(x,y); } else { - if(boards[x][y]==0)dig(x,y); - else if(boards[x][y]==-1)autodig(x,y); - else if(multimine&&boards[x][y]>0)deflag(x,y); + if(cell[x][y].s==0)dig(x,y); + else if(cell[x][y].s==-1)autodig(x,y); + else if(multimine&&cell[x][y].s>0)deflag(x,y); } } function rclick(e) @@ -197,21 +200,21 @@ function rclick(e) var x=this.x,y=this.y; if(ismobile) { - if(boards[x][y]==0)dig(x,y); - else if(multimine&&boards[x][y]>0)deflag(x,y); + if(cell[x][y].s==0)dig(x,y); + else if(multimine&&cell[x][y].s>0)deflag(x,y); } else { if(multimine) - {if(boards[x][y]>=0)flag(x,y);} - else{if(boards[x][y]==1)deflag(x,y);else if(boards[x][y]==0)flag(x,y);} + {if(cell[x][y].s>=0)flag(x,y);} + else{if(cell[x][y].s==1)deflag(x,y);else if(cell[x][y].s==0)flag(x,y);} } } function checksolved() { for(var i=0;i=0&&boards[i][j]!=-1)return false; + if(cell[i][j].n>=0&&cell[i][j].s!=-1)return false; return true; } var pair=function(_x,_y){this.x=_x;this.y=_y;} @@ -219,12 +222,6 @@ pair.prototype.toString=function() { return this.x+","+this.y; } -function dfs(x,y) -{ - if(boards[x][y]!=0)return; - newqueue.push(new pair(x,y)); - boards[x][y]=-1;animating=true;bfs(1); -} function bfs(s) { q=newqueue.slice(0);newqueue=[]; @@ -232,22 +229,22 @@ function bfs(s) for(var i=0;i0) + if(cell[x][y].n<0){die(x,y);return;} + if(cell[x][y].n>0) { - boarde[x][y].span.innerHTML=boardn[x][y]; - boarde[x][y].span.classList.add(classes[(boardn[x][y]-1)%8]); + cell[x][y].span.innerHTML=cell[x][y].n; + cell[x][y].span.classList.add(classes[(cell[x][y].n-1)%8]); } - boarde[x][y].overlay.style.opacity="1"; - boarde[x][y].overlay.style.transform="scale(1,1)"; - boarde[x][y].overlay.classList.add("dug"); - if(boardn[x][y]==0) + cell[x][y].overlay.style.opacity="1"; + cell[x][y].overlay.style.transform="scale(1,1)"; + cell[x][y].overlay.classList.add("dug"); + if(cell[x][y].n==0) { for(var j=0;j<8;++j) { var c=new pair(x+dx[j],y+dy[j]); - if(c.x>=0&&c.x=0&&c.y=0&&c.x=0&&c.y=0&&cx=0&&cy<=dimy&&boards[cx][cy]>0)c+=boards[cx][cy]; + if(cx>=0&&cx=0&&cy0)c+=cell[cx][cy].s; } - if(c==boardn[x][y]) + if(c==cell[x][y].n) { newqueue=[]; for(var i=0;i<8;++i) { var cx=x+dx[i],cy=y+dy[i]; - if(cx>=0&&cx=0&&cy<=dimy) + if(cx>=0&&cx=0&&cy6)boards[x][y]=6;boarde[x][y].span.innerHTML=boards[x][y];} - else{if(boards[x][y]>1)boards[x][y]=1;boarde[x][y].span.innerHTML="X";} - ++flags[boards[x][y]]; - boarde[x][y].overlay.classList.add('flag'); - boarde[x][y].overlay.style.opacity="1"; - boarde[x][y].overlay.style.transform="scale(1,1)"; + --flags[cell[x][y].s];cell[x][y].s++; + if(multimine){if(cell[x][y].s>6)cell[x][y].s=6;cell[x][y].span.innerHTML=cell[x][y].s;} + else{if(cell[x][y].s>1)cell[x][y].s=1;cell[x][y].span.innerHTML="X";} + ++flags[cell[x][y].s]; + cell[x][y].overlay.classList.add('flag'); + cell[x][y].overlay.style.opacity="1"; + cell[x][y].overlay.style.transform="scale(1,1)"; updateflags(); } function deflag(x,y) { - --flags[boards[x][y]];--boards[x][y];++flags[boards[x][y]]; - boarde[x][y].span.innerHTML=boards[x][y]; - if(boards[x][y]==0) + --flags[cell[x][y].s];--cell[x][y].s;++flags[cell[x][y].s]; + cell[x][y].span.innerHTML=cell[x][y].s; + if(cell[x][y].s==0) { - boarde[x][y].span.innerHTML=""; - boarde[x][y].classList.remove('flag'); - boarde[x][y].classList.add('normal'); - boarde[x][y].overlay.style.opacity="0"; - boarde[x][y].overlay.style.transform="scale(2,2)"; + cell[x][y].span.innerHTML=""; + cell[x][y].classList.remove('flag'); + cell[x][y].classList.add('normal'); + cell[x][y].overlay.style.opacity="0"; + cell[x][y].overlay.style.transform="scale(2,2)"; } updateflags(); } @@ -325,10 +326,10 @@ function updateflags() { var s=""; for(var i=1;i<7;++i)s=s+" x"+i+" "+flags[i]+"/"+cmines[i]; - document.getElementById("mines").innerHTML=s; + ui.lbmns.innerHTML=s; } else - {document.getElementById("mines").innerHTML=flags[1]+"/"+cmines[1];} + ui.lbmns.innerHTML=flags[1]+"/"+cmines[1]; } function cmp(x,y) { @@ -336,25 +337,25 @@ function cmp(x,y) } function die(x,y) { - if(dead||boardn[x][y]>=0)return; + if(dead||cell[x][y].n>=0)return; dead=true;detx=x;dety=y;mines.sort(cmp); for(var i=0;i0&&boards[i][j]!=-boardn[i][j]&&(i!=x||j!=y)) + if(cell[i][j].s>0&&cell[i][j].s!=-cell[i][j].n&&(i!=x||j!=y)) { - boarde[i][j].overlay.classList.remove('flag'); - boarde[i][j].overlay.classList.add('flagw'); - boarde[i][j].span.innerHTML=""+boarde[i][j].span.innerHTML+""; + cell[i][j].overlay.classList.remove('flag'); + cell[i][j].overlay.classList.add('flagw'); + cell[i][j].span.innerHTML=""+cell[i][j].span.innerHTML+""; } - boarde[x][y].overlay.classList.add('detonated'); - boarde[x][y].overlay.classList.remove('flag'); - boarde[x][y].overlay.style.opacity="1"; - boarde[x][y].overlay.style.transform="scale(1,1)"; + cell[x][y].overlay.classList.add('detonated'); + cell[x][y].overlay.classList.remove('flag'); + cell[x][y].overlay.style.opacity="1"; + cell[x][y].overlay.style.transform="scale(1,1)"; if(multimine) { - if(-boardn[x][y]!=boards[x][y]&&boards[x][y]>0) - boarde[x][y].span.innerHTML=""+boards[x][y]+""+(boardn[x][y]<0?-boardn[x][y]:""); - else boarde[x][y].span.innerHTML=-boardn[x][y]; + if(-cell[x][y].n!=cell[x][y].s&&cell[x][y].s>0) + cell[x][y].span.innerHTML=""+cell[x][y].s+""+(cell[x][y].n<0?-cell[x][y].n:""); + else cell[x][y].span.innerHTML=-cell[x][y].n; } var st=1;if(mines[1].toString()!=new pair(x,y).toString)st=0; playsound('explode.ogg'); @@ -363,35 +364,35 @@ function die(x,y) } function dieproc(p) { - if(!dead||p>=mines.length){if(p>=mines.length)showresult(0);document.getElementById("containerDiv").style.transform="none";return;} - var x=mines[p].x,y=mines[p].y;if(effects&&(p%5==0))playsound('explode.ogg',.2); - if(boards[x][y]!=-boardn[x][y]) + if(!dead||p>=mines.length){if(p>=mines.length)showresult(0);ui.cwctn.style.transform="none";return;} + var x=mines[p].x,y=mines[p].y;if(effects&&(p%5==0))playsound('explode.ogg',.3*(1-p/cc/2)); + if(cell[x][y].s!=-cell[x][y].n) { - boarde[x][y].overlay.classList.add('mine'); - boarde[x][y].overlay.classList.remove('flag'); + cell[x][y].overlay.classList.add('mine'); + cell[x][y].overlay.classList.remove('flag'); } - boarde[x][y].overlay.style.opacity="1"; - boarde[x][y].overlay.style.transform="scale(1,1)"; + cell[x][y].overlay.style.opacity="1"; + cell[x][y].overlay.style.transform="scale(1,1)"; if(multimine) { - if(-boardn[x][y]!=boards[x][y]&&boards[x][y]>0) - boarde[x][y].span.innerHTML=""+boards[x][y]+""+(boardn[x][y]<0?-boardn[x][y]:""); - else boarde[x][y].span.innerHTML=-boardn[x][y]; + if(-cell[x][y].n!=cell[x][y].s&&cell[x][y].s>0) + cell[x][y].span.innerHTML=""+cell[x][y].s+""+(cell[x][y].n<0?-cell[x][y].n:""); + else cell[x][y].span.innerHTML=-cell[x][y].n; } if(effects) - document.getElementById("containerDiv").style.transform="translate("+(Math.random()*10-5)+"px,"+(Math.random()*10-5)+"px)"; + ui.cwctn.style.transform="translate("+(Math.random()*10-5)+"px,"+(Math.random()*10-5)+"px)"; if(!effects||(cc>40&&(p&1)))dieproc(p+1);else setTimeout(dieproc,10,p+1); } function systemtest() { - if(document.getElementById("st").classList.contains("disabled")||solved||dead)return; + if(ui.pbstt.classList.contains("disabled")||solved||dead)return; for(var i=0;iClick or tap anywhere in the dialog to close it."; } else @@ -412,12 +413,11 @@ function showresult(w) var cs=0,ccor=0,uc=0; for(var i=0;i=0)++uc; + if(cell[i][j].s==-cell[i][j].n&&cell[i][j].n<0)ccor+=cell[i][j].s; + if(cell[i][j].n<0)cs-=cell[i][j].n; + if(cell[i][j].s==-1&&cell[i][j].n>=0)++uc; } - document.getElementById('result').style.opacity="1";document.getElementById('result').style.zIndex="1000"; - document.getElementById('result').innerHTML= - "Game Over!
    You uncovered "+(100*uc/(dimx*dimy-cc)).toFixed(2)+"% of the field and located "+(100*ccor/cs).toFixed(2)+"% mines correctly.
    Click or tap anywhere in the dialog to close it." + ui.lbres.innerHTML="

    Game Over!

    You uncovered "+(100*uc/(dimx*dimy-cc)).toFixed(2)+ + "% of the field and located "+(100*ccor/cs).toFixed(2)+"% mines correctly.
    Click or tap anywhere in the dialog to close it." } } -- cgit v1.2.3