需求拆解

战斗同步

1.战斗同步有2种模式,一种是离线验证模式,在本地记录操作帧和随机种子,发送到服务端,再重新演算战斗逻辑;另一种是同步模式,客户端只转发操作帧,由服务端下发真实操作帧。服务器成本原因,优先实现第一种。

2.结果验证

3.掉落验证

战斗流程

1.实现战前匹配(可以是玩家也可以是Boss)、匹配成功后在服务端对所有玩家建立房间,下发开始。房间用状态机管理。进入房间后,启动倒计时,超过设定的最长战斗时长(10分钟)就判定失败,战斗视为失败,服务器回收资源。

2.从第一回合到最终回合,每一个回合的内部,进行回合触发时机的执行、行动优先级的判定、技能逻辑的执行、存活死亡的结算、战斗胜负的判定这几个程序步骤。

技术实现

伪随机

1.PRD算法

这是伪随机在游戏中最常见的用法,因此直接就被玩家用Pseudo Random Distribution的缩写PRD来指代了。

在WAR3中,一个暴击率20%的英雄,并不是每一刀都20%暴击率的。而是以5.57%作为初始暴率,如果第一刀不暴,则第二刀的暴率增加到初始值的2倍:11.14%;如果还是不暴,就继续增加到初始值的3倍:16.71%,以此类推。

而如果在这个过程中任何一次攻击打出了暴击,就会把暴击率重置到5.57%。

因此可以把所有游戏中可能出现的暴击概率(比如0-100的整数%) 和 公式计算出的初始值 做成一张映射表,就不需要随机了。

2.洗牌算法

类似于音乐播放器,在一开始就把所有可能的结果列出并洗成乱序,然后从第一个开始取。那么具体怎么洗的话,就是比如30个按顺序排列的不重复数字,先从下标0-29里random一个,放到29,再从0-28里random一个,放到28…每次放到数组最后的就是洗好的,这样可以避免每次random的时候随到重复下标。

3.组合随机

其实就是保底机制,用于抽卡。品质值不随机(固定SR、SSR),只随机具体物品值。

业务实现

掉落

https://www.jianshu.com/p/f9c37c46c03c

战斗序列

使用行动队列的方式,通过将每一个行动定义为一个行动节点(操作帧),按照队列中节点的顺序依次执行。不管是回合初就确定了行动顺序,还是回合中每完成一个行动都需要重新计算行动优先级的方案,都适用上述的方式,区别只在于对技能逻辑中衍生的行动节点,是添加到队列的末端还是插入到队列的头部。

另外为了打破技能循环(比如暴击后再攻击一次),还需要定义出行动节点的类型,由战斗回合产生的行动节点称为原始行动节点,由技能触发的行动节点则称为衍生行动节点,所有的反制行动、追加行动都应该归属于衍生行动节点。