@whqet 好久没有写博客,这段时间我一直在用php做扫雷,首先说我要学php之前在新浪博客写,第三篇才到这里学,我不会php不会javascript,就会点html+css,所以现在自学中,有点累。但也在不断努力中希望。说道学习,与其说学习,不如说看着w3cschool的php资料,不断的在用案例实践,看完php的基础内容后,我也想到一些要做的东西,比如九九乘法表,比如用表单做计算器,这些都是简单的东西,循环,然后echo,后者是$_POST传值相加。但是第三个例子是想做一个扫雷。希望给自己一个挑战。
首先声明我没有看任何关于扫雷的资料,但是我在做的时候游戏需要的函数还是从网络来的,因为我想做好了,在对比那些大神们的思路,在来反思我自己的思路。在有点点提高。好吧,个人想法而已,轻拍,虽然没人看。
首先是思路。1.布局,用php循环生成按钮。2.生成雷。3生成数字。4。点击按钮显示并让按钮不可点击,点到雷停止游戏。5.点到空格时候展开。
我承认第五个是最难的。甚至是卡了我半天的时间,直到现在也没有做出来,首先看看我的想法是怎么样的。下图是我的界面图
我是这么想的点到空格,那么周边的八个必须让他变成已选状态。即disabled的状态变成true。如果周边还有空格的,我让周边的空格 的周边八个也为已选;
以为想起来比较复杂,我是画了下面的流程图。
思路上应该是没有错。但是就是没有做出来,希望庆哥给点意见。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<style>
.button {
margin:0;
padding:0;
width:30px;
height:30px;
padding:5px 0;
}
</style>
</head>
<body>
<!-------------- --- 设置选项--------------------->
<form action="cs_sl.php" method="post">
设置行数目:
<input type="text" name="num_hang" value="<? if($_POST[num_hang]=="") {$_POST[num_hang]=9;} echo $_POST[num_hang];?>"/>
设置列数目:
<input type="text" name="num_lie" value="<? if($_POST[num_lie]=="") {$_POST[num_lie]=9;} echo $_POST[num_lie];?>"/>
设置雷数量:
<input type="text" name="num_lei" value="<? if($_POST[num_lei]=="") {$_POST[num_lei]=19;} echo $_POST[num_lei];?>"/>
<input type="submit" value="确定"/>
</br>
<form>
<!-----------------------设置行数与雷数------------------>
<?
if($_POST[num_hang]<9 or $_POST[num_lie]<9 or $_POST[num_lei]<9)
{
echo "行列高不能有一个小于9";
exit;
}
?>
<!----------------------随机产生雷-------------------->
<?
for($i=0;$i<=$_POST[num_hang]+1;$i++)
for($j=0;$j<=$_POST[num_lie]+1;$j++)
{
$lei[$i][$j]="空";//给先给数组每个都赋值为空
}
for($i=1;$i<=$_POST[num_lei];$i++)
{
$num_rand1=rand(1,$_POST[num_hang]);//随机值1
echo $num_rand1;
$num_rand2=rand(1,$_POST[num_lie]);//随机值2
echo $num_rand2." ";
if($lei[$num_rand1][$num_rand2]=="雷")//如果是该数值是雷重新随机一次
{
$i--;
}
else
{
$lei[$num_rand1][$num_rand2]="雷";//给某个数值赋值雷
}
}
echo "</br>";
for($j=1;$j<=$_POST[num_hang];$j++)
{
for($k=1;$k<=$_POST[num_lie];$k++)//判断某个空 旁边有多少个雷,赋予值
{$i=0;
if($lei[$j][$k]=="雷")
continue;
if($lei[$j-1][$k]=="雷")
$i++;
if($lei[$j-1][$k-1]=="雷")
$i++;
if($lei[$j][$k-1]=="雷")
$i++;
if($lei[$j+1][$k]=="雷")
$i++;
if($lei[$j+1][$k+1]=="雷")
$i++;
if($lei[$j][$k+1]=="雷")
$i++;
if($lei[$j-1][$k+1]=="雷")
$i++;
if($lei[$j+1][$k-1]=="雷")
$i++;
$lei[$j][$k]=$i." ";
}
}
/*************************测试数据**********************************/
$i=0;
for($j=0;$j<=$_POST[num_hang]+1;$j++)
{
for($k=0;$k<=$_POST[num_lie]+1;$k++)
{
echo $lei[$j][$k]."";
if($lei[$j][$k]=="雷")
{
$i++;
}
}
echo "</br>";
}
echo $i."</br>";
?>
<!--------------------------循环生成按钮-------------------------->
<?
$a_h=1;
$a_z=1;
for($a_h=1;$a_h<=$_POST[num_hang];$a_h++)
{
for($a_z=1;$a_z<=$_POST[num_lie];$a_z++)
{
$a_xx=$a_h."_".$a_z;
echo "<input type='button' class='button' id='b".$a_h."_".$a_z."' name='".$lei[$a_h][$a_z]."' οnclick='myfunction(this)' />";
}
echo "</br>";
//myfunction(".$a_h.",".$a_z.",this,".$lei[$a_h][$a_z].")
// value='".$lei[$a_h][$a_z]."'
}
?>
</form>
<script>
function myfunction(obj){
var a=obj.id;
var b=a.indexOf("_");
var c=a.substr(1,b-1);
var d=a.substr(b+1,a.length);
if(obj.name=="雷")
{
obj.value=obj.name;
alert("踩到雷了!游戏结束!");
obj.disabled=true;
}
else if(obj.name=="0 ")
{
obj.value=" ";
obj.disabled=true;
function0(c,d,obj);
}
else
{
obj.value=obj.name;
obj.disabled=true;
}
}
function function0(a2,b2,obj2)
{
var flag =0;
//
if(document.getElementById("b"+(a2-1)+"_"+(b2-1)).disabled!=true)//左上角
{
fun0_id="b"+(a2-1)+"_"+(b2-1);
document.getElementById(fun0_id).disabled=true;
kg_zbxs(fun0_id);
}
else{
flag++;
}
if(document.getElementById("b"+(a2-1)+"_"+(b2)).disabled!=true)//正上
{
fun0_id="b"+(a2-1)+"_"+(b2);
document.getElementById(fun0_id).disabled=true;
kg_zbxs(fun0_id);
}
else{
flag++;
}
if(document.getElementById("b"+(a2-1)+"_"+(Number(b2)+1)).disabled!=true)//右上角
{
fun0_id="b"+(a2-1)+"_"+(Number(b2)+1);
document.getElementById(fun0_id).disabled=true;
kg_zbxs(fun0_id);
}else{
flag++;
}
if(document.getElementById("b"+(Number(a2))+"_"+(Number(b2)-1)).disabled!=true)//左边
{
fun0_id="b"+(Number(a2))+"_"+(Number(b2)-1);
document.getElementById(fun0_id).disabled=true;
kg_zbxs(fun0_id);
}else{
flag++;
}
if(document.getElementById("b"+(Number(a2))+"_"+(Number(b2)+1)).disabled!=true)//右边
{
fun0_id="b"+(Number(a2))+"_"+(Number(b2)+1);
document.getElementById(fun0_id).disabled=true;
kg_zbxs(fun0_id);
}else{
flag++;
}
//
if(document.getElementById("b"+(Number(a2)+1)+"_"+(Number(b2)-1)).disabled!=true)//左下角
{
fun0_id="b"+(Number(a2)+1)+"_"+(Number(b2)-1);
document.getElementById(fun0_id).disabled=true;
kg_zbxs(fun0_id);
}else{
flag++;
}
if(document.getElementById("b"+(Number(a2)+1)+"_"+(Number(b2))).disabled!=true)//正下
{
fun0_id="b"+(Number(a2)+1)+"_"+(Number(b2));
document.getElementById(fun0_id).disabled=true;
kg_zbxs(fun0_id);
}else{
flag++;
}
if(document.getElementById("b"+(Number(a2)+1)+"_"+(Number(b2)+1)).disabled!=true)//右下角
{
fun0_id="b"+(Number(a2)+1)+"_"+(Number(b2)+1);
document.getElementById(fun0_id).disabled=true;
kg_zbxs(fun0_id);
}else{
flag++;
}
if(flag==8)
{
return 0;
}
}
function kg_zbxs(kg_id)//空格周边显示
{
if(document.getElementById(kg_id).name=="0 ")
document.getElementById(kg_id).value=" ";
else
document.getElementById(kg_id).value=document.getElementById(kg_id).name;
}
</script>
</body>
</html>
上面是源代码,php文件的现在我实现的效果是这样子的。我的操作是这样子的,关于没展开的全的问题是,我没有进一步完善下去,但是也看到最上面点开的空格没有展开,原因是这样子的,我的点开空格的遍历顺序是从上到下,从左到右,最上面的左上角是空所以就停止了,然后就不展开了,这个就是一个我不知道为什么这样了,按我的思路他应该展开是没有问题的,可是为什么呢?继续研究了。