本帖最后由 二宫和也 于 2012-8-17 12:49 编辑
返回教程索引
2.4 那些曾经的加暴和高暴 - 论连击的兄弟暴击和lua的坑爹表
前面说了一堆关于连击的代码,这次轮到暴击了。其实暴击和连击差不多,所以我长话短说。搜索关键词:计算暴击
- local BJ1 = math.modf(JY.Person[pid]["攻击力"] / 18)
- local BJ2 = math.modf((JY.Person[pid]["内力最大值"] + JY.Person[pid]["内力"]) / 1000)
- local BJ3 = math.modf(JY.Person[pid]["体力"] / 10)
- local BJ = 0
- BJ = BJ1 + BJ2 + BJ3
复制代码 一开始我们就看到了一堆定义和变量,你可以看到暴击得基础几率跟人物的攻击力,内力,体力有关。基础几率是存放在BJ这个变量里面的。连击的代码里也有类似的定义。这一段不难理解,我们继续往下看。
- --加暴击的武功(我简化了一下,原来有个local up,那是多余的不用管它)
- local bjup = {18, 22, 39, 40, 56, 65, 71, 78, 74, 61}
- for i = 1, 10 do
- if JY.Person[pid]["武功" .. i] > 0 then
- for ii = 1, #bjup do --这里我改了一下,貌似原来的代码少数了一个?
- if JY.Person[pid]["武功" .. i] == bjup[ii] then
- BJ = BJ + 5
- end
- end
- end
- end
复制代码 新东西来了,还记得天翔之前的版本里面有些武功会加连加暴么?这里就是加暴的武功发挥作用的地方。如果你回头看看连击的代码也能看到类似的东西,那加连的武功。我们照例分解动作:
1)bjup - 这是一个临时定义的表。据说lua中最强大的也是最复杂的就是这个表,而我们面前的这个是一个最简单的例子。注意它两边是大括号{}而不是我们平常用的小括号(),里面共有10个值,用逗号分开。这些数字你拿UPedit查一下就会发现这些就是加暴击的武功的编号。使用的时候我们要用中括号[]来得到表里面的数据。以上面的表为例,
bjup[1]的值为18,bjup[8]的值为78,bjup[11]的值为nil,也就是没有值,因为里面就只有10个数字没有第11个。最后讲的是#的使用,把#加在表的名字前面就会返回表里面有多少个值,比如#bjup就等于10(因为里面有10个值)。看吧虽然这是最简单的表其实理解起来真的有点难度....
2)重点的两个for循环,我其实一直想避免讲解这个东西但该来的还是要来...所谓的循环就是把某一个代码重复做n次,每一次可能稍微做些改变。
外面的那个循环是定义一个i(这是任意的名字,你也可以把它改成f, u, c, k, u, k,结果是一样的。这个i会从1一直增加到10,每增加一次就会运行一次循环里面的代码(也就是运行10次),里面的代码的意思就是检查人物的10个武功JY.Person[pid]["武功" .. i],看看每个武功是不是属于能加暴击率的武功。怎样检验呢?那就是看里面的那个循环了。
里面的循环是定义一个ii(也是很随便的名字),数值是从1到#bjup(也是10),作用就是把bjup这个表里面的数字一个一个扫描过去,如果突然发现表里面的数字对上了人物现在拥有的武功,就说明人物练了加暴击的武功,BJ这个变量就加5。这个代码会一直执行下去,直到表里面所有的数字都被扫描完毕。
总结一下,这两个循环,每检查人物的一个武功就会扫描bjup表里面的10个数字一次,最多检查10个武功,也就是里面的代码最多会被运行10*10=100次。每检查出人物拥有一个加暴击的武功,BJ这个变量就会加5。
这就是家暴,不,加暴的实现....看懂了么?没看懂请再看一次.-_-...还是不懂记得要提问,代码里很多效果都是靠表实现的,比如加连的武功也是这样。
继续看下去
- local jl = math.random(200)
- if jl > 60 and jl < 60 + BJ then
- WAR.BJ = 1
- end
复制代码 这里就是具体的暴击判断了,实现方法是先产生一个1-200之间的随机数值,然后如果这个数字大于60而且小于60+BJ,则判定成功。具体的几率应该是BJ除以200。
判定成功的时候会把WAR.BJ设置为1,WAR.BJ也是个变量,等于1的时候说明人物此次攻击会出现暴击。
如果判定没有成功怎么办?不用担心,下面还有一堆二次判定等着你。
- --高暴击武功
- local gbj = {11, 13, 28, 33, 58, 59, 72, 75}
- for i = 1, 8 do
- if JY.Person[pid]["武功" .. wugongnum] == gbj[i] and JLSD(20, 75, pid) then
- WAR.BJ = 1
- end
- end
复制代码 又见一个表。这次代表着高暴武功,一共有8个。用一个for循环扫描过去,如果人物此次攻击使用的武功属于表里面的某一个武功的话,有一次75-20=50的判定几率,成功的话WAR.BJ设置为1。这就是高暴武功的实现方法,高连武功也是差不多的。
再举一个二次判定暴击的例子,玄铁剑
- if JY.Person[pid]["武器"] == 36 then
- if wugong == 45 then
- WAR.BJ = 1
- elseif (wugong==114 or wugong==110 or (wugong>=27 and wugong<=49)) and JLSD(35, 75, pid) then
- WAR.BJ = 1
- end
- end
复制代码 如果人物装备的武器等于36(玄铁剑)的话,出现两个选项:
1)如果wugong等于45,直接暴击。这里要解释一下wugong这个变量,搜索一下关键词wugong = JY.Person[pid]["武功" .. wugongnum],你就会发现,wugong被设置成JY.Person[pid]["武功" .. wugongnum]了,也就是说后者基本上可以直接拿wugong这个短小精悍变量来代替。
2)如果wugong不等于45,则进行下一个判断(elseif)。这次如果wugong是任意剑法的编号的话,有40%的几率出现暴击
作业:如果我想用表和循环实现以下效果,怎样做:人物装备上任意剑类装备,配上松风剑法,有50%几率暴击。
在此表扬cbws童鞋和fujs童鞋的勤奋好学准时交作业,各奉上小红花一朵银两100以示鼓励
答案:
- local xxx = {36, 37, 38, 39, 40, 41, 42, 55, 236}
- for i = 1, 9 do --这里的9可以改成#xxx
- if JY.Person[pid]["武器"] == xxx[i] and wugong == 134 and JLSD(0, 50, pid) then
- WAR.BJ = 1
- end
- end
复制代码
返回教程索引
|