跳转至

示例 二:斗地主炸弹

本示例在极简对局的基础上,演示牌型属性与同型比较的写法。具体的牌型选为斗地主里的炸弹:四张相同点数的牌组成一个炸弹,两个炸弹相比,点数大的胜。

主流程几乎不变,仅在牌型这部分新增一个炸弹。

炸弹牌型

属性

bomb_point(整数),记录这个炸弹由哪个点数构成。

build_flow

需要识别「数量为 4 且点数全部相同」。

牌型开始
   → 条件转移(传入牌组数量 == 4 且 4 张点数相同?)
       是 → 匹配返回(result=匹配, bomb_point=第一张牌.point)
       否 → 匹配返回(result=不匹配)

「数量为 4」直接用集合大小组件比较即可。

「点数全部相同」有两种写法,推荐第二种,因为更直观,也方便后续调试。

集合逻辑组件提供「存在」与「所有」两种模式。选择「所有」模式,内部条件设为「当前遍历到的牌.point == 第一张牌.point」。

比较组件 A:第 2 张牌.point == 第 1 张牌.point
比较组件 B:第 3 张牌.point == 第 1 张牌.point
比较组件 C:第 4 张牌.point == 第 1 张牌.point
双目逻辑(与):A 与 B → 中间结果 D
双目逻辑(与):D 与 C → 最终条件

把「最终条件」塞进条件转移的 condition 槽。

平台有意不支持任意循环,因此当遍历的元素数量是变化的(例如顺子长度不固定),要么使用集合逻辑组件,要么针对常见长度分别写判定分支。

compare_flow

炸弹之间比大小:

比较开始
   → 条件转移(A.bomb_point > B.bomb_point?)
       是 → 比较返回(A 胜)
       否 → 比较返回(B 胜)

注意比较返回组件的 result=0 表示 A 胜,result=1 表示 B 胜。这与直觉相反,容易写反。

主流程的微调

主流程沿用示例 一,只需把发牌组件的 count 改大,例如改为 5,让玩家手中更可能凑出四张相同点数的牌。

对局开始 → 洗牌 → 发牌(每人 5 张) → 出牌(P1) → 出牌(P2) → 结束对局

上手建议

可以在规则构建器中先复制示例 一的规则,改名为「斗地主炸弹示例」,然后删掉单张牌型,新建炸弹牌型,按上述步骤拖出 build_flowcompare_flow。进入对局,手动凑两个不同点数的炸弹,验证比较行为是否符合预期。

这与真实的斗地主还差多少

本示例只演示了一个特殊牌型。完整的斗地主还需要以下内容。

  • 多种牌型:单张、对子、三张、三带一、连对、顺子、飞机、炸弹、王炸
  • 跨牌型压制(下一示例):炸弹压过普通牌型,王炸压过包括炸弹在内的全部牌型
  • 抢地主流程:使用动作选择组件让每个玩家叫分,挑选分高者作为地主
  • 底牌发放:发牌阶段为地主额外发三张

每一项都是同一套组件的不同拼法。

下一章引入跨牌型压制:示例 三:跨牌型压制