首先上图
首先就是页面初始数据渲染:
页面大体就是这些,接口获取奖项列表,然后访问后端计算概率接口获取到奖项位置,然后返回给小程序端,小程序端有了这个位置不管转动多少圈最终中奖位置都是这里。
接下来后端代码:
//根据概率获取奖项位置
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 <string, unknown>
*/
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了。