首页 > 电竞游戏 > 详情

深度分析|海岛奇兵的获取即计算算法

​作者:

独立游戏开发者    王仁信  

 

 在MMO中服务器最主要的功能是做数据同步,出于一些原因服务器会对需要同步的数据做相应计算,越是实时性强的游戏服务器的计算压力越大。海岛奇兵实现了(包括不同区域及不同平台)世界统一单服,暂不论服务器拓扑结构方面的有效方案,就游戏逻辑计算流程来讲完全不需要动作游戏的实时跑帧tick,原因是loop主循环完全没必要而且不loop的逻辑算法一点也不难写。

为描述方便,简单做一些名词定义:

收割玩法。游戏的“布置-等待-完成”过程。

离线玩法。收割玩法+离线时被攻陷(包括自己被推送给其他玩家并被攻陷以及岛屿被系统占领为PvE节点)。

在线玩法。在线时主动出击。

海岛奇兵游戏中的一切计算全在相关数据被获取时被动触发。离线玩法内容如下:

1. 建筑建造/升级;

2. 科技升级;

3. 兵力生产;

4. 神像建造;

5. 自己(主基地或资源岛)被推送给其他玩家并被攻陷;

6. 空闲岛屿被系统占领为PvE节点。

其中前4个为收割玩法建造队列,再加上后两个构成离线玩法。试以实例分析无主循环、获取即计算的流程。

建筑建造/升级。玩家主动发起一个建筑建造/升级请求,服务器收到并记录这个请求及其发生时间t0。当发生获取关于此建筑的信息的请求时再做建筑的最新信息,那么获取发生在什么时候呢,最简单的是在玩家再次上线时或者其他玩家主动点进自己的主基地时,记为t1,若建筑建造/升级所需时间为tc,不难想像t1-t0>=tc则建造完成,否则建造未完成且可知剩余时间。如果从发出建造请求到建造完成玩家一直在线,这个时间是由客户端一直在tick的,并在客户端tick完毕时请求一次数据获取,对于服务器来说只需要负责在获取时计算。科技升级、兵力生产、神像建造同理可知。

自己(主基地或资源岛)被推送给其他玩家并被攻陷。攻陷相关数据在攻击方进攻后就存在服务器中了,当自己上线时简单的获取到这个数据。

空闲岛屿被系统占领为PvE节点。海岛奇兵这类游戏系统需要做到给活跃玩家足够的挑战,还不能让不够活跃的玩家被虐的太惨,在COC中PvP完全由玩家主动搜寻,系统负责把实力与玩家活跃度相关的其他玩家交给攻击者,护盾这一设定即在很大程度上防止玩家不断被虐。在海岛奇兵中这点有所不同,玩家再也不能主动搜寻目标,可以打谁完全由系统决定并推送过来,护盾当然就没有用了,因为系统可以避免把已被攻陷的玩家推送给更多人。关于活跃度先来看一张说明图:

                            -

主动出击胜率                推送对手难度

                     +↘︎  活   +

                             跃

                      -  度   ↘︎+

被动沦陷负率                被推送概率

                              +

左边由玩家敌我决定,右边受系统平衡。加号代表增强,减号代表抑制。主动出击赢的越多,越增强活跃度,被攻陷则会抑制活跃度,活跃度越高推送过来的对手难度和被推送出去的概率都会增强,而推送对手难度会抑制出击胜率,被推送概率会增强被攻陷概率。在反馈系统中正反馈循环会增强差异,负反馈循环会抑制差异,可以看出“主动出击胜率、活跃度、推送对手难度”以及“被动沦陷负率、活跃度、被推送概率”是海岛奇兵的战斗部分的核心负反馈循环,前者避免玩家过于无敌失去挑战,后者避免玩家被虐的太多而产生严重的挫败感,配合游戏的推送机制,在调节活跃度的同时可以保证玩家留存。说了半天活跃度那么空闲岛屿被系统占领为PvE节点的计算发生在什么时候呢,答案是玩家上线时。玩家的海域占领信息只有自己才看得到,因此只有玩家上线才会发生占领信息的获取。上线时,系统可以通过计算得到玩家在最近一段离线期间活跃度的变化情况,从而根据活跃度把PvE节点推送到玩家的空闲岛屿上。

获取即计算的方式并不新鲜,这是web服务器的主要运行方式。关于某场战斗的计算,海岛奇兵游戏可以交给客户端处理,但服务器会做必要验证。行走速度、攻击频率是常量,可以对某时间段内位移距离、伤害输出做验证。关于在客户端上计算的微观兵力分布和攻击区域判定,云风给出过一个可行方案在COC Like游戏中的寻路算法一文,战斗预计算、回放相关的讨论超出本文主题,不在本篇。

我没看过海岛奇兵的实现代码,本文为主观猜想,如有雷同,英雄所见。

QR code