关于卡牌游戏内置逻辑及底层实现的问题

Viewed 103

项目背景:u3d,c#,mirror做客户端,python写服务端,数据库用mysql实现的卡牌游戏(类炉石)创意是自制桌游移植
想麻烦问下有没有法术效果触发的判定思路(点击卡牌后如何识别触发效果)及效果循环触发逻辑(如果光环类效果逻辑进行了嵌套该怎么办)
法术这里初步设想是通过数据库给卡牌设很多的字段来筛选,但是效率好像很低,循环触发是设置flag,然后设一个上限,每次触发都从新遍历检索
有更好的建议欢迎大佬指正

2 Answers

桌游类型的卡牌游戏最好是设定一个判定的优先级,这个就需要在游戏设计阶段进行划分。
比如目前存在五种卡牌:
场地卡牌:炼狱,效果是生成一个光环,附近2格内的怪物造成伤害+3。(速度+7)
场地卡牌:禁魔空间,效果禁止一切场地卡牌的效果。(速度+2)
场地卡牌:雷雨天,效果是生成一个光环,全场怪物受到伤害+1。(速度+1)
怪物卡牌:熔炉法师,面板5/5,战吼效果是造成3点伤害
奥秘卡牌:反制陷阱,效果是当对方攻击时,直接破坏攻击怪物。

在服务端进行运算判断时,按照游戏的设计思路,是先判断场地卡牌的光环效果,然后判断怪物卡牌的战吼阶段,随后是怪物攻击阶段,怪物攻击后反制阶段和亡语阶段。所以在判断场地的逻辑阶段内,根据速度来计算优先级。炼狱的速度是最高的,也就是说优先级最高,所以此时可以使用升序遍历所有属于场地阶段判定的速度属性。先判断速度+1的雷雨天生效,然后判断速度+2的禁魔空间生效,全部光环效果移除,最后判断速度+7的炼狱生效,重新添加光环BUFF,这样可以避免逻辑嵌套。
随后再进行其他阶段的判定,比如入战阶, 战阶和战后阶和亡语等,具体看设计师怎么设计,仅提供一个参考思路

去b站找监听与广播的教程慢慢学。
具体例子如下:
当回合开始时发布一个“回合开始”广播。
如果一张卡的效果有“回合开始”时,“对对手造成1点伤害”。它的使用过程就是添加监听(内容:回合开始)(结果:对对手造成1点伤害。此时会发布广播对方受到伤害)。
如果一张卡的效果有“对方受到伤害”时,“回复1点体力”。它的使用过程就是添加监听(内容:对方受到伤害)(结果:回复1点体力)。
如果哪张卡的效果失效就将它的监听移除。同时按照我的经验,监听还要细分,比如即时还是延迟,特定还是全局等等。这些就自己按需求修改。
当时这时东西我想了很久,现在便宜你了。