Files
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>
2026-09-05 21:45:40 +08:00
..