核心概念
少数派规则
每轮 A/B 二选一 → 未答淘汰 → 多数派淘汰 → 少数派晋级 → 剩 1 人赢 / 2 人平。
认证场景
系统按部署地区支持两套登录方案(二选一,勿混用):
| 场景 | Player | Admin / Display |
|---|---|---|
| 国内(CN) | /login 6 位登录码 | /staff-login 邮箱 + 密码 |
| 美国(US) | /login OAuth(Google / Azure AD) | 同左,OAuth + 邮箱白名单 |
完整说明见 认证场景。下文「登录码机制」仅适用于 国内场景。
登录码机制(国内)
| 步骤 | 行为 |
|---|---|
| Admin 发布 | Redis 写入 game:main_room:login_code,广播 login_code_published |
| 玩家提交 | POST /api/auth/verify-code 校验 6 位码 |
| 身份分配 | assignPlayerIdentity(playerId) → 内部 email + 显示编号 |
| Admin 关闭 | 删除 key,广播 login_code_closed |
| 重置游戏 | clearLoginCode() + clearPlayerRegistry() |
登录码 无 TTL,直到关闭或 reset。
玩家身份模型
- 同一 UUID 重复登录 → 复用原编号
- OAuth 用户(Staff)email 即标识,displayName 回退为 email
游戏状态
RoomState(Admin/Display):waiting | playing | ended
PlayerGameState(Player):waiting | playing | eliminated | winner | tie
自适应倒计时
| 存活人数 | 秒数 |
|---|---|
| ≤ 30 | 15 |
| ≤ 50 | 20 |
| ≤ 120 | 30 |
| > 120 | 40 |
NextAuth Provider 对照
| Provider | 类型 | 国内 | 美国 |
|---|---|---|---|
player-code | Credentials(6 位码) | Player | — |
staff-credentials | Credentials(邮箱+密码) | Admin / Display | — |
google | OAuth | 可选 | Player / Admin / Display |
azure-ad | OAuth | 可选 | Player / Admin / Display |
Redis 新增 Key
game:{roomId}:login_code
game:{roomId}:player_number_seq
player:{uuid}:displayNumber
player:{uuid}:displayName
player:{uuid}:internalEmail
internal:{email}:displayName
数据分层
- Redis:游戏 + 登录码 + 显示名(运行时)
- PostgreSQL:RoundSnapshot、GameResult(归档与恢复)