MineImg=new Image(),
SadImg=new Image(),
SuccessImg=new Image(),
WhichButton=function(e){
e=e||window.event;
var b=getOs();
if(b!=2){ //非FF
switch(e.button){
case 2:
return 0;
case 0:
return b1?0:1; //b1,IE
default:
return 1;
}
}else{ //FF
return e.which==3?0:1;
}
},
OMine={
MaxX:9,MaxY:9,//最大的坐标
MineCount:10,//定义雷的个数,可改
FlagCount:0, //已经标记的旗子的数量
OpenedCount:0, //已经打开的地区的数量
MaxOpenCount:0,//应该要打开的最大地区数量
//当OpenedCount=MaxOpenCount&&FlagCount=MineCount的时候,判断游戏成功结束
Mine:[],
GameOver:false, //true代表游戏失败结束
Success:false, //true代表游戏成功结束
aClear:[],//临时开雷的数组
//刷新网页的时候初始化
fInit:function(){
var T=this,MaxX=T.MaxX,MaxY=T.MaxY,nX,nY=MaxY,MineCount=T.MineCount,
AStr=[‘
’],i=0,TAr,TMine=T.Mine;
T.MaxOpenCount=MaxX*MaxY-MineCount;
while(nY–){
AStr[++i]=‘’;
TAr=TMine[nY]=[];
nX=MaxX;
while(nX–){
AStr[++i]=‘ ’;
TAr[nX]={
Mine:0, //0表示没有雷,1表示有雷
State:0,//0表示未开启,1表示左键开启,2表示右键标记
MineCount:0//周围有几个雷
}
}
AStr[++i]=‘’;
}
AStr[++i]=‘’;
$(‘dMap’).innerHTML=T.InitStr=AStr.join(‘’);
$(‘txtFlagCount’).value=MineCount;
T.fInitMine();
$(‘btnRefreshMap’).src=‘img/happy.gif’;
T.GameOver=T.Success=false;
T.OpenedCount=T.FlagCount=T.aClear.lenght=0;
},
//为了方便循环赋值,给表格数组赋值的时候是XY倒过来循环的,所以调用的时候要倒回去
//比如要获得该格子是否有雷,用OMine.fGetMine(x,y).Mine;
fGetMine:function(X,Y){return this.Mine[Y][X]},
//仅当按重新开始的按钮,不初始化大表格字符
fRefreshMap:function(){
var T=this;
$(‘dMap’).innerHTML=T.InitStr;
T.fResetOMine();//必须先重置OMine,再重置99个雷
T.fInitMine();
T.GameOver=T.Success=false;
$(‘btnRefreshMap’).src=‘img/happy.gif’;
$(‘txtFlagCount’).value=T.MineCount;
T.OpenedCount=T.FlagCount=T.aClear.lenght=0;
},
//重置OMine.Mine数组
fResetOMine:function(){
var T=this,MaxY=T.MaxY,MaxX=T.MaxX,X,Y=MaxY,M,Mine=T.Mine,TAr;
while(Y–){
X=MaxX;
TAr=Mine[Y];
while(X–)(M=TAr[X]).Mine=M.State=M.MineCount=0;
}
},
//初始化雷的数组
fInitMine:function(){
var T=this,MaxX=T.MaxX,MaxY=T.MaxY,a,fGetMine=T.fGetMine,
aOld=[],x,y=MaxY,n=0,l=T.MineCount,xRand; //一个随机数字
while(y–){
x=MaxX;
while(x–)aOld[n++]=[x,y];
}
while(l–){
a=aOld[xRand=Math.floor(Math.random()*(n-1))];
T.fGetMine(a[0],a[1]).Mine=1;
aOld.splice(xRand,1);
–n;
}
},
//鼠标移动到某格子的时候
fButtonMouseOver:function(X,Y){
var T=this;
switch(MouseButton){
case 2://双键按下的状态
var arr=T.fGetAround(X,Y),i=arr.length,TAr;
while(i–)T.fButtonDown((TAr=arr[i])[0],TAr[1]);
case 1:
LeftMouse==1&&T.fButtonDown(X,Y); //左键是按下的
}
},
//鼠标移出某格子的时候
fButtonMouseOut:function(X,Y){
var T=this;
switch(MouseButton){
case 2://双键按下的状态
var arr=T.fGetAround(X,Y),i=arr.length,TAr;
while(i–)T.fButtonUp((TAr=arr[i])[0],TAr[1]);
case 1:
LeftMouse==1&&T.fButtonUp(X,Y); //左键是按下的
}
},
//鼠标按下时没被开启的格子呈现被按下
fButtonDown:function(X,Y){
var srcEle=$(‘Img’+X+‘_’+Y);
srcEle.className==‘Normal’&&(srcEle.className=‘M0’);
},
//让没被开启并且已经呈现被按下的格子回复Normal
fButtonUp:function(X,Y){
var srcEle=$(‘Img’+X+‘_’+Y);
srcEle.className==‘M0’&&!this.fGetMine(X,Y).State&&(srcEle.className=‘Normal’);
},
//获取8个方向的坐标
fGetAround:function(X,Y){
var TX,TY,i=8,MX=this.MaxX-1,MY=this.MaxY-1,
Arr=[[-1,0],[-1,-1],[0,-1],[1,-1],[1,0],[1,1],[0,1],[-1,1]],
newArr=[],TAr;
while(i–){
TX=X+(TAr=Arr[i])[0];
TY=Y+TAr[1];
!(TX<0||TX>MX||TY<0||TY>MY)&&newArr.push([TX,TY]);
}
return newArr;
},
//鼠标在格子按下
fMouseDown:function(X,Y,evt){
var T=this;
if(T.GameOver){
alert(‘游戏失败,再接再厉!’);
return;
}
if(T.Success){
alert(‘恭喜游戏成功!再来一局吧?’);
return;
}
var srcEle=$(‘Img’+X+‘_’+Y),ObXY=T.fGetMine(X,Y),arr,i,TAr;
++MouseButton;
evt=evt||window.event;
switch(MouseButton){
case 2:
arr=T.fGetAround(X,Y);i=arr.length;
while(i–)T.fButtonDown((TAr=arr[i])[0],TAr[1]);
break;
case 1:
if(WhichButton(evt)){
LeftMouse=1;
T.fButtonDown(X,Y);
}else{
switch(ObXY.State){
case 0:
ObXY.State=2;
srcEle.className=‘Flag’;
–$(‘txtFlagCount’).value;
++T.FlagCount;
break;
case 2:
ObXY.State=0;
srcEle.className=‘Normal’;
++$(‘txtFlagCount’).value;
–T.FlagCount;
}
}
}
},
//鼠标在格子弹起
fMouseUp:function(X,Y,evt){
var T=this;
evt=evt||window.event;
var srcEle=$(‘Img’+X+‘_’+Y),ObXY=T.fGetMine(X,Y),arr,i,TAr;
switch(MouseButton){
case 2: //MouseDown为两个键都单击按下,任意一个键弹起都判断为双键弹起
LeftMouse=0;
//鼠标弹起,把呈现被按下状态的格子恢复
arr=T.fGetAround(X,Y);i=arr.length;
while(i–)T.fButtonUp((TAr=arr[i])[0],TAr[1]);
!ObXY.State&&T.fButtonUp(X,Y);
ObXY.State==1&&ObXY.MineCount&&T.fOpenFlagMine(X,Y);
break;
case 1: //当MouseDown为一个键单击时,MouseUp才判断为一个键弹起
if(WhichButton(evt)){
//只有在State=0才起作用,跟是否有雷没关系
LeftMouse=0;
if(ObXY.State){break;}
ObXY.Mine?(
//触雷,结束该局
T.fFail(),
srcEle.className=‘Boom’
)😦
ObXY.State=1, //压栈之前就要设置为已经开启
T.aClear.push([X,Y]),
T.fClearMine()
)
}
}
MouseButton=0;
if(T.OpenedCountT.MaxOpenCount&&T.FlagCountT.MineCount){
T.fSuccess();
alert(‘恭喜游戏成功!再来一局吧?’);
return;
}
//当剩余未开启的格子数=剩余的旗子数,自动完成
T.MaxOpenCount+T.MineCount-T.OpenedCount-T.FlagCount==$(‘txtFlagCount’).value&&(
T.fSuccess(),
T.fAutoFlag(),
alert(‘恭喜游戏成功!再来一局吧?’)
)
},
//自动填充未开启的地区的雷
fAutoFlag:function(){
var T=this,nX,nY=T.MaxY,MaxX=T.MaxX,Mine=T.Mine,TAr;
while(nY–){
nX=MaxX;
TAr=Mine[nY];
while(nX–)!TAr[nX].State&&($(‘Img’+nX+‘_’+nY).className=‘Flag’);
}
$(‘txtFlagCount’).value=0;
},
//递归开雷
fClearMine:function(){
var T=this;
if(T.aClear.length==0){return}
++T.OpenedCount;
var aXY=T.aClear.pop(),X=aXY[0],Y=aXY[1],TX,TY,
aTmpClear=[], //一个临时数组
srcEle=$(‘Img’+X+‘_’+Y),
ObXY,ObTXTY,
countMine=0, //获取周围雷的个数
//从正左开始的8个方向
arr=T.fGetAround(X,Y),i=arr.length,TAr;
while(i–){
//TX,TY获得本格周围的坐标
(ObTXTY=T.fGetMine(TX=(TAr=arr[i])[0],TY=TAr[1])).Mine==1&&++countMine;
!ObTXTY.State&&aTmpClear.push([TX,TY]);
}
ObXY=T.fGetMine(X,Y);
ObXY.MineCount=countMine;
srcEle.className=‘M’+countMine;
if(!countMine){
Array.prototype.push.apply(T.aClear,aTmpClear);
i=aTmpClear.length;
while(i–)T.fGetMine((TAr=aTmpClear[i])[0],TAr[1]).State=1;
}else{
getOs()==2?
srcEle.textContent=countMine
:srcEle.innerText=countMine
}
T.fClearMine();
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
年进入阿里一直到现在。**
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-IpQWTWHU-1715252215967)]
[外链图片转存中…(img-F9RyayNP-1715252215967)]
[外链图片转存中…(img-lTjnIpn2-1715252215967)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!