有个转盘需求 一共有9个奖品,一共会有16套概率,每次抽奖只会使用一套概率,请问各位大佬,有好的设计方式吗?
2. 问题描述?
有个转盘需求 一共有9个奖品,根据不同的条件组合,一共会有16套概率,每次抽奖只会使用一套概率,if else 写的手疼,请问各位大佬,有好的设计方式吗?
条件组合存在规律, 条件有优先级,每次抽奖只返回一套概率,目前我是把条件决定元素抽离出来,然后进行判断,决定使用16套概率中的一套概率,由这几个条件组成
/**
* 1 正常 2吐水
* @var int
*/
protected $level = 0;
/**
* 转盘 类型 1 普通 2 豪华
* @var int
*/
protected $luckTurntableType = 0;
/**
* 1 单抽
* 转盘抽奖类型 1k(单抽)、10k(10连抽)、50k(50连抽)
* @var int
*/
protected $gearType = 0;
/**
* 是否每日第一次抽取
* @var int 1 是 0 不是
*/
protected $dailyFirstPlay = 0;
/**
* 是否是暴击时刻 1 是 0 不是
* @var int
*/
protected $criticalMoment = 0;
/**
* 暴击时刻类型 1 A 礼物 2 B 礼物
* @var int
*/
protected $criticalMomentPrizeType = 0;
/**
* 是否是大奖 1 是 0 不是
* @var int
*/
protected $isGrandPrize = 0;
目前的实现方式
定义 根据条件组合获取的其中一套概率的类
<?php
/**
* 转盘策略
*/
class Services_LuckTurntableStrategyModel
{
/**
* 1 正常 2吐水
* @var int
*/
protected $level = 0;
/**
* 转盘 类型 1 普通 2 豪华
* @var int
*/
protected $luckTurntableType = 0;
/**
* 1 单抽
* 转盘抽奖类型 1k(单抽)、10k(10连抽)、50k(50连抽)
* @var int
*/
protected $gearType = 0;
/**
* 是否每日第一次抽取
* @var int 1 是 0 不是
*/
protected $dailyFirstPlay = 0;
/**
* 是否是暴击时刻 1 是 0 不是
* @var int
*/
protected $criticalMoment = 0;
/**
* 暴击时刻类型 1 A 礼物 2 B 礼物
* @var int
*/
protected $criticalMomentPrizeType = 0;
/**
* 是否是大奖 1 是 0 不是
* @var int
*/
protected $isGrandPrize = 0;
protected $controllerLog = [];
/**
* @param int $level
* @param int $luckTurntableType
* @param int $gearType
* @param int $dailyFirstPlay
* @param int $criticalMoment
* @param int $criticalMomentPrizeType
* @param int $isGrandPrize
*/
public function __construct(
int $level,
int $luckTurntableType,
int $gearType,
int $dailyFirstPlay,
int $criticalMoment,
int $criticalMomentPrizeType,
int $isGrandPrize
)
{
$this->level = $level;
$this->luckTurntableType = $luckTurntableType;
$this->gearType = $gearType;
$this->dailyFirstPlay = $dailyFirstPlay;
$this->criticalMoment = $criticalMoment;
$this->criticalMomentPrizeType = $criticalMomentPrizeType;
$this->isGrandPrize = $isGrandPrize;
}
public function main()
{
$this->controllerLog = [
'当前转盘所属区间' => $this->level == 1 ? '正常' : '吐水',
];
$this->controllerLog['是否暴击时刻'] = $this->criticalMoment == 0 ? '否' : '是';
$this->controllerLog['是否大奖保护'] = $this->isGrandPrize == 1 ? '是' : '否';
$this->controllerLog['暴击时刻礼物'] = $this->criticalMomentPrizeType == 1 ? 'A礼物' : 'B礼物';
$this->controllerLog['当前所属转盘'] = $this->luckTurntableType == Objects_LuckTurntableModel::GROUP_ID_1 ? '普通转盘' : '豪华转盘';
//正常概率
if ($this->level == 1) {
//正常概率(必中概率)
if (
$this->dailyFirstPlay == 1
) {
//单抽 -用户每日首次单抽走首次单抽概率
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_1) {
$this->controllerLog['当前抽奖档位类型'] = '单抽';
$this->controllerLog['当前所属概率'] = '正常-首次单抽-必中概率';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_1;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_1;
}
//5连抽 -第一轮抽奖走必中
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_5) {
$this->controllerLog['当前抽奖档位类型'] = '5连抽';
$this->controllerLog['当前所属概率'] = '正常-第一次抽奖走必中';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_1;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_1;
}
//10连抽 -第一轮抽奖走必中
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_10) {
$this->controllerLog['当前抽奖档位类型'] = '10连抽';
$this->controllerLog['当前所属概率'] = '正常-第一次抽奖走必中';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_1;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_1;
}
//非暴击时刻-50连抽 -第一轮抽奖走必中
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_50 && $this->criticalMoment == 0) {
$this->controllerLog['当前抽奖档位类型'] = '50连抽';
$this->controllerLog['当前所属概率'] = '正常-第一次抽奖走必中';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_1;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_1;
}
//暴击时刻-A礼物-50连抽-第一轮抽奖走必中
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_50 && $this->criticalMoment == 1 && $this->criticalMomentPrizeType == 1) {
$this->controllerLog['当前抽奖档位类型'] = '50连抽';
$this->controllerLog['当前所属概率'] = '正常-第一次抽奖走必中';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_5;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_5;
}
//暴击时刻-B礼物-50连抽-第一轮抽奖走必中
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_50 && $this->criticalMoment == 1 && $this->criticalMomentPrizeType == 2) {
$this->controllerLog['当前抽奖档位类型'] = '50连抽';
$this->controllerLog['当前所属概率'] = '正常-第一次抽奖走必中';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_9;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_9;
}
if ($this->luckTurntableType == Objects_LuckTurntableModel::GROUP_ID_1) {
//普通转盘-大奖保护-50连抽-第一轮抽奖走必中
if ($this->isGrandPrize == 1 && $this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_50) {
$this->controllerLog['当前抽奖档位类型'] = '50连抽';
$this->controllerLog['当前所属概率'] = '正常-第一次抽奖走必中';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_13;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_13;
}
}
if ($this->luckTurntableType == Objects_LuckTurntableModel::GROUP_ID_2) {
//豪华转盘-大奖保护-10连抽-第一轮抽奖走必中
if ($this->isGrandPrize == 1 && $this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_10) {
$this->controllerLog['当前抽奖档位类型'] = '50连抽';
$this->controllerLog['当前所属概率'] = '正常-第一次抽奖走必中';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_13;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_13;
}
}
}
//暴击时刻-普通转盘用户抽50连抽(只有50抽)使用暴奖概率-正常概率
if (
$this->criticalMoment == 1
&& $this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_50
&& $this->luckTurntableType == Objects_LuckTurntableModel::GROUP_ID_1
) {
//A 礼物
if ($this->criticalMomentPrizeType == 1) {
//50连抽 -剩余49次走正常概率
$this->controllerLog['当前抽奖档位类型'] = '50连抽';
$this->controllerLog['当前所属概率'] = '正常-剩余49次-正常概率';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_6;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_6;
}
//B 礼物B
if ($this->criticalMomentPrizeType == 2) {
//50连抽 -剩余49次走正常概率
$this->controllerLog['当前抽奖档位类型'] = '50连抽';
$this->controllerLog['当前所属概率'] = '正常-剩余49次-正常概率';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_10;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_10;
}
}
//大奖保护-正常概率
//1、48小时内用户连续抽50k(50连抽)个人中奖值达到200分且未抽中大奖礼物时会让用户走大奖保护概率(概率后台配置)
if ($this->isGrandPrize == 1) {
if ($this->luckTurntableType == Objects_LuckTurntableModel::GROUP_ID_1) {
//普通转盘-大奖保护-50连抽
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_50) {
//50连抽 -剩余49次走正常概率
$this->controllerLog['当前抽奖档位类型'] = '50连抽';
$this->controllerLog['当前所属概率'] = '正常-剩余49次-正常概率';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_14;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_14;
}
}
if ($this->luckTurntableType == Objects_LuckTurntableModel::GROUP_ID_2) {
//豪华转盘-大奖保护-10连抽-第一轮抽奖走必中
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_10) {
//50连抽 -剩余10次走正常概率
$this->controllerLog['当前抽奖档位类型'] = '50连抽';
$this->controllerLog['当前所属概率'] = '正常-剩余49次-正常概率';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_14;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_14;
}
}
}
//正常概率 - 非必中
//单抽
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_1) {
$this->controllerLog['当前抽奖档位类型'] = '单抽';
$this->controllerLog['当前所属概率'] = '正常-正常概率';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_2;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_2;
}
// 5连抽 - 剩余5次走正常概率
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_5) {
$this->controllerLog['当前抽奖档位类型'] = '10连抽';
$this->controllerLog['当前所属概率'] = '正常-剩余9次-正常概率';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_2;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_2;
}
// 10连抽 - 剩余9次走正常概率
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_10) {
$this->controllerLog['当前抽奖档位类型'] = '10连抽';
$this->controllerLog['当前所属概率'] = '正常-剩余9次-正常概率';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_2;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_2;
}
// 50连抽 - 剩余49次走正常概率
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_50) {
$this->controllerLog['当前抽奖档位类型'] = '50连抽';
$this->controllerLog['当前所属概率'] = '正常-剩余49次-正常概率';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_2;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_2;
}
$this->controllerLog['当前抽奖档位类型'] = '错误';
$this->controllerLog['当前所属概率'] = '错误';
$this->controllerLog['错误位置'] = 1;
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_2;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_2;
}
//吐水概率
if ($this->level == 2) {
//正常概率(必中概率)
if (
$this->dailyFirstPlay == 1
) {
//单抽 -用户每日首次单抽走首次单抽概率
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_1) {
$this->controllerLog['当前抽奖档位类型'] = '单抽';
$this->controllerLog['当前所属概率'] = '吐水-首次单抽-必中概率';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_3;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_3;
}
//5连抽 -第一轮抽奖走必中
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_5) {
$this->controllerLog['当前抽奖档位类型'] = '5连抽';
$this->controllerLog['当前所属概率'] = '吐水-第一次抽奖走必中';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_3;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_3;
}
//10连抽 -第一轮抽奖走必中
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_10) {
$this->controllerLog['当前抽奖档位类型'] = '10连抽';
$this->controllerLog['当前所属概率'] = '吐水-第一次抽奖走必中';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_3;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_3;
}
//非暴击时刻-50连抽 -第一轮抽奖走必中
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_50 && $this->criticalMoment == 0) {
$this->controllerLog['当前抽奖档位类型'] = '50连抽';
$this->controllerLog['当前所属概率'] = '吐水-第一次抽奖走必中';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_3;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_3;
}
//暴击时刻-A礼物-50连抽-第一轮抽奖走必中
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_50 && $this->criticalMoment == 1 && $this->criticalMomentPrizeType == 1) {
$this->controllerLog['当前抽奖档位类型'] = '50连抽';
$this->controllerLog['当前所属概率'] = '吐水-第一次抽奖走必中';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_7;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_7;
}
//暴击时刻-B礼物-50连抽-第一轮抽奖走必中
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_50 && $this->criticalMoment == 1 && $this->criticalMomentPrizeType == 2) {
$this->controllerLog['当前抽奖档位类型'] = '50连抽';
$this->controllerLog['当前所属概率'] = '吐水-第一次抽奖走必中';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_11;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_11;
}
//大奖保护-50/10连抽-第一轮抽奖走必中
if ($this->isGrandPrize == 1) {
if ($this->luckTurntableType == Objects_LuckTurntableModel::GROUP_ID_1) {
//普通转盘-大奖保护-50连抽-第一轮抽奖走必中
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_50) {
$this->controllerLog['当前抽奖档位类型'] = '50连抽';
$this->controllerLog['当前所属概率'] = '吐水-第一次抽奖走必中';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_15;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_15;
}
}
if ($this->luckTurntableType == Objects_LuckTurntableModel::GROUP_ID_2) {
//豪华转盘-大奖保护-10连抽-第一轮抽奖走必中
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_10) {
$this->controllerLog['当前抽奖档位类型'] = '10连抽';
$this->controllerLog['当前所属概率'] = '吐水-第一次抽奖走必中';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_15;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_15;
}
}
}
}
//暴击时刻-普通转盘用户抽50连抽(只有50抽)使用暴奖概率-正常概率
if (
$this->criticalMoment == 1
&& $this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_50
&& $this->luckTurntableType == Objects_LuckTurntableModel::GROUP_ID_1
) {
//A 礼物
if ($this->criticalMomentPrizeType == 1) {
//50连抽 -剩余49次走正常概率
$this->controllerLog['当前抽奖档位类型'] = '50连抽';
$this->controllerLog['当前所属概率'] = '吐水-剩余49次-正常概率';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_8;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_8;
}
//B 礼物B
if ($this->criticalMomentPrizeType == 2) {
//50连抽 -剩余49次走正常概率
$this->controllerLog['当前抽奖档位类型'] = '50连抽';
$this->controllerLog['当前所属概率'] = '吐水-剩余49次-正常概率';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_12;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_12;
}
}
//大奖保护-正常概率
//1、48小时内用户连续抽50k(50连抽)个人中奖值达到200分且未抽中大奖礼物时会让用户走大奖保护概率(概率后台配置)
if ($this->isGrandPrize == 1 && $this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_50) {
if ($this->luckTurntableType == Objects_LuckTurntableModel::GROUP_ID_1) {
//普通转盘-大奖保护-50连抽
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_50) {
//50连抽 -剩余49次走正常概率
$this->controllerLog['当前抽奖档位类型'] = '50连抽';
$this->controllerLog['当前所属概率'] = '吐水-剩余49次-正常概率';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_16;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_16;
}
}
if ($this->luckTurntableType == Objects_LuckTurntableModel::GROUP_ID_2) {
//豪华转盘-大奖保护-10连抽-第一轮抽奖走必中
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_10) {
//10连抽 -剩余10次走正常概率
$this->controllerLog['当前抽奖档位类型'] = '10连抽';
$this->controllerLog['当前所属概率'] = '吐水-剩余10次-正常概率';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_16;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_16;
}
}
}
//吐水-正常概率 - 非必中
//单抽
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_1) {
$this->controllerLog['当前抽奖档位类型'] = '单抽';
$this->controllerLog['当前所属概率'] = '吐水-正常概率';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_4;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_4;
}
// 5连抽 - 剩余5次走正常概率
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_5) {
$this->controllerLog['当前抽奖档位类型'] = '10连抽';
$this->controllerLog['当前所属概率'] = '吐水-剩余9次-正常概率';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_4;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_4;
}
// 10连抽 - 剩余9次走正常概率
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_10) {
$this->controllerLog['当前抽奖档位类型'] = '10连抽';
$this->controllerLog['当前所属概率'] = '吐水-剩余9次-正常概率';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_4;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_4;
}
// 50连抽 - 剩余49次走正常概率
if ($this->gearType == Objects_LuckTurntableModel::LOTTERY_TYPE_50) {
$this->controllerLog['当前抽奖档位类型'] = '50连抽';
$this->controllerLog['当前所属概率'] = '吐水-剩余49次-正常概率';
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_4;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_4;
}
$this->controllerLog['当前抽奖档位类型'] = '错误';
$this->controllerLog['当前所属概率'] = '错误';
$this->controllerLog['错误位置'] = 2;
$this->controllerLog['type'] = Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_4;
return Dao_LuckTurntablePrizeModel::PROBABILITY_TYPE_4;
}
}
}
高认可度评论:
好家伙,难怪我基本没中过奖
好家伙,难怪我基本没中过奖
switch case
把中奖概率都放在一个数组里面,用array_rand()随机取一个
好家伙,难怪我基本没中过奖
你的条件组合有规律吗?