这里实现最基础的功能,获取盲盒直接掉接口就可以获取
controller层代码
//获取盲盒操作
public function getBlindBox()
{
$data = $this->input->post();
if (empty($data['uid']) || empty($data['num'])){
fail(400,'缺少参数!');
}
$this->Activity_service->getBlindBox($data['uid'],$data['num']);
}
//开启盲盒操作
public function openBlindBox()
{
$data = $this->input->post();
if (empty($data['uid']) || empty($data['num'])) {
fail(400, '参数错误!');
}
$this->Activity_service->openBlindBox($data['uid'], $data['num']);
}
service层代码
//获取盲盒操作
public function getBlindBox($uid, $num)
{
$key = $uid."_BlindBoxNum";
$res = $this->conn->incrBy($key, $num);
if ($res) {
$data=[
'uid' => $uid,
'num' => $num,
];
success($data);
}
}
//开启盲盒操作
public function openBlindBox($uid, $num)
{
if ($num <= 0) {
fail(400, '开启盲盒数量错误');
}
//获取我的盲盒数量
$key = $uid . "_BlindBoxNum";
$boxNum = $this->conn->get($key);
if ($boxNum < $num) {
fail(400, '盲盒数量不够');
}
//锁
$lockKey = $uid . "_openBlindBoxLock";
if (!$this->conn->setNxExpire($lockKey, 1, 3)) {
fail(400, '系统繁忙,稍后重试');
}
//扣除盲盒数量
$this->conn->incrBy($key, -$num);
//开启盲盒获得的字符奖励
$charList = $this->blindBox($num);
//将字符增加到我的字符集中
$myCharKey = $uid . '_charNum';
foreach ($charList as $k => $v) {
//将奖信息存储起来
$this->conn->hIncrBy($myCharKey, $k, $v);
}
success($charList);
}
//抽取盲盒获取获得的字符数量数组
public function blindBox($num)
{
//盲盒的全部字符获取概率
$rate = [
0 => 333, //字符W 概率333/1000
1 => 333, //字符Y 概率333/1000
2 => 222, //字符Q 概率222/1000
3 => 111, //字符G 概率111/1000
4 => 1, //幸运大奖 概率1/1000
];
$res = [];
for ($i = 0; $i < $num; $i++) {
//调用公共函数通过概率获取本次中奖的字符
$index = rateGetAward($rate);
//每种字符中奖的个数
$res[$index] += 1;
}
return $res;
}
公共函数代码
通过概率得到本次抽中的物品
//计算概率 [$index=>$rate] $rate为概率,$index,返回中奖的物品
if (!function_exists('rateGetAward')){
function rateGetAward($data)
{
//概率总和
$sum = array_sum($data);
//随机的1到概率总和
$index = rand(1, $sum);
//区间左
$min = 1;
foreach ($data as $k => $v) {
//区间右为区间左加上当前$k的$v
$max = $min + $v;
//在该区间中则中奖
if ($index >= $min && $index < $max) {
return $k;
}
//区间右变区间左
$min = $max;
}
}
}
数据返回
获得盲盒
{
"code": 200,
"msg": "success",
"data": {
"uid": "1", //用户id
"num": "100" //本次增加的盲盒个数
}
}
开启盲盒
{
"code": 200,
"msg": "success",
"data": {
"1": 34, //Y字符获取的个数
"3": 10, //G字符获取的个数
"2": 26, //Q字符获取的个数
"0": 30 //W字符获取的个数
}
}