ecs-observable/examples/three-monks/design.md

79 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 三个和尚
三个和尚是 3-8 人进行的卡牌游戏。
玩家在游戏中扮演挑水生活的和尚。但是挑水的人越多,挑到的水却越少。
首先喝到 10 口水的玩家赢得游戏胜利。
## 游戏流程
游戏按轮进行。
每轮游戏进行以下阶段:
- 出牌阶段:每名玩家各选择一张手牌扣下,同时翻开。将上一轮打出的牌收回手牌。
- 行动阶段:依次进行有玩家提议进行的行动阶段。
- 念经阶段:
- 参与玩家:提议念经的玩家。
- 将木鱼标记交给最后一名念经的玩家。
- 挑水阶段:
- 参与玩家:持有挑水道具,且没有休息的玩家。
- 每名参与玩家将 2 个自己的水标记放在挑水道具上;若水不足,则不放。
- 从供应堆拿取玩家人数减去参与玩家数的水标记,放入桌面中央。
- 交换阶段:
- 参与玩家:没有提议念经的玩家。
- 每名参与玩家将自己的道具交换给左侧参与玩家。
- 道具上的水标记一同交换。
- 喝水阶段:
- 参与玩家:所有玩家。
- 每名参与玩家依次从桌面中央获得 1 个水标记。
- 喝水时,可以从自己面前的道具上获得最多 2 个水标记。
游戏开始时,每名玩家获得 2 个水标记,然后随机挑选一名玩家获得木鱼标记。
所有的结算从持有木鱼标记的玩家开始顺时针依次进行。
## 规则细化
- 行动阶段按固定顺序结算:念经 → 挑水 → 交换 → 喝水。只要任意玩家提议某阶段,该阶段本轮会结算一次。
- 出牌时,上一轮打出的行动牌本轮不可选择;所有玩家完成本轮选择后,上一轮行动牌回到手牌,本轮行动牌成为下一轮不可选择的牌。
- 游戏开始时洗混 10 张道具牌,每名玩家随机获得 1 张;未使用的道具牌不进入本局。发给玩家的道具牌中,挑水道具始终占一半;玩家人数为奇数时,挑水道具数量向上取整。
- 喝水阶段中,玩家按木鱼标记开始的顺时针顺序逐个结算。玩家喝水后若达到 10 口水,立即获胜;若多人同阶段可能达到 10结算顺序靠前者先胜利。
- 木鱼道具在一轮结束时将木鱼标记交给其拥有者,会覆盖本轮念经阶段得到的木鱼标记。
- 挑水时,水从参与玩家已喝到的水移动到其挑水道具上;若玩家的水不足以支付需要放置的数量,则本次不移动水,因此该玩家和其道具上的水总量不变。
- 净瓶的水来自供应堆。
- 老鼠在念经时总共移动 1 个水标记:从左右相邻玩家任一有水的道具上移动 1 个水到老鼠上。
- 大碗在其拥有者喝水时,若本次没有从大碗上喝到水,则可从桌面中央将 1 个水标记放到大碗上。
- 水缸拥有者只有自己提议喝水时才参与喝水阶段;参与时从供应堆额外获得 1 口水。
## 游戏配件
玩家配件8 组)
- 5x 行动牌:
- 提议挑水/交换/喝水/念经:若有任何玩家打出,本轮会进行此阶段。
- 休息:不参与挑水阶段。
公共配件:
- 若干水标记物
- 木鱼标记
- 10x 道具牌
- 木鱼:一轮结束时,获得木鱼标记。
- 水桶:挑水道具。挑水时只需将 1 个自己的水放在桶里。
- 净瓶:念经时,在净瓶上放一个水标记。
- 木桶:挑水道具。若有其他玩家参与挑水,无需将水放在桶里。
- 大碗:喝水时若未从大碗里喝到水,可从桌面中央将 1 个水标记放在大碗上。
- 大桶:挑水道具。喝水时可从桶里喝任意口水。
- 老鼠:念经时,可从两侧玩家的道具上将一个水移动到老鼠上。
- 扁担:挑水道具。被交换时,将扁担上的水放回桌面中央。
- 水缸:喝水时从供应堆额外获得一口水。必须自己提议喝水才能参与喝水。
- 水瓢:挑水道具。挑水后,从中央将一个水放在瓢里。
## 设计实现
- `components.ts`: 游戏数据与状态
- `gameflow.ts`: 规则流程行为树
- `rules.ts`: 规则引擎(阶段包装器 + 核心结算函数)
- `logging.ts`: 日志输出
- `simulate.ts`: 对局模拟与统计
- `random-playthrough.ts`: 单局详细回放