大佬教程收集整理的这篇文章主要介绍了仿windows经典扫雷小代码,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_
618_0@<html>
<head>
<meta
http-equiv="Content-Language" content="zh-cn">
<meta
http-equiv="Content-Type" content="text/html; charset=utf-8">
<
title>扫雷-JavaScript Mine Sweeper</
title>
<style type="text/css">
table
{TABLE-LAYOUT: fixed;
cursor:pointer}
td
{width: 20px; height: 20px; font-size: 12px; font-family: Verdana;font-weight:bold; text-align:center;
BACkground:#CECECE;}
td.Normal,.Flag
{Border-left:2px solid #F5F5F
5; border-right:2px outset #F5F5F
5; border-top:2px solid #F5F5F
5; border-bottom:2px outset #F5F5F
5; font-weight:bol
D}
.Mine,
.boom,.M0,.M1,.M2,.M3,.M4,.M5,.M6,.M7,.M8
{BACkground:#C5C5C
5;border-right
:1px solid #B4B4B4; border-bottom
:1px solid #B4B4B4;}
td.Mine
{BACkground: url(
http://sandbox.runj
s.cn/uploads/rs/202/xyovf5xj/mine.gif) no-repeat center}
td
.boom
{BACkground:#F00 url(
http://sandbox.runj
s.cn/uploads/rs/202/xyovf5xj/mine.gif) no-repeat center}
td.Flag,td.ErrFlag
{BACkground-image: url(
http://sandbox.runj
s.cn/uploads/rs/202/xyovf5xj/flag.gif
);BACkground-repeat: no-repeat;
BACkground-position: center;}
td.ErrFlag
{BACkground:#0F0}
td.M1
{Color: #00f}
td.M2
{Color: #008000}
td.M3
{Color: #f00}
td.M4
{Color: #000080}
td.M5
{Color: #800000}
td.M6
{Color: #008080}
td.M7
{Color: #000}
td.M8
{Color: #808080}
</style>
<script>
var $=function(id)
{return document.getElementById(id)},MouseButton=LeftMouse
=0,//作为双键单击的计数,mouseup事件置0,mousedown事件+1,当MouseButton=2说明双键同时单击;鼠标左键是否按下,当鼠标左键按下时为1,松开为0
FlagImg=new Image(),HappyImg=new Image(),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 b==1?0
:1; //b==1,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=['<table bordercolor="#000000" border="0" cel
LPADding="0" cellspacing="0" height="'+20*MaxY+'px" width="'+20*MaxX+'px" style="border: 10px inset #a0a0a0">'],i
=0,TAr,TMine=T.Mine;
T.MaxOpenCount=MaxX*MaxY-MineCount;
while(nY--)
{
AStr[++i]='<tr>';
TAr=TMine[nY]=[];
nX=MaxX;
while(nX--)
{
AStr[++i]='<td class="Normal" onmousedown="OMine.fMouseDown('+nX+','+nY+',event
);" onmouseup="OMine.fMouseUp('+nX+',event
);" onmouseover="OMine.fButtonMouseOver('+nX+','+nY+')" onmouseout="OMine.fButtonMouseOut('+nX+','+nY+')" id="Img'+nX+'_'+nY+'"> </td>';
TAr[nX]=
{
Mine:0,//0表示没有雷,1表示有雷
State:0,//0表示未开启,1表示左键开启,2表示右键标记
MineCount:0//周围有几个雷
}
}
AStr[++i]='</tr>';
}
AStr[++i]='</table>';
$('dMap').innerHTML=T.InitStr=AStr.join(''
);
$('txtFlagCount').value=MineCount;
T.fInitMine(
);
$('btn
refreshMap').src='
http://sandbox.runj
s.cn/uploads/rs/202/xyovf5xj/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 thi
s.Mine[Y][X]},//仅当按重新开始的按钮,不初始化大表格字符
f
refreshMap:function()
{
var T=this;
$('dMap').innerHTML=T.InitStr;
T.fResetOMine(
);//必须先重置OMine,再重置99个雷
T.fInitMine(
);
T.GameOver=T.
success=
false;
$('btn
refreshMap').src='
http://sandbox.runj
s.cn/uploads/rs/202/xyovf5xj/happy.gif';
$('txtFlagCount').value=T.MineCount;
T
.openedCount=T.FlagCount=T.aClear.lenght
=0;
},//重置OMine.Mine数组
fResetOMine:function()
{
var T=this,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,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.fGetA
round(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,TAr;
while(i--)T.fButtonUp((TAr=arr[i])
[0],TAr[1]
);
case 1:
LeftMouse==1&&T.fButtonUp(X,//鼠标按下时没被开启的格子呈现被按下
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'&&!thi
s.fGetMine(X,Y).State&&(srcEle.className='Normal'
);
},//获取8个方向的坐标
fGetAround:function(X,Y)
{
var TX,TY,i=8,MX=thi
s.MaxX-1,MY=thi
s.MaxY-1,Arr=[[-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,T
y]);
}
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,arr,i,TAr;
++MouseButton;
evt=evt||window.event;
switch(MouseButton)
{
case 2:
arr=T.fGetA
round(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.Stat
E){
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,evt)
{
var T=this;
evt=evt||window.event;
var srcEle=$('Img'+X+'_'+Y),TAr;
switch(MouseButton)
{
case 2: //MouseDown为两个键都单击按下,任意一个键弹起都判断为双键弹起
LeftMouse
=0;
//鼠标弹起,把呈现被按下状态的格子恢复
arr=T.fGetA
round(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.Stat
E){Break;}
ObXY.Mine?(
//触雷,结束该局
T.fFail(),srcEle.className='Boom'
):(
ObXY.State=1,//压栈之前就要设置为已经开启
T.aClear.push([X,
y]),T.fClearMine()
)
}
}
MouseButton
=0;
if(T
.openedCount==T.MaxOpenCount&&T.FlagCount==T.MineCount)
{
T.f
success(
);
alert('恭喜游戏成功!再来一局吧?'
);
return;
}
//当剩余未开启的格子数=剩余的旗子数,自动完成
T.MaxOpenCount+T.MineCount-T
.openedCount-T.FlagCount==$('txtFlagCount').value&&(
T.f
success(),T.fAutoFlag(),alert('恭喜游戏成功!再来一局吧?')
)
},//自动填充未开启的地区的雷
fAutoFlag:function()
{
var T=this,nY=T.MaxY,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=aX
Y[1],TX,aTmpClear=[],//一个临时数组
srcEle=$('Img'+X+'_'+Y),ObXY,ObTXTY,countMine
=0,//获取周围雷的个数
//从正左开始的8个方向
arr=T.fGetA
round(X,TAr;
while(i--)
{
//TX,TY获得本格周围的坐标
(ObTXTY=T.fGetMine(TX=(TAr=arr[i])
[0],TY=TAr[1])).Mine==1&&++countMine;
!ObTXTY.State&&aTmpClear.push([TX,T
y]);
}
ObXY=T.fGetMine(X,Y
);
ObXY.MineCount=countMine;
srcEle.className='M'+countMine;
if(!countMin
E){
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(
);
},//获得双键辅助开启
fOpenFlagMine:function(X,Y)
{
var T=this,FlagCount
=0,FlagErr=
false,arr=T.fGetA
round(X,TY获得本格周围的坐标
ObTXTY=T.fGetMine(TX=(TAr=arr[i])
[0],TY=TAr[1]
);
switch(ObTXTY.Stat
E){
case 0: //未开启未标记
!ObTXTY.Mine&&aTmpClear.push([TX,T
y]); //没雷也没旗子的时候加入到被辅助开启的数组}
break;
case 2: //标记了旗子
++FlagCount; //只要标记了旗子,无论对错,都记录标记数+1
!ObTXTY.Mine&&(FlagErr=tru
E); //没有雷但是标记了旗子,标记错误
}
}
if(FlagCount<T.fGetMine(X,Y).MineCount||aTmpClear.length=
=0)return;
//旗子比实际雷少,无论标记对错,不开启
//没有可以提供开启的空格
if(FlagErr)
{ //有错误则进行结束游戏处理
T.fFail(
);
return;
}
Array.prototype.push.apply(T.aClear,aTmpClear
);
i=aTmpClear.length;
while(i--)T.fGetMine((TAr=aTmpClear[i])
[0],TAr[1]).State=1;
T.fClearMine(
);
},//显示所有的雷
fShowMine:function()
{
var T=this,X
=0,Y=T.MaxY,TArX;
while(Y--)
{
X=MaxX;
TAr=Mine[Y];
while(X--)
{
TArX=TAr[X];
switch(TArX.Min
E){
case 0:
TArX.State==2&&($('Img'+X+'_'+Y).className='ErrFlag'
);
break;
case 1:
$('Img'+X+'_'+Y).className='Mine';
}
}
}
},//游戏成功结束
f
success:function()
{
thi
s.success=true;
$('btn
refreshMap').src='
http://sandbox.runj
s.cn/uploads/rs/202/xyovf5xj/
success.gif';
},//游戏失败结束
fFail:function()
{
thi
s.GameOver=true;
$('btn
refreshMap').src='
http://sandbox.runj
s.cn/uploads/rs/202/xyovf5xj/sad.gif';
thi
s.fShowMine(
);
}
},//换地图
ChangeMap=function(Ma
p){
var O=OMine;
switch(Ma
p){
case 1:
O.MaxX=O.MaxY=9;
O.MineCount=10;
break;
case 2:
O.MaxX=O.MaxY=16;
O.MineCount=40;
break;
case 3:
O.MaxX=30;
O.MaxY=16;
O.MineCount=99;
}
O.fInit(
);
},getOs=function()
{
if(navigator.userAgent.indexOf("MSIE")>0)return 1;
if(isFirefox=navigator.userAgent.indexOf("Firefox")>0)return 2;
if(isSafari=navigator.userAgent.indexOf("Safari")>0)return 3;
if(isCamino=navigator.userAgent.indexOf("Camino")>0)return 4;
if(isMozilla=navigator.userAgent.indexOf("Gecko/")>0)return
5;
return 0;
};
FlagImg.src='
http://sandbox.runj
s.cn/uploads/rs/202/xyovf5xj/flag.gif';
HappyImg.src='
http://sandbox.runj
s.cn/uploads/rs/202/xyovf5xj/happy.gif';
MineImg.src='
http://sandbox.runj
s.cn/uploads/rs/202/xyovf5xj/mine.gif';
SadImg.src='
http://sandbox.runj
s.cn/uploads/rs/202/xyovf5xj/sad.gif';
successImg.src='
http://sandbox.runj
s.cn/uploads/rs/202/xyovf5xj/
success.gif';
</script>
</head>
<body topmargin="0" onco
ntextmenu="return
false" ondragstart="return
false" on
SELEctstart="return
false" onload="OMine.fInit()" bgcolor="#808080">
<center>
<div id="dTop" align="center" style="border-style: inset; border-width: 10;width
:400">
<table cel
LPADding="0" cellspacing="0" style="border-collapse: collapse;" width="380" height="44">
<tr>
<td style="width: 102; height:50px">
<input type="text" id="txtFlagCount" size="20" style="width: 60; height: 30; color:#FF0000; text-align:center; font-family:Verdana; font-weight:bold;
BACkground-color:#000000; font-size
:13pt" value=""></td>
<td style="width: 136; height:50px">
<input onclick="OMine.f
refreshMap()" type="image" id="btn
refreshMap" src="happy.gif"><input onclick="OMine.fShowMine(
);" type="button" name="B3" value="显雷"style="display:none"></td>
<td style="width: 142; height:50px">
<input type="radio" value="V1"
checked name="R1" id="R1" onclick="ChangeMap
(1)">初级<input type="radio" value="V1" name="R1" id="R2" onclick="ChangeMap(2)">中级<input type="radio" value="V1" name="R1" id="R3" onclick="ChangeMap(3)">高级</td>
</tr>
</table>
</div>
<div id="dMap" align="center"></div>
</center>
</body>
</html>
大佬总结
以上是大佬教程为你收集整理的仿windows经典扫雷小代码全部内容,希望文章能够帮你解决仿windows经典扫雷小代码所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。