战斗死亡结算

现在后端的战斗里有一个问题,有的角色在死亡之后又因为回血的原因重新复活,导致前端战斗出现显示bug。

对于这个问题,我首先想到的解决方案有三个:
1. 每次加血的时候检查该角色有没有死亡,若死亡,则不给其加血
2. 阶段性的检查角色死亡状态,角色在阶段中死亡可以加血复活,跨阶段则不可以
3. 角色每次扣血后死亡及时生效

我们下面仔细想想这三个方案。

首先,对于第一个方案,实现方式很明确,为每个角色提供一个加血的接口,加血前检测角色是否死亡。
然后,战斗中所有加血的地方都必须调用该函数,这里涉及到一些已有代码的改动,但是通过搜索应该是比较容易定位的。另外, 加血接口应当返回加血的结果,以便返回给前端正确的血量变化数据。

从以上分析来看,第一个方案实现简单,对原有代码的改动也比较方便,好像是个不错的方案。但是,我们只是阻止给死亡的角色加血,从表面上来看好像解决了角色死亡后复活的问题。战斗中不会再出现角色死而复生,这是肯定的,但是我们并没有阻止死亡的角色做他不应该做的事。比如说,我们有一个技能,在角色进行攻击时,会扣除角色自身血量,如果该角色此时死亡,他仍然会进行攻击行为,这是不合理的。当然,这个例子可以经过一些检查,使其不会发生,但其引出的问题都一直存在。说到底,我们只是阻止了给死亡的角色加血,并没有阻止一些与死亡角色相关的行为,比如说给其加buff,使其身上的buff生效等等,如果对所有这些与角色相关的行为进行检查,那其实就变成了方案3。

第一个方案局限性太大,我们再来看看第二个方案。我们战斗每个攻击回合分成五个阶段,技能出手前,攻击命中前,攻击命中时,攻击命中后,技能出手后,我们在每个阶段结束后检查角色的死亡状态,如果是攻击者在攻击命中前死亡,则停止接下来的攻击行为。 若攻击者在攻击结束后死亡,或者其他角色死亡,则移除其身上的buff,以及将要对其进行的行为。主要修改的是战斗中的simulateTurn函数,对于其他部分应该基本不需要改动。

从以上分析来看,实现比第一个方案稍难,对原有代码影响小,保证了角色不会跨阶段复活,不会在该阶段确认死亡后进行不合理的行为, 因为后面的阶段会剔除死亡的角色。
那么,这个方案的缺点是什么呢?首先,还是有一点不合理的情况,在同一阶段,角色血量可能出现为负但不死亡的情况(前后端都有),并且可以和正常角色进行一样的行为,比如回血,加buff,攻击等等。假设这个阶段性确认死亡的策略,策划和玩家可以接受,那么前面所讲的缺点就可以忽略。但是,我还担心的一点是,我们代码中在一些操作之前是有对角色的状态进行检查的,比如判断是否死亡, 如果这些代码不更改,则可能出现一些违反阶段性死亡策略的情况,一些应有的操作没有进行。如果更改的话,又会多牵扯一些原有代码的改动。

总体来说,第二个方案是个可以勉强接受的方案。

我们再来看看第三个方案,死亡及时生效。这个方案的核心是角色一旦死亡,则不该做一些与其死亡状态相违背的行为,比如攻击,回血等等。如果实现这个方案,那么应该是最符合常理的。我的第一感觉是这个方案实现起来比较难,因为在每个角色可能死亡的地方都需要加上判断, 这样一来,要改动大量原有的代码。但是,写到这里,好像想到了比较好的实现思路。

我们战斗中除了直接攻击(普攻或者绝攻)这个行为之外,其他的加血,加buff,五行技能,宠物技能等等,都是通过buff来实现的,那么我们只需要在添加单个buff或者单个buff生效的入口处检查角色是否死亡,该buff可否在死亡角色身上生效,附着,就可以保证不对死亡角色进行非法的操作,也就不会加血,不会死而复生。然后再处理一下直接攻击,这样,只有稍微改一下直接攻击和buff附着,生效时的代码,就可以实现。

从上面的分析来看,这个方案改动起来比方案二更简便,效果更好,唯一的缺点就是策划需要在buff表添加两列表示其是否可以在角色死亡时附着,生效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值