纯VBScript版的Web扫雷程序

来源:岁月联盟 编辑:exp 时间:2004-10-15
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Guidy的Web扫雷程序 - 纯VBScript版</title>
<style type="text/css">
@charset "gb2312";
body,td {
Font: 12 Px "宋体", Verdana, Arial, Helvetica, sans-serif;
Cursor: default;
}
body{
margin: 0px;
BackGround: buttonface;
}
A:link,A:visited,A:active {
Color:#990000;
Text-Decoration:None;
}
A:hover {
Color:#FF8000;
Text-Decoration:UnderLine;
}
input {
Border-Top-Width: 1 Px;
Padding-Right: 1 Px;
Padding-Left: 1 Px;
Border-Left-Width: 1 Px;
Border-bottom-Width: 1 Px;
Border-Right-Width: 1 Px;
Padding-bottom: 1 Px;
Padding-Top: 1 Px;
Height: 18 Px;
Border-Left-Color: #C0C0C0;
Border-bottom-Color: #C0C0C0;
Border-Top-Color: #C0C0C0;
Border-Right-Color: #C0C0C0;
BackGround-Color: #FFFFFF;
Color: #000000;
Font: 9pt "宋体", Verdana, Arial, Helvetica, sans-serif;
}
.TdOver{
border: 1px outset;

Border-Left-Color: #FFFFFF;
Border-Top-Color: #FFFFFF;
Border-Right-Color: #AAAAAA;
Border-bottom-Color: #AAAAAA;

BackGround-Color: #FFCCFF;
}
.TdOut{
border: 1px outset;

Border-Left-Color: #E5E6E7;
Border-Top-Color: #E5E6E7;
Border-Right-Color: #E5E6E7;
Border-bottom-Color: #E5E6E7;

BackGround-Color: #E5E6E7;
}
.Tm0{BackGround-Color: buttonface;Color: #2E8B57; font-weight:bold;}
.Tm1{BackGround-Color: buttonface;Color: #0000FF; font-weight:bold;}
.Tm2{BackGround-Color: buttonface;Color: #2E8B57; font-weight:bold;}
.Tm3{BackGround-Color: buttonface;Color: #FF0000; font-weight:bold;}
.Tm4{BackGround-Color: buttonface;Color: #FF00FF; font-weight:bold;}
.Tm5{BackGround-Color: buttonface;Color: #00FFFF; font-weight:bold;}
.Tm6{BackGround-Color: buttonface;Color: #FF00FF; font-weight:bold;}
.Tm7{BackGround-Color: buttonface;Color: #FFFF00; font-weight:bold;}
.Tm8{BackGround-Color: buttonface;Color: #000000; font-weight:bold;}

</style>
</head>

<body onselectstart="event.returnValue=false;">
<table align="center"><tr><td>
<fieldset style="background-color:bottonface;"><legend>扫雷控制面板</legend><table border="0" align="center" cellpadding="0" cellspacing="1">
<tr>
<td>宽度:</td>
<td><input name="Tmx" type="text" id="Tmx" size="4" maxlength="4" style="ime-mode: disabled;"></td>
<td><input name="S1" type="button" id="S1" onClick="CreatTable(Tmx.value,Tmy.value);LayMine(MNum.value);" value=" 开 始 "></td>
</tr>
<tr>
<td>高度:</td>
<td><input name="Tmy" type="text" id="Tmy" size="4" maxlength="4" style="ime-mode: disabled;"></td>
<td rowspan="2" align="center" valign="middle" id="BnNum" style="font-weight:800; color:#FF0000; font-size:36px;" title="当前标记个数,为负表明超过雷数!">&nbsp;</td>
</tr>
<tr>
<td>雷数:</td>
<td><input name="MNum" type="text" id="MNum" size="4" maxlength="4" style="ime-mode: disabled;"></td>
</tr>
</table>
</fieldset></td></tr>
</table>
<hr size="1">
<table border="3" align="center" cellpadding="1" cellspacing="1" bordercolor="threedshadow">
<tr>
<td><div align="center" id="MineView"><div align="left"><br>
<ul>
<li><strong><font color="#FF0000">请设定后点击『开始』按钮,即可进入游戏!</font></strong></li>
<li>“扫雷”游戏的目标是尽快找到雷区中的所有地雷,而不许踩到地雷。如果挖开的是地雷,您将输掉游戏。</li>
<li>通过单击即可挖开方块。如果挖开的是地雷,则您输掉游戏。</li>
<li>如果方块上出现数字,则表示在其周围的八个方块中共有多少颗地雷。</li>
<li>要标记您认为可能有地雷的方块,请右键单击它。 </li>
<li>要标记您认为不确定的方块,请右键单击它两次。 </li>
</ul>
</div></div></td>
</tr>
</table>
<hr size="1">
<script language="vbscript">
Rem =========================================================
Rem 文件:WebMine.asp
Rem 功能:Guidy的Web扫雷程序 - 纯VBScript版
Rem 版本:Ver1.0.0
Rem 全称:Guidy的Web扫雷程序 Ver1.0.0
Rem 时间:2004-10-15
Rem 作者:Guidy
Rem 版权:iXuEr Studio
Rem =========================================================
Rem Copyright (C) 2004-2006 114XP.CN All rights reserved.
Rem 官方网站:http://www.114xp.cn
Rem 技术论坛:http://bbs.114xp.cn
Rem 电子信箱:Guidy@qq.com , Guidy@psysch.com
Rem =========================================================
Option Explicit

Public i,o
Public x,y,z
Public MineArr,LayStr,LayTmpStr
Public Ri,Rn,Rm
Public WinMsg,LoseMsg,BnedMsg

Function CreatTable(Tx,Ty)
''//初始化雷区并将雷区标识符保存在数组中
Dim TmpStr,TmpStr1

WinMsg = "恭喜!你赢了!!!"
LoseMsg = "踩到地雷了,哈哈!去死吧!~~"

''//因为编程上的不足,只有在长宽相等的时候才能正确游戏
''//希望有高手帮助我更正这个问题
If Tx <> Ty And Tx > Ty Then
Ty = Tx
Else
Tx = Ty
End If
''//如果雷区参数过小就强制使用默认值
If Tx = "" Or IsNull(Tx) Then Tx = 9 : Tmx.Value = 9
If Ty = "" Or IsNull(Ty) Then Ty = 9 : Tmy.Value = 9

''//如果雷区参数过大就强制使用默认值
If Tx >= 24 Then Tx = 24 : Tmx.Value = 24
If Ty >= 24 Then Ty = 24 : Tmy.Value = 24

''//创建雷区表格
TmpStr = "<table border=""0"" align=""center"" cellpadding=""0"" cellspacing=""0"" bordercolor=""threeddarkshadow"" bgcolor=""#990000"">"
For x = 1 To Ty
TmpStr = TmpStr & " <tr>"

For y = 1 To Tx
TmpStr = TmpStr & " <td onClick=""ShowTMN(this.id);"" onContextMenu=""PutBn(this.id);event.returnValue=false;"" align=""center"" class=""TdOut"" width=""24"" height=""24"" id=""T_" & x &"_"& y &""" MineNum=""0"" MBN="""" Disable=""False"">&nbsp;</td>"
TmpStr1 = TmpStr1 & " T_" & x &"_"& y
Next
TmpStr = TmpStr & " </tr>"
Next
TmpStr = TmpStr & "</table>"

''//显示表格
MineView.innerHTML = TmpStr
''//整理雷区标识符字符串便于转换
TmpStr1 = Trim(TmpStr1)

''//将雷区标识符字符串转换撑数组
MineArr = Split(TmpStr1)
''//将雷区总数
Rn = UBound(MineArr) + 1

End Function

Function LayMine(MNumber)
''//放雷
Dim ii
Dim Lx,Ly

''//如果检测到雷区未初始化,则强制执行初始化
If IsArray(MineArr) = False Then Call CreatTable(100,100)

''//获取雷区参数
x = Int(Tmx.Value)
y = Int(Tmy.Value)

If MNumber = "" Or MNumber <= "0" Then MNumber = 10 : MNum.value = MNumber

''//获取雷数
z = MNum.Value
''//如果雷数超过了雷区总数则强制设置
If Int(MNumber) >= Int(x * y) Then
MNumber = Int(x * y) - 50
MNum.value = MNumber
z = MNum.Value
End If

Rm = z

''//初始化雷标识字符串
LayStr = ""

For ii = 1 To MNumber
''//初始化随机数种子
Randomize Timer()
''//建立随机数
Lx = Int(Rnd * x) + 1
Ly = Int(Rnd * y) + 1
''//对随机数整形
If Lx <= 1 Then Lx = 1
If Ly <= 1 Then Ly = 1
If Lx >= x Then Lx = x
If Ly >= y Then Ly = y
''//利用随机数组合雷标识
LayTmpStr = "T_"
LayTmpStr = LayTmpStr & Ly

LayTmpStr = LayTmpStr &"_"& Lx
''//检测雷标识字符串,如果存在则跳过,不存才就放雷
If InStr(LayStr,LayTmpStr) Then
ii = ii - 1
Else
Execute(LayTmpStr & ".MineNum = ""地雷""")
''//放雷后重新组合雷标识字符串
LayStr = LayStr &" "& LayTmpStr
End If
Next

''//对雷标识字符串整形
LayStr = Trim(LayStr)
''//将雷标识字符串转换成数组
LayStr = Split(LayStr)
''//获取雷总数
Ri = UBound(LayStr) + 1

Call LayMNum()

End Function

Function LayMNum()
''//在所有方格中标识其周围的雷数
Dim Li,Lmn

For Li = 0 To UBound(MineArr)
Lmn = Eval(MineArr(Li) & ".MineNum")
Call ChkMineNum(MineArr(Li),Lmn,0)
Next

End Function

Function ChkMineNum(Tid,TMN,Tp)
''//计算雷区数字,在方格中显示其周围的雷数
Dim Tdid,Tmp,Tmp1
Dim n
Dim Sx,Sy,Ox,Oy,Mx,My

x = Tmx.Value
y = Tmy.Value
n = 0

''//将雷区标识转换成数组便于操作
Tdid = Split(Tid,"_")

''//对雷标识符进行整形 初始化中央坐标
Ox = Tdid(1)
Oy = Tdid(2)

''//对雷标识符进行整形 初始化横坐标 幅度 1
Sx = Ox - 1
Mx = Ox + 1
If Int(Sx) <= 1 Then Sx = 1
If Int(Mx) >= Int(x) Then Mx = x

''//对雷标识符进行整形 初始化纵坐标 幅度 1
Sy = Oy - 1
My = Oy + 1
If Int(Sy) <= 1 Then Sy = 1
If Int(My) >= Int(y) Then My = y

If TMN = "地雷" Then
''//如果时雷标识就应该跳过
''//Execute(Tid & ".innerHTML = """ & TMN & """")
Else
''//循环计算周围雷总数
For i = Sx To Mx Step 1
Tmp1 = Tdid(0)
Tmp1 = Tmp1 & "_" & i

For o = Sy To My Step 1
Tmp = Tmp1 & "_" & o

If Eval(Tmp & ".MineNum = ""地雷""") Then
n = n + 1
ElseIf TMN = 0 And Tp = 1 Then
''//如果雷数为0则自动循环检测其周围其他雷区,直到完毕
Call ShowTMN(Tmp)
End If
Next
Next
''//显示周围雷数
ExeCute(Tid & ".MineNum = " & n)
''//ExeCute(Tid & ".innerHTML = " & n)
End If

End Function

Function ShowTMN(Tid)
''//在选中的格子中显示其周围的雷数
Dim TTn
TTn = CStr(Eval(Tid & ".MineNum"))

''//如果所点击的不是雷标识格子,则将没有禁用的标识为禁用
''//禁用的则自动跳过执行,以减少系统执行负担
If Eval(Tid & ".MineNum <> ""地雷""") Then
If Eval(Tid & ".Disable = ""True""") Then
Exit Function
Else
Execute(Tid & ".innerHTML = """ & TTn & """")
Execute(Tid & ".Disable = ""True""")
End If

If Eval(Tid & ".MineNum = ""标记""") Then
Execute(Tid & ".Disable = ""False""")
End If
Else
If Eval(Tid & ".Disable = ""True""") Then
Exit Function
End If
End If

''//按照雷数的不同显示不同的样式,以便区分
Select Case TTn
Case "0"
''//如果检测到周围雷数为0,则自动循环检测其周围的格子
ExeCute(Tid & ".MineNum = """"")
Execute(Tid & ".className = ""Tm0""")
Execute(Tid & ".innerHTML = ""&nbsp;""")
Call ChkMineNum(Tid,TTn,1)
Rn = Rn - 1

Case "1" Execute(Tid & ".className = ""Tm1""") : Rn = Rn - 1
Case "2" Execute(Tid & ".className = ""Tm2""") : Rn = Rn - 1
Case "3" Execute(Tid & ".className = ""Tm3""") : Rn = Rn - 1
Case "4" Execute(Tid & ".className = ""Tm4""") : Rn = Rn - 1
Case "5" Execute(Tid & ".className = ""Tm5""") : Rn = Rn - 1
Case "6" Execute(Tid & ".className = ""Tm6""") : Rn = Rn - 1
Case "7" Execute(Tid & ".className = ""Tm7""") : Rn = Rn - 1
Case "8" Execute(Tid & ".className = ""Tm8""") : Rn = Rn - 1
Case "地雷"
WinMsg = LoseMsg
Call ShowAllOb()
Exit Function
Case "标记"
Execute(Tid & ".innerHTML = ""&nbsp;""")
WinMsg = LoseMsg
Call ShowAllOb()
Exit Function
End Select

If z = "" & Rn & "" Then
Call ShowAllOb()
Alert(WinMsg)
End If
End Function

Function PutBn(Tid)
''//用右键做自助标记

''//如果是已经禁用的,则自动跳过
If Eval(Tid & ".Disable = ""True""") Then
If Eval(Tid & ".MineNum <> ""地雷""") Or Eval(Tid & ".MineNum <> ""标记""") Then
Exit Function
End If
End If

Execute(Tid & ".className = ""TdOver""")
Execute("MNum.style.color = ""#00FF00""")

''//标记类型
If Eval(Tid & ".MBN = """"") Then
''//标记为有雷
Execute(Tid & ".MBN = ""!""")
Execute(Tid & ".innerHTML = """ & Eval(Tid & ".MBN") & """")
Rm = Rm - 1
ElseIf Eval(Tid & ".MBN = ""!""") Then
''//标记为未知
Execute(Tid & ".MBN = ""?""")
Execute(Tid & ".innerHTML = """ & Eval(Tid & ".MBN") & """")
Rm = Rm + 1
Execute("BnNum.innerHTML = """ & MNum.Value + 1 & """")
ElseIf Eval(Tid & ".MBN = ""?""") Then
''//标记为一般状态
Execute(Tid & ".MBN = """"")
Execute(Tid & ".innerHTML = ""&nbsp;""")
Execute(Tid & ".className = ""TdOut""")
End If

Execute("BnNum.innerHTML = """ & Rm & """")

''//如果所标记的是雷标识,则计数
If Eval(Tid & ".MineNum = ""地雷""") Then
Ri = Ri - 1
ExeCute(Tid & ".MineNum = ""标记""")
''//下面2行代码可以用来作弊
''//Execute(Tid & ".innerHTML = " & z - Ri)
End If

End Function

Function ShowAllOb()
''//将所有障碍物反白
Dim Oi
For Oi = 0 To UBound(MineArr)
If Eval(MineArr(Oi) & ".MineNum = ""地雷""") Or Eval(MineArr(Oi) & ".MineNum = ""标记""") Then
Execute(MineArr(Oi) & ".style.color = ""#FF0000""")
Execute(MineArr(Oi) & ".bgcolor = ""#FF0000""")
Execute(MineArr(Oi) & ".Disable = ""True""")
Execute(MineArr(Oi) & ".innerHTML = ""地雷""")
Else
Call ShowTMN(MineArr(Oi))
End If
Next
End Function

</script>
<table border="1" align="center" cellpadding="2" cellspacing="1" class="TdOut">
<tr>
<td colspan="3" align="center"><a href="http://www.114xp.cn/" target="_blank">爱雪儿工作室</a> 2004年10月15日晚<br>
<table width="99%" style="height:1px; " border="0" cellpadding="0" cellspacing="0" bordercolor="#999999" bgcolor="#999999">
<tr><td></td></tr></table>
iXuEr Studio WebMine V1.0.0<br>
<a href="http://www.psysch.com/!guidy/" target="_blank">发现问题请通知作者修正,谢谢!</a></td>
</tr>
</table>
</body>
</html>