50 lines
4.2 KiB
Markdown
50 lines
4.2 KiB
Markdown
# 抽奖流程对比:当前实现 vs 预期流程
|
||
|
||
## 你描述的预期流程
|
||
|
||
1. **先判断中的是 T1–T5 中的哪个奖**
|
||
→ 按彩金池/玩家权重抽档位 T1–T5。
|
||
|
||
2. **根据 (1) 中奖类型从 DiceRewardConfig 读取数据,再根据权重 weight 抽取点数 grid_number**
|
||
→ 该档位下多条配置,按每条配置的 **weight** 抽一条,得到这条配置的 **grid_number**(以及 real_ev 等)。
|
||
|
||
3. **根据抽取的 grid_number 查找有无对应的 s_end_index(n_end_index)**
|
||
→ 用上一步得到的 grid_number(及方向)去查「带该 grid_number 且带 s_end_index/n_end_index 的配置」是否存在。
|
||
|
||
4. **若有则输出 s_end_index(n_end_index)对应的点数和起始点数;中奖数据仍用步骤 2 抽到的 grid_number 对应配置**
|
||
→ 输出:起始点、终点(s_end_index 或 n_end_index)、点数和 roll_number;中奖金额等用步骤 2 抽到的那条配置。
|
||
|
||
5. **判断是否中大奖**
|
||
→ 若点数和为豹子组合 (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),我可以按上述思路给出具体修改方案(含要改的类/方法名和伪代码)。
|