JS + PHP 扫雷

最近2天闲来无事写了个JS + PHP 扫雷

本来预计是要用PHP写的,结果写着写着就 变JS的了....

源码放出大家多多指教

mine.js

 var row;                                            //雷区的行数
 var col;                                            //雷区的列数
 var minenum;                                        //雷区的总雷数
 var href = "mine.html";                            //提交页面 (开始按钮)
 var Mine =new Array(new Array(),new Array());        //是否为雷(X为雷)
 var numEmpty =new Array(new Array(),new Array());    //判断格子是否已经处理过 2为(没处理过的) 1为雷,0为已经处理过的
 var ids;                                            //按钮id
 var v;                                                //按钮id数组 v[0]是row    v[1]是col
 var biaoji = new Array();                            //用来标记还没循环过的空格
 var winnum;                                        //记录非雷的格子(行*列-雷数)总剩余格子

 function setRowColMine()    //重新开始
 {
    row = document.getElementById('RowSize').value;
    col = document.getElementById('ColSize').value;
    minenum = document.getElementById('NumMine').value;
    var src =href+"?minenum="+minenum+"&row="+row+"&col="+col;
    window.location.href = src;
 }
var state = 0;                //计时器的开始标记
var ms = 0;                   //已经用时几秒
var then;                        //开始时间的对象
function setId(obj)    //点击按钮
{
    var id = obj.id;
    startGame(id);
    start();
    times();
}

function start()    //启动计时器
{
    if (state == 0)
    {
        state = 1;
        then = new Date();
        then.setTime(then.getTime() - ms);
    }
}
function times()  //计时器
{
    setTimeout("times();", 1000);
    if (state == 1)
    {
        now = new Date();
        ms = now.getTime() - then.getTime();
        ms =ms / 1000;
        document.getElementById('time').value = parseInt(ms)
    }
}


 function startGame(id)    //游戏过程
 {
    var mine_id = 'mine_'+id ;       
    var mine_value = document.getElementById(mine_id).value;        //是否为雷(X为雷)
    var hid_id = 'hid_'+id;            //附近有多少雷的层  ID
    var hid_btn = 'hid_btn_'+id;    //附近有多少雷的按钮ID
    var minnum = document.getElementById(hid_btn).value;        //附近有多少雷的值
    v = id.split("_");
    v[0] = parseInt(v[0]);
    v[1] = parseInt(v[1]);
    if(mine_value=="O")
    {
       
        if(minnum == '0')
        {
            document.getElementById(id).style.display='none';
            numEmpty[v[0]][v[1]] = '0';    //标记格子为已经处理过的 2为(没处理过的) 1为雷,0为已经处理过的
            showEmpty(id);
        }
        else
        {
            document.getElementById(id).style.display='none';
            document.getElementById(hid_id).style.display='block';        //附近有多少雷的层显示
            numEmpty[v[0]][v[1]] = '0'; //标记格子为已经处理过的 2为(没处理过的) 1为雷,0为已经处理过的

        }
        //↓  计算已经处理过的格子数, 如果跟总剩余格子相等即为胜利
        var win=0; //计算已经处理过的格子数
        for(var m=0;m<=row;m++)
        {
            for(var n=0;n<=col;n++)
            {
                if(numEmpty[m][n] == '0')
                {
                    win++;
                }
            }
        }
        //alert('**'+win+'**'+numEmpty);
        if(winnum == win)
        {
            alert("你赢了");
            setRowColMine();        //重新开始
        }
    }
    else
    {
        alert('你输了');
        setRowColMine();             //重新开始
    }
 }
 
function showEmpty(id)        //显示空白格子
{

    v = id.split("_");
    v[0] = parseInt(v[0]);
    v[1] = parseInt(v[1]);

    var mine_id = 'mine_'+id ;
    var hid_btn = 'hid_btn_'+id;
    var hid_id = 'hid_'+id;                                        //附近有多少雷的层  ID
    var minnum = document.getElementById(hid_btn).value;        //附近有多少雷的值
    for(var i=-1;i<=1;i++)
    {
        for(var j=-1;j<=1;j++)
        {   
            var rownum = v[0] + i;
            var colnum = v[1] + j;
            //周围格子的行,列要大于1,小于总数
            if(rownum >=1 && rownum <= row && colnum >=1 && colnum <= row )
            {
                idd=rownum+'_'+colnum;
                //*
                var hbtn = 'hid_btn_'+idd;
                var hid = 'hid_'+idd;   
                var mins = document.getElementById(hbtn).value;        //附近有多少雷的值
                if(i == 0 && j == 0 )  //不能循环判断自己(否则死循环)
                {
                    continue;
                }
                if(numEmpty[rownum][colnum] == '0') //如果判断过的格子就跳过
                {
                    continue;
                }
                //(if条件)没有处理过的,空白格子
                if(numEmpty[rownum][colnum] == '2'&& mins == '0')
                {
                    document.getElementById(idd).style.display='none'; //隐藏按钮
                    numEmpty[rownum][colnum] = '0';
                    biaoji.push(idd);    //没有处理过的,空白格子放进标记数组中 等待下次递归执行
                    continue;
                }
                if(Mine[rownum][colnum] != 'X' && mins != '0') //自己不为雷 但是附近有雷
                {
                    document.getElementById(idd).style.display='none';        //隐藏按钮
                    document.getElementById(hid).style.display='block';        //附近有多少雷的层显示
                    numEmpty[rownum][colnum] = '0';
                    continue;
                   
                }
               
            }
        }
    }
    //循环标记数组,确保每个空白格子都进行过递归
    for(var b=0;b<biaoji.length;b++)
    {
        var sid = biaoji[b];
        biaoji.shift();        //删除已经执行递归的空白格子
        showEmpty(sid);        //递归调用 显示空白格子
    }
 }

 function loading(r,w,mines)        //初始化
 {
    row = r;
    col = w;
    minenum = mines;
   
    //var Mine[] =new Array();
    //初始化地雷类
    for(var Rows=1;Rows<row+1;Rows++)
    {
        Mine[Rows]= new Array();
        numEmpty[Rows] = new Array();
        for(var Cols=1;Cols<col+1;Cols++)
        {
            Mine[Rows][Cols]="O";            //O为非雷  X为雷
            numEmpty[Rows][Cols]= '2';        //初始化标记数组为2(没处理过的) 1为雷,0为已经处理过的
            //Decouv[Rows][Cols]="a";
        }
        //alert(Rows);
    }
    //alert(minenum);
    index=0;    //布雷索引
   
    while(index<minenum)    //随机设置雷
    {
        Rows=parseInt(Math.random()*10 % row)+1;
        Cols=parseInt(Math.random()*10 % col)+1;
        //alert(Rows+'-'+Cols);
        if(Mine[Rows][Cols]=="O")            //O为非雷  X为雷
        {
            Mine[Rows][Cols]="X";            //O为非雷  X为雷
            numEmpty[Rows][Cols]='1';        //初始化标记数组为2(没处理过的) 1为雷,0为已经处理过的
            index++;
        }
    }
    winnum = row*col - minenum;            //初始化非雷的格子
    //document.getElementById('win').value = winnum;
    //根据随机雷 设置隐藏按钮显示的数字
    for(Rows=1;Rows<=row;Rows++)
    {
        for(Cols=1;Cols<=col;Cols++ )
        {
            mnum=0;                        //计算附近格子有多少个雷
            for(i=-1; i<=1; i++ )
            {
                for(j=-1; j<=1; j++ )
                {
                    var rownum = Rows + i;
                    var colnum = Cols + j;
                    //行,列数都要大于1 小于总数
                    if(rownum >=1 && rownum <= row && colnum >=1 && colnum <= row && Mine[rownum][colnum]== "X")
                    {
                        mnum++;
                    }
                }
            }
            var grid = Rows+'_'+Cols;
            var mine_grid = 'mine_'+grid;
            var hid_grid = 'hid_'+grid;
            var hid_btn = 'hid_btn_'+grid;
            //设置隐藏按钮的雷数
            document.getElementById(mine_grid).value = Mine[Rows][Cols];
            document.getElementById(hid_btn).value = mnum;
        }
    }

    //alert(row+'-'+col+'-'+mine);
 }

mine.php

<?php
    header('Content-type: text/html;charset=UTF-8');
    $generer=1;
    if ( empty($_GET['row']) || empty($_GET['col']) || empty($_GET['minenum']) || $_GET['minenum'] < 1 || $_GET['minenum'] >= $_GET['col'] * $_GET['row'])
    {//初始化
        if($_GET['row'] >30 || $_GET['col']>24 || $_GET['minenum']>667)
        {
            $NumMine=10;    //地雷数
            $RowSize=9;    //行数
            $ColSize=9;    //列数
        }
    }else
    {
       
        $RowSize = $_GET['row'];
        $ColSize = $_GET['col'];
        $NumMine = $_GET['minenum'];
    }
    $strs= $RowSize.','.$ColSize.','.$NumMine;

?>
<html>
<head>
<title>test_php</title>
</head>

<script language="JavaScript" type="text/javascript" src="mine.js"></script>




<body bgcolor=#FFFFCC οnlοad=loading(<?php echo $strs?>)><center>

<font size=3 face=Verdana><b>挖雷</b>
<hr>
<form method=post name="begin" id='begin' action='mine.php'>
行数 : &nbsp;
<input type = 'text' id='RowSize' value="<?php echo $RowSize?>" size=2 maxlength=2 onKeyUp="value=value.replace(//D/g,'')">(5-30)
<br>
列数 : &nbsp;
<input type = 'text' id='ColSize' value="<?php echo $ColSize?>" size=2 maxlength=2 onKeyUp="value=value.replace(//D/g,'')">(5-24)
<br>
雷数 : &nbsp;
<input type='text' id='NumMine' value="<?php echo $NumMine?>" size=2 maxlength=3 onKeyUp="value=value.replace(//D/g,'')">(1-667)
<br>
用时:<INPUT TYPE="text" id="time" value="000" disabled='disabled' size=2>

<p>
<input  type='button' name='stars' value="开始" οnclick="setRowColMine()">
<input type='hidden' name='generer' value=1>
</form>
<?php

    echo '<div id = tdiv>';
    echo '<form method=get id="play" >';
    echo '<p><table border=1 cellpadding=1 id = "playtable">';
    for($Row=1; $Row<=$RowSize; $Row++)
    {
        echo "<tr>";
        for($Col=1; $Col<=$ColSize; $Col++)
        {
            $grid = $Row.'_'.$Col;
            $hid_grid = 'hid_'.$grid;
            $hid_btn = 'hid_btn_'.$grid;
            $mine_grid = 'mine_'.$grid;
            echo "<td style='width:25px;height:27px;'><input type=button style='width:23px;height:23px;' id=$grid name=$grid οnclick=setId(this) value=''>";
              echo "<input type=hidden id=$mine_grid name=$mine_grid >";
              echo "<div id=$hid_grid  style='display:none;'><input class='class1' style='width:23px;height:23px;' disabled='disabled' id=$hid_btn type=button name=$hid_grid value='0'></td></div>";

        }
        echo '</tr>';
    }
    echo '</table>';
    echo '</form>';
    echo '</div>';

?>

</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值