如何架构类万智牌(MtG)的卡牌游戏?含核心机制实现疑问
卡牌游戏机制设计与架构优化问题
核心需求与卡牌效果实现疑问
我希望开发一款类似万智牌(MtG)或《情书》的卡牌游戏,包含大量不同效果的卡牌,以下是简化版示例及对应实现疑问:
- Guard卡牌:打出后可指定一名其他玩家并将其淘汰,这是最易实现的卡牌;
- Assasin卡牌:若持有者被Guard锁定为目标,可弃置此牌并淘汰发起攻击的玩家,是否只能通过监听目标选择动作来实现?
- Handmaiden与Sycophant卡牌:前者使持有者直到下一回合前无法被锁定为目标;后者强制其他玩家必须锁定持有者为目标。目前我设想为玩家添加
targetingPriority属性,-1代表不可被锁定,+1代表必须被锁定,但考虑到万智牌中存在flying、reach、trample、protection等大量交织的目标机制,是否有更优方案? - Countess卡牌:若持有者同时持有Prince卡牌,则必须打出此牌。该卡牌会限制持有者在特定条件下无法打出其他牌,我最初设想将逻辑放入Prince卡牌,但效果定义属于Countess,为何要让Prince知晓?也考虑过使用
playingPriority属性,但需在每次抽牌时更新,是否有更优方案?
当前架构思路的困境
我当前有两种思路,但都存在明显问题:
- 让卡牌对象监听所有游戏动作/状态变化,为对应玩家生成效果并作为玩家的属性修饰器,但这要求每张卡牌知晓几乎整个游戏逻辑,过于复杂;
- 将所有代码放入Game对象,因其知晓所有玩家、卡牌与效果,但会导致Game成为包含数千行代码的“上帝对象”,维护难度更高。
诉求
希望找到处理类似卡牌游戏机制的优雅源码示例,更希望能获取解释相关设计思路与优势的文章。
内容的提问来源于stack exchange,提问作者Dmytro




