魔塔吧 关注:67,095贴子:2,181,300
  • 3回复贴,共1

对于攻速的新定义

取消只看楼主收藏回复

本人这段时间在研究攻速问题。第一次接触这个概念是在《永不复还》上,那里攻速的定义是伤害的系数,计算式是攻速的开平方的十分之一,这个系数乘上(勇攻-怪防)作为单回合伤害。也就是说,这里的攻速当做伤害系数处理,和勇士进攻快慢没有关系,勇士和怪物还是我一下你一下对打的(不考虑属性)。那么,攻速能不能作为进攻频率的表征呢?对此引发了一个思考。
下面来看几个例子。
首先是怪物血量等于(勇攻-怪防)x1.5(注:系数大于1小于等于1.5即可),设勇士攻速225%,按照计算关系,伤害系数x1.5,此时可不费血。按照攻击频率的定义,攻击频率以1.5倍计算,也就是每2回合勇士进攻3次,且攻击的间隔相同,分别是第一回合中期,第二回合中期以及第二回合末期,依次循环。由此可见,在勇士前两次攻击直接,也就是第一回合末期,怪物进攻一次,勇士受到一次伤害。
第二个例子,假设怪物生命1(勇士可秒杀),勇士攻速计算后的系数为0.5。按照《永不复还》的定义,勇士可秒杀不扣血。而按照攻击频率0.5的定义,勇士的第一次进攻应该在第二回合末期,怪物可在第一回合进攻1次,扣1次血。
所以,不同的计算方法对于伤害计算是不同的。我引发的新定义是基于攻击频率的,也就是勇士每次进攻对怪物造成的伤害就是(勇攻-怪防),而攻速不同导致攻击频率改变,进而影响伤害。
明确了定义之后,最大的难点就是写伤害计算式了。因为条件所限,不能显示回合战斗(典型RPG战斗形式),无法展现小数回合进攻,所以写脚本时需要近似处理。攻击频率只定义在勇士身上,怪物在一般情况下还是一回合进攻一次,这里就以怪物进攻作为标尺来计算勇士进攻频率。也就是仍采取1回合勇士和怪物分别进攻的传统模式,只不过在勇士上做了一些改变。加一个条件判定,根据勇士攻速,判定勇士当前回合的进攻次数,可能不攻击,可能攻击1次,也可能攻击多次。一次战斗中各回合勇士攻击次数并不完全相同。
这时就要写新的伤害计算式了,目标在于求出怪物进攻了多少回合(普通属性下),勇士的攻击频率成为问题的关键。因为现实当中不出现小数回合,所以有小数的都按整数处理。比如勇士攻击频率1.5,在第一回合末期应该完成1次进攻外加第二次攻击前的休息时间。因此第一回合只进行1次攻击,按去尾法取整。但是休息时间不能凭空消失,所以应有多个变量辅助判断,使第二个自然回合能进攻2次。
由于脚本是用循环写的,当怪物血量到0时就退出循环,得出怪物进攻回合,因此无需判断整数回合情况,原脚本“@eatimes-=1 if @eatimes==@ehp*1.0/((@ma-@ed)*@orbatktimes).to_i”要删去。
#以下为计算怪物攻击回合数脚本(攻击频率设计为速度值/100.00,这边保留2位浮点数,速度值为100时每回合进攻1次,建议初始值设为100)
#d表示攻击频率,i表示理论进攻次数,j表示敌攻次数,k表示己方实际进攻次数
#x表示1回合己方进攻次数
#(以敌攻1次为一个回合计算,j、k、x取整,i不取整)
@d=@orbatktimes
@i=@j=@k=@x=0
loop do
@i+=@d
@x=@i-@k
if @x%1!=0
@x-=@x%1
end
@ehp-=(@ma-@ed)*@x
if @ehp<=0
break
end
@k+=@x
@j+=1
end
@eatimes=@j
由于本人刚接触RUBY,只能用基本的语法结构,脚本看起来会比较繁琐。希望有能力的大佬能改得更简洁些。如有问题,请多指教。
备注:使用时请打开开关27“速度是否有效”,并在开始事件给勇士速度赋值


IP属地:湖北1楼2019-02-26 22:22回复
    通过类比上述的计算方法,可以创造出“概率转频率"的思想。众所周知,魔塔是以固定伤害为第一要义的,就必须去除随机性元素。然而随着创新时代来临,概率又是最常用的,详见其他RPG游戏,我就不列举了,极大丰富了游戏趣味性。就魔塔而言,有个典型的例子。一个是新新1的章,技能发动是随机的,伤害不是固定的。(衍生出SL大法)。
    参照1楼的脚本,可以这样设计。假设霸者技能发动的概率是30%,先设置判定当技能条达到100%时发动技能,不足100%时不发动,每回合技能条增加30%,然后判定。这样就能实现固定伤害了。
    概率转频率有很多用处,比如设置闪避率,暴击率等等。


    IP属地:湖北来自Android客户端7楼2019-02-27 00:15
    回复
      2025-12-22 21:42:42
      广告
      不感兴趣
      开通SVIP免广告
      关于怪物攻速
      从1楼的脚本延伸,之前的脚本是将怪物攻击1次当作1个回合。现在加入怪物攻速这个变量,也就是说勇士攻速和怪物攻速同时为变量的计算脚本。
      首先定义一下攻速的计算规则,不同的人可以设置不同的规则,为了方便,本帖统一设为速度值/100.00=攻击频率(保留2位小数)。按照怪物攻速为基准量,也就是怪物攻速=100(攻击频率为1)。由于双方攻速均为变量,如果再按照自然回合计算,情况将非常复杂。
      来看个例子,勇士攻击频率0.6,怪物攻击频率1.1。第一回合勇士不行动(0.6),怪物攻击(1.1),第二回合勇士攻击(1.2),怪物也攻击(2.2)。注意一下,到第二回合末的时候勇士比怪物慢了1个回合,但是如果按照自然回合来判定的话,勇士会误判先攻。所以不能再按照自然回合考虑问题。
      转而研究勇士和怪物的攻速关系,还是以怪物攻击作为1个单位时间(不是自然回合),看勇士攻击速率是怪物的几倍,在每个单位时间进行计算分析即可。说白了,就是作商,令勇士速率/怪物速率=勇士相对攻击频率,只要将相对频率代入原脚本计算即可。
      另外,相对频率满足除法定律,被除数和除数同时扩大或缩小相同的倍率(不为0),商不变。也就是说勇士速率和怪物速率同时增大或缩小相同的倍率,相对频率不变。举个例子,勇士攻击频率2.0,怪物攻击频率1.0,相对频率2.0,当勇士攻击频率为4.0时,怪物攻击频率如果为2.0,相对频率还是保持2.0。


      IP属地:湖北来自Android客户端16楼2019-02-27 19:56
      回复
        计算系统更新,勇士和怪物攻速有效,新增怪物闪避率。(考虑到勇士增加闪避率会导致不可控情况,闪避增加到100为无敌,故勇士闪避按0设计)勇士命中率=1-怪物闪避率,命中率最大值为100%,闪避率最大值为100%。新增辅助伤害(这里作为一个接口,技能道具辅助人物等都可以放这边)规则是每一个自然回合进攻1次(施放的时间点和常规魔塔一样),且命中率恒为100%,不受闪避影响,无视怪物防御。
        设da为勇士频率,db为辅助施放频率这里设1.0),ia为勇士理论进攻次数,ib为辅助理论进攻次数,j为怪物行动回合,ka为勇士实际进攻次数,kb为辅助实际进攻次数,x为1回合勇士进攻次数,y为1回合辅助进攻次数,dc为怪物进攻频率,e为怪物闪避率,f为闪避率累加频率
        以下为脚本
        @da=#接入勇士速度/100.00
        @db=1
        @dc=#接入怪物速度×1.00
        @da/=@dc
        @db/=@dc
        @f=@ia=@ib=@j=@ka=@kb=@x=@y=0
        @z=#接入辅助伤害
        loop do
        @ia+=@da
        @x=@i-@k
        @x-=@x%1 if @x!=0
        @f+=@e
        @ib+=@db
        @y=@ib-@kb
        @y-=@y%1 if @y!=0
        if @h<1.0
        @ehp-=(@ma-@ed)×@x
        else
        @h-=1
        end
        @ehp-=@y×@z
        if @ehp<0
        break
        end
        @ka+=@x
        @kb+=@y
        end
        @estimes=@j


        IP属地:湖北来自Android客户端20楼2019-03-01 13:26
        回复