小程序九宫格抽奖+中奖概率

首先上图



首先就是页面初始数据渲染:


页面大体就是这些,接口获取奖项列表,然后访问后端计算概率接口获取到奖项位置,然后返回给小程序端,小程序端有了这个位置不管转动多少圈最终中奖位置都是这里。

接下来后端代码:

//根据概率获取奖项位置

public function get_draw(){

  $url="draw/prize_list";//奖项列表api接口

    $data['type_name'] = '九宫格抽奖';

  $data['shop_id'] = input('shop_id');

  $data['order_id'] = input('order_id');

    $res= getData($url,$data);

    if ($res['code']==1) {

    $prize_arr=$res['data']['draw_list'];

    }else{

    $prize_arr='';

    }


      foreach ($prize_arr as $k=>$v) {

    $arr[$v['id']] = $v['probability'];//这里是设定的概率值 值越高 中奖几率越大(0-100)

}

      $prize_id = $this->getRand($arr); //根据概率获取奖项id

      foreach($prize_arr as $k=>$v){ //获取前端奖项位置

          if($v['id'] == $prize_id){

          $prize_site = $k;

          break;

          }

      }

      $res = $prize_arr[$prize_id - 1]; //中奖项

      $arr = array_map('array_shift',$prize_arr);


      $key = array_search($prize_id,$arr);

      $data=[

        'prize_id'=>$res['id'],

        'id'=>$key,

        'type'=>$res['type'],

        'image_url'=>$res['image_url'],


        ];

        return json($data);

    }


    /**

    * 根据概率获取奖项

    * @param unknown $proArr

    * @return Ambigous

    */

    function getRand($proArr)

    {

        $result = '';

        //概率数组的总概率精度

        $proSum = array_sum($proArr);

        //概率数组循环

        foreach ($proArr as $key => $proCur) {

            $randNum = mt_rand(1, $proSum);

            if ($randNum <= $proCur) {

                $result = $key;

                break;

            } else {

                $proSum -= $proCur;

            }

        }

        unset ($proArr);

        return $result;

    }

这里计算出中奖项返回给小程序端就ok了。

你可能感兴趣的:(小程序九宫格抽奖+中奖概率)