扫雷--生成雷阵图

lobo · 2019-03-04 11:15:43 · 1855 次点击 · 预计阅读时间 1 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2019-03-04 11:15:43 的文章,其中的信息可能已经有所发展或是发生改变。

// 埋雷 一维数组表示

function lei($m, $n, $k){

$arr = array();// 雷阵 该位置是否有雷1有0无
$arr_lei_num = array(); // 该位置周边雷的个数
$total = $total2 = $m*$n;
for($i=0; $i<$total; $i++){
    $arr[$i]=0;
    if( $k>0 && ($total2 <= $k || mt_rand(0,$total2) < $k)){
        $arr[$i]=1;
        $k--;
    }
    $total2--;
    if(empty($arr[$i])){
        continue;
    }
    foreach(array($i+1, $i-1, $i+$n,$i+$n-1,$i+$n+1,$i-$n,$i-$n+1,$i-$n-1) as $h){
        $abs = abs($i%$m - $h%$n);
        if($h>=0 && $h<$total && $abs<=1){ // 边界检查
            if(!isset($arr_lei_num[$h])){
                $arr_lei_num[$h] = 0;
            }
            $arr_lei_num[$h]++;
        }
    }
}
return array('lei'=>$arr, 'num'=>$arr_lei_num);

}


有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1855 次点击  
加入收藏 微博
5 回复  |  直到 2019-12-07 21:44:53
lobo
lobo · #1 · 5年之前

优化思路代码:

function buildLei($m, $n, $k){

            $lei = $aroundNum = [];

            $total = $n * $m;

            for ($i = 0; $i < $total; $i++){

                $x = $i % $m;

                $y = floor($i / $n);

                $lei[$x][$y] = 0;

                if( $k>0 && (($total - $i) <= $k || mt_rand(0,$total) < $k)){

                    $lei[$x][$y] = 1;

                    $k--;

                    foreach ([-1, 0, 1] as $x_dist){

                        if (($x_dist + $x) < 0 || ($x_dist + $x) >= $m){

                            continue;

                        }

                        foreach ([-1, 0, 1] as $y_dist){

                            if (($y_dist + $y) < 0 || ($y_dist + $y) >= $n){

                                continue;

                            }

                            if (($y_dist + $y) == $y && ($x_dist + $x) == $x){

                                continue;

                            }

                            if (!isset($aroundNum[$x_dist + $x][$y_dist + $y])){

                                $aroundNum[$x_dist + $x][$y_dist + $y] = 0;

                            }

                            $aroundNum[$x_dist + $x][$y_dist + $y]++;

                        }

                    }

                }

            }

            return array('lei'=>$lei, 'num'=>$aroundNum);
        }
jan-bar
jan-bar · #2 · 5年之前

可以去看看我的项目扫雷控制台版

lobo
lobo · #3 · 5年之前
jan-barjan-bar #2 回复

可以去看看我的项目[扫雷控制台版](https://studygolang.com/topics/10262)

666

lobo
lobo · #4 · 5年之前
lobolobo #1 回复

优化思路代码: function buildLei($m, $n, $k){ $lei = $aroundNum = []; $total = $n * $m; for ($i = 0; $i < $total; $i++){ $x = $i % $m; $y = floor($i / $n); $lei[$x][$y] = 0; if( $k>0 && (($total - $i) <= $k || mt_rand(0,$total) < $k)){ $lei[$x][$y] = 1; $k--; foreach ([-1, 0, 1] as $x_dist){ if (($x_dist + $x) < 0 || ($x_dist + $x) >= $m){ continue; } foreach ([-1, 0, 1] as $y_dist){ if (($y_dist + $y) < 0 || ($y_dist + $y) >= $n){ continue; } if (($y_dist + $y) == $y && ($x_dist + $x) == $x){ continue; } if (!isset($aroundNum[$x_dist + $x][$y_dist + $y])){ $aroundNum[$x_dist + $x][$y_dist + $y] = 0; } $aroundNum[$x_dist + $x][$y_dist + $y]++; } } } } return array('lei'=>$lei, 'num'=>$aroundNum); }

是否埋雷概率优化: // total:剩余的位置 left:剩余的雷数

function randTag($total, $left) {

return (mt_rand() % $total) <= $left;

}

bug修复:

$max = $m > $n ? $m : $n;

$x = $i % $max;

$y = floor($i / $max);

lobo
lobo · #5 · 5年之前
lobolobo #4 回复

#1楼 @lobo 是否埋雷概率优化: // total:剩余的位置 left:剩余的雷数 function randTag($total, $left) { return (mt_rand() % $total) <= $left; } bug修复: $max = $m > $n ? $m : $n; $x = $i % $max; $y = floor($i / $max);

实战引申:设计一个长期抽奖的系统,背景参与用户数量未知,奖品种类和数量已知,目的尽量使用户抽到奖品的概率一样; 假设:奖品a有100个,奖品b有200个,奖品c有500个 为了每次抽奖概率一样,我们设置a的概率5%,b的概率10%,c的概率20% 为此我们假设有个产品d的概率65%,但产品d不发放任何东西,相当于未中奖: mt_rand() % 10000<10000*0.05,中奖a

mt_rand() % 10000<10000*0.1,中奖b

mt_rand() % 10000<10000*0.2,中奖c

为了更安全,可以奖品个数分批配置,根据每段参与人数和时间,再调整概率

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传