修复豹子号5,30不显示中大奖的问题

This commit is contained in:
2026-03-07 15:27:52 +08:00
parent 4cf0da8092
commit 1de9af703a
3 changed files with 62 additions and 14 deletions

View File

@@ -38,7 +38,17 @@
</el-select>
</el-form-item>
<el-form-item v-if="formData.tier === 'BIGWIN'" label="权重(%)" prop="weight">
<el-slider v-model="formData.weight" :min="0" :max="100" :step="0.01" show-input />
<el-slider
v-model="formData.weight"
:min="0"
:max="100"
:step="0.01"
:disabled="isWeightFixed100"
show-input
/>
<div v-if="isWeightFixed100" class="weight-fixed-hint">
色子点数 530 固定 100% 豹子不可修改权重
</div>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input
@@ -92,6 +102,11 @@
set: (value) => emit('update:modelValue', value)
})
/** tier=BIGWIN 且 grid_number 为 5 或 30 时权重固定 100%,不可修改 */
const isWeightFixed100 = computed(
() => formData.tier === 'BIGWIN' && (formData.grid_number === 5 || formData.grid_number === 30)
)
/**
* 表单验证规则
*/
@@ -149,6 +164,19 @@
}
)
/** 当 BIGWIN 且 grid_number 为 5 或 30 时,权重固定为 100 便于展示 */
watch(
() => [formData.tier, formData.grid_number],
() => {
if (
formData.tier === 'BIGWIN' &&
(formData.grid_number === 5 || formData.grid_number === 30)
) {
formData.weight = 100
}
}
)
/**
* 初始化页面数据
*/
@@ -200,6 +228,8 @@
const payload = { ...formData }
if (payload.tier !== 'BIGWIN') {
payload.weight = 0
} else if (payload.grid_number === 5 || payload.grid_number === 30) {
payload.weight = 100
} else {
const w = Number(payload.weight)
payload.weight = Number.isNaN(w) ? 0 : Math.max(0, Math.min(100, w))
@@ -218,3 +248,11 @@
}
}
</script>
<style lang="scss" scoped>
.weight-fixed-hint {
margin-top: 6px;
font-size: 12px;
color: var(--el-text-color-secondary);
}
</style>

View File

@@ -36,8 +36,10 @@ class PlayStartLogic
private const MIN_COIN_EXTRA = 100;
/** 豹子号中大奖额外平台币(无 BIGWIN 配置时兜底) */
private const SUPER_WIN_BONUS = 500;
/** 可触发超级大奖的 grid_number5=全1 10=全2 15=全3 20=全4 25=全5 */
private const SUPER_WIN_GRID_NUMBERS = [5, 10, 15, 20, 25];
/** 可触发超级大奖的 grid_number5=全1 10=全2 15=全3 20=全4 25=全5 30=全6其中 5 和 30 固定 100% 出豹子 */
private const SUPER_WIN_GRID_NUMBERS = [5, 10, 15, 20, 25, 30];
/** grid_number 为 5 或 30 时豹子概率固定 100%DiceRewardConfig tier=BIGWIN 约定) */
private const SUPER_WIN_ALWAYS_GRID_NUMBERS = [5, 30];
/**
* 执行一局游戏
@@ -117,16 +119,21 @@ class PlayStartLogic
$realEv = (float) ($chosen['real_ev'] ?? 0);
$rewardWinCoin = 100 + $realEv; // 摇色子中奖平台币 = 100 + DiceRewardConfig.real_ev
// 当抽到的 grid_number 为 5/10/15/20/25 时,从缓存查 tier=BIGWIN 同 grid_number 的配置,按 weight 决定是否生成豹子组合
// 当抽到的 grid_number 为 5/10/15/20/25/30 时,可出豹子;其中 grid_number=5 与 30 固定 100% 豹子BIGWIN 约定)
$superWinCoin = 0;
$isWin = 0;
if (in_array($rollNumber, self::SUPER_WIN_GRID_NUMBERS, true)) {
$bigWinConfig = DiceRewardConfig::getCachedByTierAndGridNumber('BIGWIN', $rollNumber);
$weight = $bigWinConfig !== null
? max(0.0, min(100.0, (float) ($bigWinConfig['weight'] ?? 0)))
: 100.0;
$roll = mt_rand(1, 10000) / 10000;
if ($roll <= $weight / 100) {
$alwaysSuperWin = in_array($rollNumber, self::SUPER_WIN_ALWAYS_GRID_NUMBERS, true);
$doSuperWin = $alwaysSuperWin;
if (!$doSuperWin) {
$weight = $bigWinConfig !== null
? max(0.0, min(100.0, (float) ($bigWinConfig['weight'] ?? 0)))
: 100.0;
$roll = mt_rand(1, 10000) / 10000;
$doSuperWin = $roll <= $weight / 100;
}
if ($doSuperWin) {
$rollArray = $this->getSuperWinRollArray($rollNumber);
$isWin = 1;
$superWinCoin = $bigWinConfig !== null
@@ -307,11 +314,14 @@ class PlayStartLogic
}
/**
* 豹子组合:grid_number 5->[1,1,1,1,1]10->[2,2,2,2,2]15->[3,3,3,3,3]20->[4,4,4,4,4]25->[5,5,5,5,5]
* 豹子组合5->[1,1,1,1,1]10->[2,2,2,2,2]15->[3,3,3,3,3]20->[4,4,4,4,4]25->[5,5,5,5,5]30->[6,6,6,6,6]
* @return int[]
*/
private function getSuperWinRollArray(int $gridNumber): array
{
if ($gridNumber === 30) {
return array_fill(0, 5, 6);
}
$n = (int) ($gridNumber / 5);
$n = max(1, min(5, $n));
return array_fill(0, 5, $n);

View File

@@ -21,7 +21,7 @@ use think\model\relation\BelongsTo;
* @property $player_id 玩家id
* @property $lottery_config_id 彩金池配置
* @property $lottery_type 抽奖类型
* @property $is_win 是否中大奖:豹子号[1,1,1,1,1]~[5,5,5,5,5]为1否则0
* @property $is_win 是否中大奖:豹子号[1,1,1,1,1]~[6,6,6,6,6]为1否则0
* @property $win_coin 赢取平台币(= super_win_coin + reward_win_coin
* @property $super_win_coin 中大奖平台币(豹子时发放)
* @property $reward_win_coin 摇色子中奖平台币
@@ -115,8 +115,8 @@ class DicePlayRecord extends BaseModel
}
/**
* 是否豹子号中大奖5 个点数相同且为 1~5 之一
* @param int[] $rollArray 摇取点数数组,如 [1,1,1,1,1]
* 是否豹子号中大奖5 个点数相同且为 1~6 之一(含 [6,6,6,6,6]
* @param int[] $rollArray 摇取点数数组,如 [1,1,1,1,1] 或 [6,6,6,6,6]
* @return bool
*/
public static function isSuperWin(array $rollArray): bool
@@ -129,7 +129,7 @@ class DicePlayRecord extends BaseModel
return false;
}
$value = reset($unique);
return in_array($value, [1, 2, 3, 4, 5], true);
return in_array($value, [1, 2, 3, 4, 5, 6], true);
}
/** 是否中大奖 */