<?
session_start();
print "<html>";
print "<head>";
print "<title>PHP挖地雷</title>";
print "</head>";
print "<body bgcolor=lightblue><center>";
print "<font size=5 face=Verdana color = red><b>PHP挖地雷</b>";
//echo "<pre>";
//print_r($_POST);
//echo "</pre>";
extract($_SESSION);
extract($_POST);
//设置默认的地图大小和雷的数量
if ($submit=="")
{
$NumMine=4; //存储雷的数量
$RowSize=5; //存储行数
$ColSize=5; //存储列数
$generer=1; //控制玩家是否是点击的开始按钮或者点击的雷区
}
//第一次进入本页面中,初始化游戏
if($generer==1)
{
srand((double)microtime()*100000000);
$time_start=time(); //记录开始的时间
//判断输入的数值是否正确
if(($RowSize<=1) || ($ColSize<=1) || ($NumMine==0))
{
print "<p><br><font size=-1 color=red>行数,列数或地雷数输入错误!!</font>";
exit;
}
if($NumMine > $RowSize*$ColSize)
{
print "<p><br><font size=-1 color=red>地雷数太多!</font>";
exit;
}
unset($Mine);
unset($Decouv);
//初始化地图,Mine数组记录地雷的位置数组,Decouv数组记录整个地图的每个方块的状态
//全部初始化为0
for($Row=1;$Row<=$RowSize;$Row++)
{
for($Col=1;$Col<=$ColSize;$Col++)
{
$Mine[$Row][$Col]="0";
$Decouv[$Row][$Col]="0";
}
}
//临时记录你布雷的数量
$index=0;
//确定地图中地雷的位置
while($index<$NumMine)
{
$Row=rand(1,$RowSize);
$Col=rand(1,$ColSize);
if($Mine[$Row][$Col]=="0")
{
$Mine[$Row][$Col]="1";
$index++;
}
}
}
else
{
$perdu=0; //记录玩家点的方格是否为地雷
$reste=$RowSize*$ColSize; //记录玩家没有点开方格的数量,判断用户是否赢得比赛,初始化为整个雷区的方格数
//这两个for循环接受玩儿家点击之前的信息,并对玩儿家点击的方块进行判断
for($Row=1;$Row<=$RowSize;$Row++)
{
for($Col=1;$Col<=$ColSize;$Col++)
{
if($Decouv[$Row][$Col]=="1") {$reste=$reste-1;} //计算用户已经点开了多少的方块,每次提交都重新计算一次
$temp="submit".$Row.$Col; //根据用户点击的submit的名字判断玩家点击的是哪个方块
if($$temp=="X")
{
$reste=$reste-1;
if($Mine[$Row][$Col]=="0") //当用户点击的方块不是雷,则标记Decouv数组方块已经点开
{
$Decouv[$Row][$Col]="1";
}
else
{
$perdu=1;
}
}
}
}
//如果perdu变量为1则说明用户点中了雷
if($perdu==1)
{
print "<h2><font color=red>您输啦!</font></h2>";
for($i=1;$i<=$RowSize;$i++)
{
for($j=1;$j<=$ColSize;$j++)
{
$Decouv[$i][$j]="1";
}
}
}
//玩家最终留下的方格数等于雷的数量并且玩儿家没有点中雷
if(($reste==$NumMine)&&($perdu!=1))
{
print "<h2>你赢啦!</h2>";
$time_stop=time();
$time=$time_stop-$time_start; //得到总共使用的分钟数
print "<p><font size=-1><i>您所用的时间为: $time 秒</i></font>";
for ($i=1;$i<=$RowSize;$i++)
{
for($j=1;$j<=$ColSize;$j++)
{
$Decouv[$i][$j]="1";
}
}
}
}
print "<form method=post action='$PHP_SELF'>";
$_SESSION['time_start'] = $time_start;
$_SESSION['NumMine'] = $NumMine;
$_SESSION['RowSize'] = $RowSize;
$_SESSION['ColSize'] = $ColSize;
$_SESSION['generer'] = 0;
print "<p><table border=1 cellpadding=8>";
//此双重for循环打印雷区
for($Row=1; $Row<=$RowSize; $Row++)
{
print "<tr>";
for($Col=1; $Col<=$ColSize; $Col++)
{
$nb=0; //通过此变量来计算每个方格四周的雷的数量
//遍历每个方格的四周,记录雷数
for($i=-1; $i<=1; $i++)
{
for($j=-1; $j<=1; $j++)
{
if($Mine[$Row+$i][$Col+$j] == "1")
{
$nb++;
}
}
}
//打印雷区表格
print "<td width=20 height=20 align=center valign=middle>";
//用户点击Row行,Col列的方格后
if($Decouv[$Row][$Col]=="1")
{
if($nb==0)
{
print " "; //如果此方格四周无雷,显示空格
}
else
{
//用户点中雷后,显示红色*,代表雷
if($Mine[$Row][$Col]=="1")
{
print "<font color=red>*</font>";
}
else//如果玩家点中的不是雷,显示周围的雷的数量
{
print "$nb";
}
}
}
else
{
print "<input type=hidden name=submit value=okd>";
print "<input type=submit name=submit".$Row.$Col." value=X>";
}
$_SESSION['Mine'] = $Mine;
$_SESSION['Decouv'] = $Decouv;
print "</td>";
}
print "</tr>";
}
print "</table>";
print "</form>";
?>
<hr>
<form method=post>
行数 : <input type=text name=RowSize value=5 size=2>
<br>
列数 : <input type=text name=ColSize value=5 size=2>
<br>
地雷数 : <input type=text name=NumMine value=4 size=2>
<p>
<input type=submit name=submit value=开始>
<input type=hidden name=generer value=1>
</form>
</body>
</html>