diff --git a/saiadmin-artd/src/views/plugin/dice/reward_config/index/modules/edit-dialog.vue b/saiadmin-artd/src/views/plugin/dice/reward_config/index/modules/edit-dialog.vue index 63d89e1..b953a15 100644 --- a/saiadmin-artd/src/views/plugin/dice/reward_config/index/modules/edit-dialog.vue +++ b/saiadmin-artd/src/views/plugin/dice/reward_config/index/modules/edit-dialog.vue @@ -38,7 +38,17 @@ - + +
+ 色子点数 5、30 固定 100% 豹子,不可修改权重 +
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 @@ } } + + diff --git a/server/app/api/logic/PlayStartLogic.php b/server/app/api/logic/PlayStartLogic.php index a7749af..2054a98 100644 --- a/server/app/api/logic/PlayStartLogic.php +++ b/server/app/api/logic/PlayStartLogic.php @@ -36,8 +36,10 @@ class PlayStartLogic private const MIN_COIN_EXTRA = 100; /** 豹子号中大奖额外平台币(无 BIGWIN 配置时兜底) */ private const SUPER_WIN_BONUS = 500; - /** 可触发超级大奖的 grid_number(5=全1 10=全2 15=全3 20=全4 25=全5) */ - private const SUPER_WIN_GRID_NUMBERS = [5, 10, 15, 20, 25]; + /** 可触发超级大奖的 grid_number(5=全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); diff --git a/server/app/dice/model/play_record/DicePlayRecord.php b/server/app/dice/model/play_record/DicePlayRecord.php index 8171aba..861a16b 100644 --- a/server/app/dice/model/play_record/DicePlayRecord.php +++ b/server/app/dice/model/play_record/DicePlayRecord.php @@ -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); } /** 是否中大奖 */