4.2 KiB
4.2 KiB
抽奖流程对比:当前实现 vs 预期流程
你描述的预期流程
-
先判断中的是 T1–T5 中的哪个奖
→ 按彩金池/玩家权重抽档位 T1–T5。 -
根据 (1) 中奖类型从 DiceRewardConfig 读取数据,再根据权重 weight 抽取点数 grid_number
→ 该档位下多条配置,按每条配置的 weight 抽一条,得到这条配置的 grid_number(以及 real_ev 等)。 -
根据抽取的 grid_number 查找有无对应的 s_end_index(n_end_index)
→ 用上一步得到的 grid_number(及方向)去查「带该 grid_number 且带 s_end_index/n_end_index 的配置」是否存在。 -
若有则输出 s_end_index(n_end_index)对应的点数和起始点数;中奖数据仍用步骤 2 抽到的 grid_number 对应配置
→ 输出:起始点、终点(s_end_index 或 n_end_index)、点数和 roll_number;中奖金额等用步骤 2 抽到的那条配置。 -
判断是否中大奖
→ 若点数和为豹子组合 (5,10,15,20,25,30),其中 5 和 30 必中大奖,其余按 BIGWIN 的 weight 再判一次;中大奖则返回 BIGWIN 的 roll_array。
当前实现
| 步骤 | 预期 | 当前实现 | 是否一致 |
|---|---|---|---|
| 1 | 先抽 T1–T5 档位 | 按彩金池/玩家权重抽 T1–T5 | ✅ 一致 |
| 2 | 按该档位配置的 weight 抽取 grid_number(即抽一条配置) | 该档位配置等权随机选一条 chosen,没有用 weight;且当前用的 grid_number 来自后面的「路径」配置,不是来自这条 chosen |
❌ 不一致:未按 weight 抽,grid_number 来源也不对 |
| 3 | 根据 grid_number 查 s_end_index / n_end_index | 根据 chosen.id 查「s_end_index = chosen.id 或 n_end_index = chosen.id」的配置,得到若干 startCandidates(路径列表) | ❌ 不一致:是按「终点 id」查路径,不是按 grid_number 查 |
| 4 | 若有则输出终点、点数和、起始点;中奖数据用步骤 2 的配置 | 从 startCandidates 里再等权随机一条 startRecord,用 startRecord.id 作起始、startRecord.grid_number 作点数和、startRecord.s_end_index/n_end_index 作终点;中奖数据(real_ev 等)用的是 chosen |
⚠️ 部分一致:终点、起始、点数和都有,但 grid_number 来自路径而不是「按 weight 抽出的那条配置」 |
| 5 | 豹子点数 5,10,15,20,25,30;5/30 必中大奖;其余按 BIGWIN.weight 判 | 逻辑一致:5/30 必中大奖,其余用 BIGWIN 的 weight 判定 | ✅ 一致 |
weight 是否实例化(入缓存)
- BIGWIN:缓存里有完整行,含 weight,
getCachedByTierAndGridNumber('BIGWIN', rollNumber)返回的配置里带 weight,已用于步骤 5。✅ 已实例化。 - T1–T5:
getCachedByTier(tier)返回的每条配置也是完整行(含 weight),但当前代码没有用这些 weight,只用array_rand等权选一条。即:weight 已在缓存里,但未参与抽奖。⚠️ 已实例化但未使用。
结论与建议
-
不一致点:
- 步骤 2:应用「该档位下按 weight 抽一条配置」,用这条配置的 grid_number(和 real_ev 等);当前是等权抽一条且 grid_number 实际来自路径。
- 步骤 3:应用「用步骤 2 得到的 grid_number(及方向)查是否有 s_end_index/n_end_index」;当前是用 chosen.id 查「以该 id 为终点的路径」。
-
建议:
- 改为「先按档位内 weight 抽一条配置」,以该条为唯一来源得到 grid_number、real_ev、以及 s_end_index/n_end_index(若表结构是一条配置同时带 grid_number 与 s_end_index/n_end_index)。
- 若表结构是「奖励配置」与「路径配置」分离,则需在步骤 2 按 weight 抽到 grid_number 后,再按 grid_number + 方向 查路径表得到 s_end_index/n_end_index 与起始点;并保证只对「在该方向下有有效 s_end_index/n_end_index 的配置」做 weight 抽取。
若你确认表结构(是否同一张表、是否一条既有 grid_number 又有 s_end_index/n_end_index),我可以按上述思路给出具体修改方案(含要改的类/方法名和伪代码)。