feat: 实现最小正式版过水不胡规则并完善前端动作面板
- 后端实现最小正式版过水不胡规则:玩家在响应窗口选择PASS后,直到下次摸牌前不能响应胡 - 完善GameSeat状态管理,新增passedHuBlocked字段及相关方法 - 在ResponseActionWindowBuilder和GameActionProcessor中增加过水不胡校验 - 前端重构动作面板,区分回合动作和响应动作,支持多用户视角切换 - 优化公共事件处理逻辑,自动清理失效的私有动作面板 - 更新相关文档说明当前实现的规则范围和工程取舍 - 补充测试用例验证过水不胡规则的正确性
This commit is contained in:
@@ -1,58 +1,16 @@
|
||||
# 正式血战计分 V1(2026-03-20)
|
||||
- 已从工程占位分切换到“最小可扩展正式版”计分骨架。
|
||||
- 新增后端规则服务:`backend/src/main/java/com/xuezhanmaster/game/service/BloodBattleScoringService.java`
|
||||
- `SettlementResult` 已扩展 `settlementDetail`,结算事件 `SETTLEMENT_APPLIED` 现在会携带:
|
||||
- `baseScore`
|
||||
- `totalFan`
|
||||
- `paymentScore`
|
||||
- `fans`(番型明细)
|
||||
- 当前 V1 已支持的基础番型/加番:
|
||||
- `七对`:2 番
|
||||
- `对对胡`:1 番
|
||||
- `金钩钓`:1 番
|
||||
- `清一色`:2 番
|
||||
- `根`:每个 1 番
|
||||
- `抢杠胡`:1 番
|
||||
- `杠上花`:1 番
|
||||
- `杠上炮`:1 番
|
||||
- `海底捞月`:1 番
|
||||
- `海底炮`:1 番
|
||||
- 当前胡牌计分口径:`paymentScore = 1 << totalFan`
|
||||
- 点炮胡:放炮者单独支付 `paymentScore`
|
||||
- 自摸胡:所有未胡玩家各支付 `paymentScore`
|
||||
- 抢杠胡:按胡牌番型 + `抢杠胡` 1 番,由补杠方单独支付
|
||||
- 杠上花:在自摸胡基础上额外加 1 番
|
||||
- 杠上炮:在点炮胡基础上额外加 1 番
|
||||
- 海底捞月:自摸胡时若牌墙已空,额外加 1 番
|
||||
- 海底炮:点炮胡时若牌墙已空,额外加 1 番
|
||||
- 当前杠分口径:
|
||||
- `明杠/点杠`:放杠者单独支付 2 分
|
||||
- `补杠`:所有未胡玩家各支付 1 分
|
||||
- `暗杠`:所有未胡玩家各支付 2 分
|
||||
- `GameSession` 已新增:
|
||||
- `PostGangContext`:只记录“杠后补摸到下一次自摸/弃牌裁决”这段窗口,用于判断 `杠上花/杠上炮`
|
||||
- `settlementHistory`:记录已应用结算结果,供局终 `退税/查叫` 直接复用
|
||||
- 海底相关不新增额外状态对象,直接复用“胡牌时牌墙已空”这一现有事实,保持 `KISS`。
|
||||
- 查叫/退税已接入局终处理:
|
||||
- 触发时机:牌墙耗尽且仍有多家未胡时
|
||||
- 处理顺序:先 `退税`,再 `查叫`
|
||||
- `退税`:未听牌玩家若此前有杠分收入,需要按原支付关系逐笔退还
|
||||
- `查叫`:未听牌玩家向仍在场且已听牌玩家,按对方理论最大可胡牌型的点炮赔分支付
|
||||
- 已新增 `SettlementType.TUI_SHUI` 与 `SettlementType.CHA_JIAO`
|
||||
- 已新增 `ReadyHandOption`,用于查叫时记录最优听牌目标牌与对应结算明细
|
||||
- 一炮多响已接入响应裁决:
|
||||
- `HU` 现在支持多赢家同窗裁决,只要响应窗口内有多个 `HU` 声明,就会一起结算
|
||||
- `PENG/GANG` 仍保持单赢家,顺位规则不变
|
||||
- 抢杠胡窗口也会复用这套多赢家 `HU` 裁决路径
|
||||
- 已新增 `ResponseActionResolutionBatch` 承载多赢家响应结果
|
||||
- `HuEvaluator` 已补 `七对` 胡牌判定,并暴露 `isSevenPairs` / `isPengPengHu` 给计分层复用。
|
||||
- 当前仍未实现:
|
||||
- 自摸加番/加底地方变体
|
||||
- 天胡、地胡
|
||||
- 过水不胡
|
||||
- 文档约定已加强到 `docs/DEVELOPMENT_PLAN.md`:
|
||||
- 后端复杂规则、状态切换、结算口径和跨阶段流程,必须补适量中文注释
|
||||
- 前端复杂交互、实时消息消费、动作面板联动和视图状态切换,必须补适量中文注释
|
||||
- 数据库表结构、迁移脚本、初始化 SQL、索引和存储过程,必须补中文注释说明业务含义、约束原因、字段口径和回滚要点
|
||||
- 麻将规则判断、结算分摊、响应裁决、实时消息边界、局终处理、数据迁移与回滚脚本,默认视为中文注释必需区域
|
||||
- 最小验证:`cd backend && mvn clean test`,当前 51 个测试通过。
|
||||
- 当前已支持的规则主线包括:七对、对对胡、金钩钓、清一色、根、抢杠胡、杠上花、杠上炮、海底捞月、海底炮、明杠/补杠/暗杠、退税、查叫、一炮多响、最小正式版过水不胡。
|
||||
- 当前胡牌计分口径:`paymentScore = 1 << totalFan`。
|
||||
- 一炮多响:只对 `HU` 开放多赢家同窗裁决,`PENG/GANG` 仍单赢家。
|
||||
- 过水不胡:玩家在响应窗口里本可 `HU` 但选择 `PASS` 后,直到自己下一次真正摸牌前,不能再做响应胡;不影响碰、杠、自摸胡。
|
||||
- 后端最小验证:`cd backend && mvn test` 通过,当前 53 个测试通过。
|
||||
- 前端 H5 对局页已经完成两轮联调:
|
||||
- 已区分“当前回合动作”和“响应动作”两种动作面板。
|
||||
- `DISCARD` 继续通过点击手牌执行,`GANG/HU` 等额外动作走统一面板。
|
||||
- 响应动作面板会展示 `sourceSeatNo`、`triggerTile`、`triggerEventType`、`windowId`。
|
||||
- 已支持在对局页切换玩家视角,并自动刷新对应 `GameStateResponse` 与重连该玩家私有 WebSocket 主题。
|
||||
- 公共事件接收已改为统一入口处理,会在 `RESPONSE_WINDOW_CLOSED`、`TURN_SWITCHED`、`TILE_DISCARDED`、`GAME_PHASE_CHANGED` 等场景下清理已失效的私有动作面板,避免旧窗口残留。
|
||||
- 公共事件时间线已支持中文摘要文案、时间展示和原始载荷折叠查看,便于联调时同时看“业务含义”和“真实 payload”。
|
||||
- 注释约定继续有效:后端复杂规则、前端复杂交互和后续数据库脚本都要补适当偏多的中文注释。
|
||||
- 前端验证:`cd frontend && npm run build` 通过。
|
||||
Reference in New Issue
Block a user