e2hang
57594dbec5
feat(bridge): 桥牌完整实现(4 人联机,橡胶局计分)+ 椭圆牌桌 UI
- 新增桥牌(Contract Bridge)完整实现:固定 4 人分南北/东西两队
- 引擎 packages/engine/src/games/bridge.ts:
- 52 张牌均分,每人 13 张,共 13 墩
- 阶段机 waiting → bidding → play → score
- 叫牌:Pass / Bid(1♣..7NT 35 个叫品)/ Double / Redouble
* Bid 必须高于上一叫品(阶数优先,同阶则花色等级 ♣<♦<♥<♠<NT)
* Double 只能针对敌方叫品;Redouble 只能针对己方被加倍的叫品
* 连续 3 家 Pass 结束叫牌;4 家全 Pass 作废重发
- 打牌:强制跟花色 / 将牌赢墩 / NT 不可将吃;明手 13 张牌摊开由庄家控制
- 计分:完整实现成局 ≥100、超墩、满贯(小/大)、加倍/再加倍、罚分表(含易局/非易局)
- 橡胶局(Rubber Bridge):完成且成局记 1 局;赢 2 局胜一盘,重置易局
- playerView 隐藏他人手牌,明手牌公开对所有人可见
- UI apps/web/src/BridgeBoard.tsx:
- 椭圆牌桌 + 4 家固定 N/E/S/W 方位(参照双升 / 拱猪 UI 风格)
- 真实姓名显示:G.playerNames(引擎 setName 写入)+ prop(ctx.players)+ setName 兜底
- 常驻计分板:NS / EW 队员姓名 + 本副赢墩数 + 累计分 + 队总分 + 易局 + 盘数
- 顶部状态条:当前副数 / 局数 / 易局 / 契约 / 庄家明手 / 大字号 NS vs EW 墩数对比
- 座位卡:每玩家本副赢墩数 + 手牌张数 + 角色(庄/明/防)
- 叫牌:35 个 bid 按钮 + Pass / X / XX;叫牌历史 hover 显示真实姓名
- 牌桌内显示:上一墩(3 秒高亮后由 collectTrick 收牌)+ 当前墩 + 领出花色
- 明手手牌区:庄家控制时高亮可点;明手本人不可自己出牌
- 文档 docs/bridge/00-rules.md:桥牌规则调研 + 10 条实现选型 + 与标准桥牌的差异说明
- 测试 packages/engine/src/games/bridge.test.ts:49 个用例覆盖牌组 / 叫品合法性 / 跟牌 / 赢墩 / 计分 / 成局
- App.tsx:GAMES 表新增 bridge(fixedSeats=4),GAME_ORDER 插入;BridgeLocalView / BridgeOnlineView
- server/src/index.ts:games 数组与 GAMES_ENTRIES 注册 Bridge,启动日志同步
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>