435 lines
27 KiB
Markdown
435 lines
27 KiB
Markdown
# 百人赛(cloudRise)PRD
|
||
|
||
版本:V1.2
|
||
更新日期:2026-09-14
|
||
文档依据:本次需求问答中已确认的产品规则。本文为开发与验收依据,不代表活动功能已实现或已上线。
|
||
|
||
本次补充:结算页移除关闭按钮。胜利结算在动画完成后点击任意位置关闭;失败提示停留 1.2 秒后自动关闭并继续原操作,也可点击跳过。胜利结算关闭后展示活动总览,由玩家手动点击“开始下一阶段”;主线“下一关”不再自动匹配。获胜奖励向上补足至整十金币。
|
||
|
||
## 1. 产品概述
|
||
|
||
百人赛是一项随主线闯关推进的限时活动。每个阶段由 1 名真实玩家 A 与 99 名模拟参赛者组成,共 100 人。玩家通过连续通关推进阶段,模拟参赛者按照预先生成的成绩逐轮淘汰。
|
||
|
||
活动包含三个阶段,必须依次完成。玩家通过一个阶段后,与该阶段其他存活者共同参与金币奖池分配;stage1/2 完成后,在活动总览手动开启下一阶段。任意阶段失败,整轮活动立即结束。本期不可重新报名。
|
||
|
||
内部功能标识使用 `cloudRise`。现有美术中的展示名称为“月光宝盒”,阶段主题依次为“月桂树”“捣药台”“广寒宫”。
|
||
|
||
## 2. 范围与基本原则
|
||
|
||
- 同时开发客户端展示、主线接入、服务端活动状态、模拟匹配、真实样本记录和金币结算。
|
||
- 玩家参与免费;同一玩家同时最多有一轮百人赛活动。
|
||
- 每次后台开放的一期活动,每名玩家只能参加一次。
|
||
- 当前比赛只随主线关卡推进。
|
||
- 每阶段重新组成 100 人队伍;阶段内不能刷新或更换对手。
|
||
- 每个阶段的 99 名对手均为模拟数据,不要求对应账号在线或实际参赛。
|
||
- 头像昵称仅作为展示资料,与模拟关卡及成绩独立生成。
|
||
- 活动自身记录连续通关数,不能使用 `users.winStreak` 作为活动进度。
|
||
- 胜负判定时机沿用现有十连胜活动;不继承其“达到 10 才清零”或计数上限规则。
|
||
|
||
## 3. 术语
|
||
|
||
| 术语 | 定义 |
|
||
| --- | --- |
|
||
| 活动期 | 后台配置的一次报名开放周期,以唯一标识区分 |
|
||
| 一轮活动 | 玩家本期报名后,从 stage1 开始、最多包含三个阶段的一次参与 |
|
||
| 阶段 | stage1、stage2 或 stage3,各自重新匹配 99 名模拟参赛者 |
|
||
| `cur_level` | 玩家开启本阶段时已通过的主线关卡序号 |
|
||
| `start_level` | 本阶段起始关卡序号;真实玩家为开启本阶段时的 `cur_level + 1`,模拟参赛者按规则抽取 |
|
||
| `success_num` | 本阶段从起点开始、在首次失败前连续通过的关卡数,最大为阶段目标 |
|
||
| 最终存活人数 | 玩家成功完成阶段时,玩家 A 加上达到本阶段目标的模拟参赛者数量 |
|
||
| 真实完赛样本 | 真实玩家某阶段成功或失败结算时产生的成绩;不包含超时中止的未完成阶段 |
|
||
|
||
## 4. 活动开放与参与资格
|
||
|
||
### 4.1 两种时间限制
|
||
|
||
1. **报名开放时间**:由后台配置,只决定玩家是否可以首次报名本期活动。
|
||
2. **个人活动截止时间**:从玩家首次点击“开始”参与本期活动时起计算配置的 `durationHours` 小时(默认 24)。
|
||
|
||
个人截止时间计算:
|
||
|
||
```text
|
||
个人截止时间 = 本轮首次开始时间 + durationHours 小时
|
||
```
|
||
|
||
- 三个阶段共用同一截止时间,进入新阶段不重置倒计时。
|
||
- 匹配、停留首页或商城、阶段间等待、切后台等时间均包含在本轮配置时长内。
|
||
- 报名开放时间结束后,已经报名的玩家仍可在个人截止时间前继续本轮活动,包括开启后续阶段。
|
||
- 个人截止时间到达后,不能继续推进或开启本轮后续阶段。
|
||
- 时间判定以服务端为准;客户端显示剩余时间。
|
||
|
||
示例:本期报名今晚 24:00 结束,玩家今晚 23:00 开始,则个人截止时间为明晚 23:00。
|
||
|
||
### 4.2 次数与重新参与
|
||
|
||
- 任一阶段失败,结束整轮活动,本期资格已消耗。
|
||
- 完成三个阶段后,本期资格同样已消耗,不能再次挑战或重复领奖。
|
||
- 下一期重新获得一次参与机会,从 stage1 开始。
|
||
- 不能同时持有两轮进行中的活动。
|
||
- 重复点击开始、重复请求或恢复匹配,不得创建额外轮次、额外次数或重抽对手。
|
||
|
||
## 5. 阶段目标与奖励
|
||
|
||
| 阶段 | 美术主题 | 连续通关目标 | 金币奖池 |
|
||
| --- | --- | ---: | ---: |
|
||
| stage1 | 月桂树 | 5 关 | 10,000 |
|
||
| stage2 | 捣药台 | 7 关 | 15,000 |
|
||
| stage3 | 广寒宫 | 9 关 | 20,000 |
|
||
|
||
### 5.1 阶段推进
|
||
|
||
- 玩家先开启 stage1,成功后才可开启 stage2,stage2 成功后才可开启 stage3。
|
||
- 每个阶段点击开始后进入匹配页面,匹配成功后进入该阶段挑战。
|
||
- 阶段开始时固定本阶段真实玩家的 `start_level`,后续记录成绩时不得改写起点。
|
||
- 下一阶段以点击开启该阶段时的玩家主线进度重新确定起点和匹配分布中心。
|
||
- stage1/2 成功并完成奖励结算后,下一阶段进入“已解锁、待开始”状态。玩家点击主线结算的“下一关”时,展示待播结算;动画完成后点击任意位置进入活动总览,需手动点击“开始下一阶段”才匹配。关闭总览后继续主线下一关,同步失败可重试。
|
||
- 玩家返回首页时,不再仅因阶段成功自动弹出活动总览;可点击首页活动入口查看并手动点击“开始下一阶段”触发匹配。关闭结算、页面刷新和状态轮询不触发匹配。
|
||
- 下一阶段尚未开启时不累计该阶段进度;个人挑战倒计时持续流逝。stage3 完成后不再匹配,主线“下一关”正常进入后续关卡。
|
||
|
||
### 5.2 金币计算
|
||
|
||
当前实现由前端计算并发放金币,前端上报奖励金额和加奖后的余额,服务端负责保存及记录每阶段 rewardSaved 标记。成功保存后前端更新本地金币;后续所有活动统一迁移至服务端发奖。
|
||
|
||
只有玩家完成本阶段目标才获得该阶段奖励:
|
||
|
||
```text
|
||
存活人数 S = 1 + success_num 达到本阶段目标的模拟参赛者数量
|
||
玩家奖励 = ceil(ceil(本阶段金币奖池 / S) / 10) * 10
|
||
```
|
||
|
||
- 分母包含玩家 A 自己。
|
||
- 玩家失败时,该阶段奖励为 0。
|
||
- 每阶段成功后立即结算到账;后续阶段失败、退出或整轮超时,不追回已经获得的金币。
|
||
- 同一阶段只结算一次,重复请求或重复展示结果不得重复发币。
|
||
- 模拟参赛者不向其展示资料对应的真实账号发放金币。
|
||
|
||
示例:stage1 最终总存活人数为 10,玩家得到 1000 金币;总存活人数为 3,先向上取整为 3334,再补足至 3340 金币。若分得 201,则发放 210;已是整十的金额保持不变。已保存的历史奖励不重新补发。
|
||
|
||
## 6. 匹配规则
|
||
|
||
### 6.1 展示资料池
|
||
|
||
- 从 `users` 中抽取一批超过三个月未活跃的用户作为头像昵称池。
|
||
- 当前版本以 `taskTime` 判断未活跃时间。这是已确认的业务近似,不要求新增最后登录时间后再开放活动。
|
||
- 昵称、头像使用池中用户的展示资料;不得把这些用户的关卡进度、十连胜数据直接当作模拟成绩。
|
||
- 对手资料与 `(start_level, success_num)` 独立分配。
|
||
- 展示资料只读取,不修改被抽中用户的账号状态、进度或资产。
|
||
|
||
### 6.2 起始关卡分布
|
||
|
||
99 名模拟参赛者分别独立生成一个 `(start_level, success_num)`。
|
||
|
||
设玩家开启本阶段时:
|
||
|
||
```text
|
||
k = cur_level + 1
|
||
L = 1960
|
||
```
|
||
|
||
每名模拟参赛者的 `start_level` 独立从整数 `1…1960` 中抽取,概率为:
|
||
|
||
```text
|
||
f(x) = enter_total(x) × g(x)
|
||
/ Σ[i=1…1960] enter_total(i) × g(i)
|
||
```
|
||
|
||
其中 `g` 是中心为 `k`、去掉非正整数后重新归一化的离散正态权重:
|
||
|
||
```text
|
||
w(i) = exp(-(i-k)² / (2σ²))
|
||
g(i) = w(i) / Σ[j=1…∞] w(j) i ≥ 1
|
||
g(i) = 0 i ≤ 0
|
||
```
|
||
|
||
标准差按本阶段中心求解,使:
|
||
|
||
```text
|
||
Σ[i=max(1,k-100)…k+100] g(i) ≈ 1/2
|
||
```
|
||
|
||
说明:
|
||
|
||
- 约一半的条件作用于 `g`,不是乘以进入人数后得到的最终分布 `f`。
|
||
- 正整数截断会影响归一化,因此不能简单对所有玩家使用同一固定标准差。
|
||
- `g` 的归一化范围是正整数,最终可抽取起点的范围始终为 `1…1960`。
|
||
- `enter_total(x) = 0` 的关卡起点权重为 0。
|
||
- 独立抽样允许不同模拟参赛者抽中相同起点、相同成绩。
|
||
- 1960 是此活动的模拟起点上限,不因此修改主线游戏自身的关卡上限。
|
||
|
||
### 6.3 连续通关数分布:真实样本优先
|
||
|
||
阶段目标记为 `T`,stage1/2/3 分别为 `5/7/9`。
|
||
|
||
固定某个模拟参赛者的 `start_level = s` 后,查询该 `(stage, s)` 对应的真实完赛样本多重集合:
|
||
|
||
- 集合非空:按每条样本等概率抽取一个 `success_num`。
|
||
- 集合为空:使用逐关通关率进行冷启动模拟。
|
||
- 集合允许重复数值,不得去重后抽样,也不得直接用均值代替抽样。
|
||
- 不混用其他阶段或其他起点的真实完赛样本。
|
||
|
||
示例:集合为 `[0, 2, 2, 5]` 时,抽到 `2` 的概率为 `1/2`,抽到 `0` 或 `5` 的概率分别为 `1/4`。
|
||
|
||
### 6.4 冷启动逐关模拟
|
||
|
||
```text
|
||
success_num = 0
|
||
依次模拟 s, s+1, …, s+T-1:
|
||
按当前关卡通关率进行一次成功/失败抽样
|
||
如果失败:终止,返回 success_num
|
||
如果成功:success_num += 1
|
||
全部通过:返回 T
|
||
```
|
||
|
||
- `success_num` 为 `0…T` 的整数。
|
||
- 只在该阶段、该起点没有真实完赛样本时使用冷启动规则。
|
||
- 当需要的关卡通关率缺失时,模拟使用最近一个较低关卡的有效通关率。
|
||
- 当前数据最后一个有效关卡为 1920,通关率为 `0.818`,所以模拟越过 1920 后沿用 `81.8%`。
|
||
- 原始 JSON 中的缺失值仍保留为 `null`;兜底仅在计算时生效。
|
||
- 后续一旦对应 `(stage, start_level)` 有真实样本,即按真实样本分支处理。
|
||
|
||
### 6.5 匹配结果固定
|
||
|
||
- 完成一次阶段匹配后,固定 99 名模拟参赛者的资料、起点与成绩。
|
||
- 重开页面、请求重试、切后台恢复不能重新生成阶段对手。
|
||
- 对手最终成绩用于逐轮结算,不应在比赛开始时向玩家提前展示。
|
||
- 下一阶段重新匹配,与上一阶段的存活者名单无关。
|
||
|
||
## 7. 实际游玩与淘汰
|
||
|
||
### 7.1 初始状态
|
||
|
||
- 每阶段初始人数为 100,包括玩家 A 与 99 名模拟参赛者。
|
||
- 玩家当前阶段进度为 `0/T`。
|
||
- 即使某个模拟参赛者的 `success_num = 0`,也在阶段初始显示中计入 100 人,第一关结算时才淘汰。
|
||
|
||
### 7.2 每关结算
|
||
|
||
`i` 为本阶段正在结算的第几关,从 1 开始。
|
||
|
||
- 玩家 A 成功通过第 `i` 关:阶段进度变为 `i/T`,淘汰所有 `success_num < i` 的模拟参赛者。
|
||
- 玩家 A 在第 `i` 关最终失败:同样淘汰所有 `success_num < i` 的模拟参赛者,玩家 A 也淘汰,并立即结束整轮活动。
|
||
- 玩家 A 成功通过第 `T` 关:阶段成功,按最终存活人数分奖。
|
||
- 玩家 A 淘汰后,不继续自动播放剩余模拟参赛者的后续比赛,也不发放该阶段奖励。
|
||
|
||
示例:玩家在 stage2 已通过 3 关,第 4 关最终失败,则真实成绩为 `success_num = 3`;该轮展示淘汰模拟成绩低于 4 的对手,随后整轮结束。
|
||
|
||
## 8. 胜负、切后台与重新登录
|
||
|
||
### 8.1 采用现有十连胜的判定方式
|
||
|
||
复用现有十连胜活动的胜负时机与未完成标记方式,为 cloudRise 单独保存状态。
|
||
|
||
| 情况 | cloudRise 处理 |
|
||
| --- | --- |
|
||
| 正常通关 | 记一次成功,推进阶段 |
|
||
| 出现失败弹窗,但玩家随后复活并通关 | 记成功,不能在首次弹出复活界面时直接判负 |
|
||
| 关卡最终失败、明确放弃或确认重开 | 当前阶段失败,整轮结束 |
|
||
| 关卡尚未实际开始,仅进入了页面 | 不因未开始的关卡留下未完成标记 |
|
||
| 游戏中切后台、锁屏,再恢复原游戏 | 暂停后继续,不直接判负 |
|
||
| 首页、商城等非闯关状态关闭后重新进入 | 不因关闭本身判负,仍检查个人截止时间 |
|
||
| 实际闯关中关闭,重新登录时仍有未完成关卡标记 | 按中断失败处理,整轮结束 |
|
||
| 仅断网或请求超时,游戏仍在运行 | 不新增独立的断网判负机制,依照最终通关/失败结果处理 |
|
||
|
||
### 8.2 未完成标记
|
||
|
||
1. 本阶段中的一关实际开始时,保存本活动“关卡未完成”标记,并关联本轮、阶段及该关尝试。
|
||
2. 成功通关后,将标记改为已完成,记录胜利结果并推进阶段。
|
||
3. 明确失败或放弃时记录失败,结束整轮。
|
||
4. 切后台仅暂停,不清除或直接结算该标记。
|
||
5. 重新登录时,检查上一轮尚未完成的关卡标记;若存在,则按失败处理。
|
||
6. 成功结果已经被记录但上传响应丢失时,核对或重试同一次结算,不得改判失败或重复计数。
|
||
|
||
边界说明:这套机制识别的是“未完成关卡后重新登录”,不是玩家关闭动作的具体原因。系统回收后重启也可能触发该处理;若平台关闭只是隐藏且恢复原实例,则不会仅因隐藏判负。
|
||
|
||
### 8.3 与旧十连胜活动的区别
|
||
|
||
- cloudRise 的任何阶段最终失败都会结束整轮,无论当前已连续通过几关。
|
||
- 不沿用旧活动“次数至少为 10 才清零”的条件。
|
||
- 不沿用旧活动最高累加到 11、界面最多显示 10 的计数方式。
|
||
- 不共享旧活动的 `winState` 或 `winStreak` 存储键,避免两个活动互相影响。
|
||
- 旧活动特有的数据迁移、强制刷新分支不作为 cloudRise 的业务规则。
|
||
|
||
## 9. 超时结算
|
||
|
||
个人挑战时长到期时:
|
||
|
||
- 整轮标记为超时结束。
|
||
- 当前未完成阶段不发奖励,不再继续挑战。
|
||
- 已成功阶段的金币保留。
|
||
- 当前未完成阶段的进度可用于展示与排查,但不进入模拟抽样使用的真实完赛集合。
|
||
- 之前已成功结束的阶段样本继续保留。
|
||
- 超时后不能以本期资格重新开始。
|
||
- 到期后上报的关卡结果不得使已超时的活动重新变为进行中或追加成功奖励。
|
||
|
||
示例:stage1 已成功分奖,stage2 进度为 `3/7` 时回首页并停留至到期。stage1 奖励及成功样本保留;stage2 记录超时和已完成 3 关,但不向 stage2 的成绩集合写入 `3`。
|
||
|
||
## 10. 真实样本与数据持久化
|
||
|
||
### 10.1 样本写入时机
|
||
|
||
- 每个真实玩家的阶段成功或失败结算时,记录一次真实阶段成绩。
|
||
- 首关失败的成绩为 0;阶段成功的成绩为本阶段目标值。
|
||
- 由未完成标记识别的中断失败也属于失败样本。
|
||
- 超时中止的未完成阶段不写入抽样集合。
|
||
- 重复结算、补传或重试不能产生重复样本;不同真实参赛记录的相同成绩必须保留重复次数。
|
||
- 样本按 `(stage, start_level)` 累积,不因新一期活动开放而清空。
|
||
|
||
### 10.2 逻辑数据要求
|
||
|
||
以下为必须能持久化的信息,具体集合拆分和字段命名由研发实现确定。
|
||
|
||
| 数据对象 | 必须包含的信息 |
|
||
| --- | --- |
|
||
| 活动期配置 | 唯一期标识、开放开关、报名开始/结束时间、入口解锁条件、阶段目标和奖池 |
|
||
| 玩家参与记录 | 玩家、所属活动期、轮次标识、首次开始时间、个人截止时间、当前阶段、整轮状态、已参与资格 |
|
||
| 阶段记录 | 阶段、真实起点、已连续通过关数、99 人匹配快照、当前存活人数、当前关卡未完成标记 |
|
||
| 阶段结算 | 阶段结果、最终真实成绩、最终存活人数、应得金币、结算标识、结算时间与到账状态 |
|
||
| 真实成绩样本 | 唯一阶段参赛记录、stage、start_level、success_num、成功/失败原因、产生时间 |
|
||
| 超时记录 | 所属轮次及阶段、已完成关数、超时时间;与可抽样成绩明确区分 |
|
||
|
||
持久化要求:
|
||
|
||
- 服务端保证同一期一次资格、同一玩家一轮进行中、同一关只推进一次、同一阶段只分奖一次。
|
||
- 发奖和活动状态必须能够在重试后得到一致结果。
|
||
- 百人赛奖励上报通过阶段保存标记防止重复处理,重新登录沿用现有金币恢复规则。本版不单独改造 userCoin 或丛林宝藏,跨接口旧余额覆盖的统一保护留待整体服务端发奖改造。
|
||
- 样本写入失败后能够补写;不能因重试增加同一场真实比赛在样本集合中的权重。
|
||
- 头像池用户仅提供展示资料,不产生参赛资格或金币变动。
|
||
|
||
## 11. 页面与交互需求
|
||
|
||
### 11.1 首页入口与活动总览
|
||
|
||
- 未参加时,活动处于 `startsAt <= 当前时间 < endsAt` 即展示入口并允许符合条件的玩家报名,不再使用 `enabled/status`。已报名且仍在挑战中或等待下一阶段时,即使报名截止也可访问活动;本期全部完成、失败或个人超时后隐藏入口。
|
||
- 总览显示三阶段、已完成标记、当前可参与阶段、阶段奖池及活动状态。
|
||
- 报名前显示报名剩余时间;报名后显示个人活动剩余时间,文案需区分两者。
|
||
- 首次“开始”进入 stage1 匹配;stage1/2 成功后,活动页面展示“开始下一阶段”按钮。胜利结算关闭后弹出此页面,等待手动开始;返回首页不重复自动展示总览;主线“下一关”不触发下一阶段匹配。
|
||
- 仅完成当前阶段、关闭成功结算、返回首页或重新打开活动页面,均不自动开启下一阶段。
|
||
- 阶段进行中再次进入,展示已有进度与对手,不再提供重抽功能。
|
||
- 失败、超时或全部完成后展示对应结果,不提供本期重新报名入口。
|
||
- 胜负记录按原时机保存,动画按玩家操作播放:通关后点击主线“下一关”,或新玩法介绍的“帮帮TA”确认后续关时,播放胜利进度及阶段奖励,等待活动页面关闭后再继续关卡;点击“重试”先播放淘汰和失败结算再重开;点击“放弃”并返回首页后播放淘汰和失败结算,放弃至返回首页之间的体力等提示页不提前播放。
|
||
|
||
### 11.2 匹配页面
|
||
|
||
- 展示匹配提示、头像及匹配人数,最终为 `100/100`。
|
||
- 匹配成功后进入对应阶段进度页面。
|
||
- 重复点击与网络重试恢复同一次匹配,不得刷新生成结果。
|
||
- 不提前展示模拟参赛者的 `start_level` 和最终 `success_num`。
|
||
|
||
### 11.3 阶段进度页面与游戏内入口
|
||
|
||
- 显示当前阶段主题、阶段进度 `i/T`、剩余人数、个人倒计时和该阶段奖池。
|
||
- 云台阶或同类视觉按当前阶段进度呈现。
|
||
- 每关结算后更新进度与剩余人数;失败时显示淘汰结果并结束本轮。
|
||
- 游戏内查看活动进度不得创建新的匹配或改变关卡结果。
|
||
- 复活提示与百人赛失败结果须按最终胜负顺序衔接,不能提前淘汰可复活玩家。
|
||
|
||
### 11.4 阶段成功与全部完成
|
||
|
||
- 显示真实到账金币、最终存活人数、玩家及其他存活者头像。
|
||
- 其他获胜者人数为 `最终存活人数 − 1`。
|
||
- 仅玩家 A 存活时,使用独得本阶段奖池的文案。
|
||
- 成功结算覆盖在暗化的本阶段进度页上,依次弹出“恭喜获胜”、宝箱、金币和实际奖励,最后展示自己、其他获胜者头像及分享说明。奖励数字使用图片数字,其他获胜者展示最多 7 个代表头像;人数显示实际值。
|
||
- 胜利结算页无右上角关闭按钮,全部动画结束后点击任意位置关闭;动画期间的点击不生效,也不会穿透到后续页面。胜利结算关闭后显示活动总览:stage1/2 等待玩家手动点击“开始下一阶段”,stage3 显示全部完成。
|
||
- 结果展示、关闭页面、再次进入页面均不得重复发奖。
|
||
|
||
### 11.5 失败与超时
|
||
|
||
- 最终失败的淘汰动画结束后,直接保留当前云梯页面,顶部显示“本次的挑战失败了,祝您下次好运!”,隐藏进度数字和头像,保留当前阶段奖池与个人倒计时。失败提示停留 1.2 秒后自动关闭并继续原操作:重试则重新开始关卡,已返回首页则结束本次活动展示;期间可点击提前关闭。状态刷新不延长停留时间,返回首页不重复弹出已展示的失败结果;本期不能再次参加。
|
||
- 超时使用超时结束文案,不能表现为玩家在某一关正常失败。
|
||
- 两种情况均保留并可展示已成功阶段的奖励记录。
|
||
|
||
### 11.6 美术来源与动态替换
|
||
|
||
素材目录:`C:/Users/NK/Desktop/百人赛界面0910存图`。
|
||
|
||
参考图包含活动总览、匹配、阶段进度、失败与成功结算页面。开发使用提供的独立 PNG 组合界面,不把含固定业务数值的完整效果图直接当作功能页面。
|
||
|
||
必须替换的示意内容:
|
||
|
||
| 效果图内容 | 实际实现 |
|
||
| --- | --- |
|
||
| `48:00:00` | 依据报名或个人截止时间动态显示;个人时限取报名时的 durationHours,默认 24 小时 |
|
||
| 固定 `10000` 奖池 | 按阶段显示 10000 / 15000 / 20000 |
|
||
| 固定 `0/7` | 按阶段显示 `i/5`、`i/7` 或 `i/9` |
|
||
| 固定获奖 `500` | 显示实际向上补足至整十后的金币数 |
|
||
| “你和其他100名玩家……” | 使用实际其他存活者人数,不能把总参赛人数写为 101 |
|
||
|
||
## 12. 冷启动数据资产
|
||
|
||
来源文件:`C:/Users/NK/Downloads/通关率和进入人数_20260911.csv`。
|
||
|
||
已生成后端 JSON:`C:/Users/NK/Desktop/workspace/server/laf-cloud/functions/cloudRise/data/cloudRiseLevelStats.json`。
|
||
|
||
| 字段 | 含义 |
|
||
| --- | --- |
|
||
| `source_file`、`source_sha256` | 数据来源及校验信息 |
|
||
| `max_start_level` | 活动模拟起点上限,1960 |
|
||
| `levels[].level` | 关卡序号 |
|
||
| `levels[].enter_total` | 进入人数,源文件注明用户去重 |
|
||
| `levels[].pass_rate` | 0~1 通关概率;源文件为百分数,且注明“8月成功关号已修正” |
|
||
|
||
当前 JSON 保留全部 1~2000 关:
|
||
|
||
- 1~1920 关有有效通关率。
|
||
- 1921~2000 关通关率为 `null`,进入人数为 0。
|
||
- 活动起点仅在 1~1960 中抽取,不能因为文件包含 2000 关而扩大起点范围。
|
||
- 使用已修正的关卡编号,不再次做成功关号偏移修正。
|
||
- 不从去重进入人数与百分比反推并伪造成功次数。
|
||
|
||
## 13. 验收标准
|
||
|
||
| 编号 | 场景 | 预期结果 |
|
||
| --- | --- | --- |
|
||
| A01 | 本期首次开始 | 创建唯一轮次,从 stage1 匹配,个人时限取报名时的 durationHours,默认 24 小时 |
|
||
| A02 | 重复点击或重试开始 | 恢复同一轮次及匹配结果,不增加机会 |
|
||
| A03 | 报名关闭后,已报名玩家仍在个人时限内 | 可继续本轮及开启后续已解锁阶段 |
|
||
| A04 | 本期失败后再次开始 | 不允许报名,等待下一期 |
|
||
| A05 | 完成 stage1 或 stage2 | 分奖后下一阶段处于已解锁、待开始状态;不自动匹配,个人截止时间不变 |
|
||
| A06 | 完成 stage3 | 整轮完成,本期不能再参加 |
|
||
| A07 | 每个阶段匹配 | 恰好 1 名真实玩家与 99 名模拟参赛者,阶段内结果固定 |
|
||
| A08 | 校验起点抽样 | 起点始终在 1~1960,符合进入人数乘正态权重;零权重起点不被抽中 |
|
||
| A09 | 不同中心求标准差 | 正整数归一化后,中心前后 100 关内的 `g` 概率和约为 1/2 |
|
||
| A10 | 样本为 `[0,2,2,5]` | 按四条记录等概率抽样,不能对数值去重 |
|
||
| A11 | 没有真实样本 | 从起点逐关模拟,首次失败即停止,成绩不超过阶段目标 |
|
||
| A12 | 模拟到 1921 及之后的缺失数据 | 当前数据下使用 0.818 兜底,原始 JSON 仍为空值 |
|
||
| A13 | 模拟成绩为 0 | 初始仍计入 100 人,第一关结算时淘汰 |
|
||
| A14 | 玩家通过第 i 关 | 进度增加一次,淘汰全部 `success_num < i` 的模拟参赛者 |
|
||
| A15 | 玩家在第 i 关失败 | 真实成绩为 i−1,整轮结束,该阶段无奖励 |
|
||
| A16 | 失败后复活并通关 | 正常计胜,不因首次失败弹窗提前淘汰 |
|
||
| A17 | 实际闯关中确认放弃或重开 | 结束当前阶段及整轮活动 |
|
||
| A18 | 切后台后恢复原实例 | 不判负,原关卡继续,个人倒计时继续流逝 |
|
||
| A19 | 未完成关卡后重新登录 | 按独立未完成标记判为中断失败 |
|
||
| A20 | 首页或商城关闭后重新登录 | 不因关闭本身判负 |
|
||
| A21 | 仅断网或请求超时 | 不独立判负;结算重试不重复推进或发奖 |
|
||
| A22 | stage1 最终 3 人存活 | 玩家到账 3334 金币,分母包含玩家本人 |
|
||
| A23 | stage1 获奖后 stage2 失败 | stage1 奖励保留,stage2 不发奖 |
|
||
| A24 | 同一阶段重复结算、响应丢失后重试 | 奖励只到账一次,真实样本只记录一次 |
|
||
| A25 | stage2 进行中超时 | 本轮结束,保留之前奖励;stage2 不加入真实完赛样本 |
|
||
| A26 | 成功、失败与超时样本检查 | 前两类加入对应阶段和起点的集合,超时未完成阶段不加入 |
|
||
| A27 | 金币保存与登录 | userCoin、丛林宝藏沿用原流程;奖励上报成功后重试不覆盖更新后的余额,重新登录不重复领取 |
|
||
| A28 | 与十连胜同时运行 | 两活动数据独立;cloudRise 低于 10 次时失败也会结束整轮 |
|
||
| A29 | 美术页面校验 | 阶段目标、金币、人数、倒计时均为真实动态数据,无 48 小时或 101 人错误文案 |
|
||
| A30 | 阶段成功后点击主线结算“下一关” | 同步并展示结算;动画结束后点击进入活动总览,下一阶段仅手动开启,关闭总览后继续主线 |
|
||
| A31 | 玩家在活动页面点击“开始下一阶段” | 以点击时的主线进度确定下一阶段起点并触发匹配,匹配成功后正式开启 |
|
||
| A32 | stage1/2 成功且已展示结算后返回首页 | 不再自动弹出总览;首页入口仍可手动打开,下一阶段保持待开始,关闭和轮询不自动匹配 |
|
||
|
||
## 14. 开发交付与尚待配置项
|
||
|
||
交付范围:
|
||
|
||
1. 客户端活动入口、总览、匹配、进度、成功、失败、超时页面及美术接入。
|
||
2. 主线开局、通关、最终失败、放弃、重开、重新登录的活动状态接入。
|
||
3. 服务端活动期配置、参与资格、阶段匹配、进度与结算接口。
|
||
4. 冷启动数据读取、抽样算法、真实样本积累与补写机制。
|
||
5. 金币一致性、重复请求、异常恢复及上述验收场景验证。
|
||
|
||
以下不视为已确认的具体运营数值:
|
||
|
||
- 首期活动标识及报名起止时间:由后台配置。
|
||
- 活动入口解锁关卡:尚未指定;可配置,此前建议从第 1 关开放,但不将此建议视为已确认门槛。
|
||
- 展示资料池为空或不足时的处理:需在实现中明确兜底,不能因此重新生成已固定的比赛成绩。
|
||
|
||
不在本次交付范围内:真实多人实时同步、聊天、跨玩家实时排行榜,以及修改原十连胜活动的既有规则。
|
||
|
||
2026-09-16:总览开放、挑战中和等待下一阶段统一使用说明文字.png;完成、失败、超时不展示总览说明。独赢沿用分享奖励文案,其他人数显示 0。durationHours 为正整数小时,默认 24,报名时固化到轮次,后续改配置不改变本轮截止时间。
|