[置顶] 卡牌游戏战斗、战报及其验证处理的通用框架

         本文介绍手游中一种通用的战斗处理框架,主要讨论战斗、战报和服务器验证三方面的处理。讨论的游戏代表作为《我叫mt》、《刀塔传奇》、《COC》(这里介绍的是他们可以这么实现,并不是说他们是这么实现的)

         首先介绍下用到的基本原理:一个无状态的系统,相同的输入肯定会产生相同的输出。无状态的系统可以理解为一个无副作用的函数,输入理解为函数的参数,输出为函数返回值。

         举个简单的例子

         int func(int a, int b)

         {

                  return a + b;

         }

         这个函数就是一个无状态的系统,a,b是输入,返回值是输出,如果输入a=1,b=2,那么输出肯定是3。

         稍微复杂点,任意多个无状态系统的任意组合还是一个无状态的系统。

         在具体环境中实现时需要考虑更多的因素,包括但不限于浮点数的格式和精度,int占用的字节数等,一定要避免这些不确定的因素,否则不一样的系统就不能产生预期的结果了。

 

《我叫MT》的战斗处理

        

         整个战斗系统就是一个无状态的系统,主要涉及战斗的规则和战斗使用到的技能,这些都可以实现为无状态的子系统。在我方阵容和敌方阵容不变的情况下整个战斗过程和战斗结果都是唯一的,需要注意的一点是系统中用到的随机数,这需要提前确定一个随机数种子一起作为输入传入系统。时间步进器是战斗系统的心跳,它推动战斗系统前进,每次心跳推动战斗系统完成一回合的计算。

         除了前端表现模块单独由前端实现之外,整个系统由客户端和服务器端共用,时间步进器产生的频率影响战斗的速度,客户端根据当前是1倍速还是2倍速进行调整;后端只需要战斗结果,可以则尽可能快的推进时间步进器的前进(也就是用while循环进行步进)。

         我方阵容+敌方阵容+随机种子就是一份完整的战报。战报可以由后端产生也可以由前端产生,只要将战报输入到战斗系统就可以得到战斗结果,自然也就完成了战斗的验证。

         总结一下设计要点:

1.      输入:敌方阵容+我方阵容+随机种子,这也是战报的存储内容

2.      时间步进器:控制战斗的速度

3.      战斗系统:无状态系统,或由无状态系统组成的系统,完成战斗验算。

 

《刀塔传奇》的战斗处理

与《我叫MT》不同的一点是,它在战斗中可以进行输入:

[置顶] 卡牌游戏战斗、战报及其验证处理的通用框架_第1张图片

由于这一点不同,战报必须在前端产生然后发往后端进行验证。

         为了把输入确定化,我们规定可以在一些离散的点记录和实施输入,比如时间步进器每隔0.1秒前进一次,同时记录和操作一次输入。然后我们收集这些来自用户的输入和我方阵容、敌方阵容和随机种子共同组成了一份战报发往服务器,服务器有了这份战报数据就可以通过战斗系统完整还原战斗过程,得到结果。

 

《COC》的战斗处理

         看起来非常复杂,但基本原理跟《刀塔传奇》是一样的,只是战斗系统更复杂了,时间步进器更精细了。但是我们依然可以根据进攻阵容,防守阵容,随机种子和时间轴上的输入来还原整个战斗过程。

你可能感兴趣的:(游戏,验证,手游,战斗,卡牌)