CardCombination
描述一次牌型组合的结果对象,由 CombinationDetector 产出,供 CombinationComparator 比较。
概述
CardCombination 是 combination 模块的核心数据载体。它把"一组卡牌被识别成什么牌型"这一信息封装为一个不可变的描述对象,使下游的牌型比较器、规则系统无需关心识别细节。
在 CardGameEngine 的 Core 层中,CardCombination 仅承载与具体游戏无关的通用字段(type / cards / rank / value / metadata);游戏专属字段应放在 metadata 中按约定传递,或通过插件层的专属类型扩展。
该文件仅导出
CardCombination接口本身,不提供工厂函数。CardCombination实例由CombinationDetector.detect()构造并返回。
属性
| 属性 | 类型 | 必填 | 说明 |
|---|---|---|---|
type | CombinationType | 是 | 牌型枚举值,参见 CombinationType |
cards | Card[] | 是 | 该组合所包含的卡牌数组,通常已按点数排序 |
rank | number | 否 | 该组合的点数代表(如对子用对子点数),用于跨组合比较 |
value | number | 否 | 组合的综合比较值,优先于 rank 用于比较 |
metadata | Record<string, unknown> | 否 | 附加上下文,不参与默认比较 |
字段语义
rank 与 value 的关系
rank与value二选一由 Detector 决定。CombinationComparator默认优先使用value,回退到rank,再回退到0。- 对于
SINGLE/PAIR/TRIPLE/FOUR_OF_A_KIND/STRAIGHT,CombinationDetector会同时设置rank与value为同一个值(点数代表)。 metadata用于承载 Detector 无法用主属性表达的上下文(如顺子长度、未识别原因等),各游戏可按需约定字段,但不参与默认比较。
metadata 常见字段
由 CombinationDetector.detect() 写入:
reason: string—— 当type为UNKNOWN时给出原因,取值如'empty'、'too many cards of same rank'、'no matching pattern'。length?: number—— 顺子长度(仅STRAIGHT)。low?: number—— 顺子最低点数(仅STRAIGHT)。high?: number—— 顺子最高点数(仅STRAIGHT)。
注意事项
CardCombination是纯数据接口,不应被调用方手动构造;正确做法是调用CombinationDetector.detect()获取。- 该接口与具体游戏解耦,游戏专属牌型(如斗地主的飞机、火箭)应在
src/plugins/<game>/combinations/下独立扩展,不应在 Core 层增加字段。