铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 3738|回复: 2

[不负责任的教程]新手DIY源码应用教程2.3 - 初步了解变量的使用 by苍天泰坦

[复制链接]
发表于 2012-8-17 06:49 | 显示全部楼层 |阅读模式

马上注册,结交更多侠友!

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x
本帖最后由 二宫和也 于 2012-8-17 12:14 编辑

返回教程索引

2.3
大家来找茬 - 初步了解变量这玩意以及论小二的不靠谱 (客座教授:苍天泰坦

说到变量,这是一个很难解释的东西,为什么说难以解释,是因为这玩意就是起到一个替代的作用且种类各异。

既然二宫的标题是不负责任的教程,我就也把不负责任发扬光大吧,特别指出,以下分类纯属本人口胡,主要是便于新手记忆,切勿拿着这些口胡分类去向专业人士提问,否则后果自负- -

第一类:简化书写型
还是看实例吧,先回头看二宫童鞋教程里的第一个实例,乔峰极意:
  1. if pid == 50 or (pid == 55 and math.random(10) < 5) or ((pid == 69 or (pid == 0 and GetS(4, 5, 5,
  2. 5) == 1 and JY.Person[pid]["武功等级" .. wugongnum] == 999)) and JLSD(30, 70, pid)) then
复制代码

第一个判定就是pid==50,在二宫童鞋的讲解下,我们已经知道这个pid代表的是人物编号,问题是,这个“pid”变量是从哪里蹦出来的?我们把鼠标滚轮使劲往上滚动,终于发现,乔峰的这个极意代码,原来是War_Fight_Sub函数的一部分,而函数的开头部分则是这样的
  1. function War_Fight_Sub(id, wugongnum, x, y)
  2.    local pid = WAR.Person[id]["人物编号"]
复制代码
当我们看到那个变量定义local pid = WAR.Person[id]["人物编号"]时,我们也终于知道pid这个变量,为啥二宫童鞋会那么肯定的告诉我们,这就是人物编号!

那么,这个变量的存在有什么意义吗?
经过一番测试,终于找到答案了,在判定人物编号时,写成WAR.Person[id]["人物编号"]==50同样可行,但是每次写到判断人物编号的代码时,你都得写上类似的,会不会觉得这代码实在有那么一点长?相对于pid==50来说,哪个更简单?很明显,在这个函数里,pid这个变量的出现,就是为了能在书写代码时,不用为了判断一个人物编号而再额外的写N长一大段。

第二类:数值型
还是拿二宫教程里的杨过的黯然来开刀吧- -
  1. if pid == 58 and JY.Person[pid]["武功" .. wugongnum] == 25 and
  2. JY.Person[pid]["武功等级" .. wugongnum] == 999 and GetS(86,11,11,5) == 2
  3. then
  4.         local jl = 10 --默认发动机率为10%
  5.         if JY.Person[58]["受伤程度"] > 50 then --内伤大于50时, 每增加10点极意增加10%
  6.                 jl = jl + (JY.Person[58]["受伤程度"]-50);                                 
  7.         end   
  8.         if JY.Person[58]["生命"] < JY.Person[58]["生命最大值"]/2 then
  9.                 jl = jl + math.ceil((JY.Person[58]["生命最大值"]/2 - JY.Person[58]["生命"])/10);                            end
  10.         if jl > Rnd(100) then
  11.                 fightnum = 3;
  12.         end        
  13. end
复制代码
很明显,前面if的判定略过,二宫已经有讲过,我们主要是看变量,这个定义里,jl这个变量代表的是一个具体数值10,但是二宫在这里解释这个变量的时候犯了点错误,他的原话如下:
"1)localjl = 10 :前面我说到了“定义”这个概念,这里就是一个定义的例子,我们在这里定义了一个名字为"jl"的变量(其实就是几率的拼音缩写),并把它的初始数值设成了10。 local 的意思是,这个jl只能在这一段代码里面使用,就像你中国的户口到美帝那边就不好使了,一个道理。"

上面二宫的讲解错了一半,为啥说是一半?因为这个变量确实只能在这段代码里使用,但是原因却不是因为这个.实际上local代表的是定义临时变量,但是并不代表这个变量jl只能在这段代码里使用,只能在这段代码里使用的原因是这个变量在声明时,是在判定条件之下

如果颠倒一下顺序,改成这样
  1. local jl = 10 --默认发动机率为10%
  2. if
  3. pid == 58 and JY.Person[pid]["武功" .. wugongnum] == 25 and
  4. JY.Person[pid]["武功等级" .. wugongnum] == 999 and GetS(86,11,11,5) == 2
  5. then
复制代码
那么,这段代码之后也能照样使用这个变量,究其原因就在于顺序上,仔细审视一下[原来的]代码,我们就能发现,代码第一段的判定是:如果人物编号是58,并且使用的武功代号为25,并且武功等级为极,并且神雕剧情为邪线(我去,这么长的判定- -),如果这些条件全部成立,才会执行定义临时变量jl。因此,在这段代码执行完毕后,变量jl就不能再被引用了。(好吧,不管你能不能听懂,我贫乏的词汇已经无法描述的更贴切了)

(小二补充:在把代码颠倒过来之后,jl这个变量因为已经在判定之前就被定义好了,所以无论判定成功与否这个变量都还可以继续使用不会消失,不过没啥意义就是了...)

接着往下看
  1. if JY.Person[pid]["生命"] < JY.Person[pid]["生命最大值"]/2 then               
  2.         jl = jl + math.ceil((JY.Person[pid]["生命最大值"]/2 - JY.Person[pid]["生命"])/10)
  3. end
复制代码
这一段参照上面的讲解,你应该已经能理解是什么意思了,唯一看不懂的恐怕就是math.ceil,这个同样代表取整数,和math.modf类似,唯一的区别就是就是它代表的自动进位取整,还是举例吧,假如使用math.ceil,按上面的公式计算,最后的结果等于11.25,那么最后的结果进位取整为 12,而不是正常的四舍五入取整得到11。但是如果结果正好是整数,比如说12,那么就不再进位,结果仍然是12,就是这样

  1. if jl > Rnd(100) then --判断极意触发 三连
  2.         fightnum = 3;
  3. end
复制代码
看到这里我已经无力吐槽了,二宫童鞋在这里又犯了迷糊,Rnd(100)代表的随机数0-99,而非0-100……

这一段也很好理解,如果变量jl大于随机数值(0-99),就触发三连击,否则……啥都没有o>_<o~
注意这里的jl变量,刚才已经讲解了半天,最初jl数值为10,然后经过内伤判定,再经过生命判定,如果58号人物此时受伤程度超过50,或是生命已经低于生命最大值的一半,那么jl代表的数值已经不是最初的10了

假设58号人物生命最大值为800,并且当前生命还剩300,受伤程度为48,根据上面的判定,我们可以得出以下结论:
1)最初几率为10
2)内伤没有超过50,所以没有几率加成,几率仍然为10
3)当前生命已经低于生命最大值的一半,即低于400,几率增加数值为生命最大值除以2(800/2=400),减去当前生命(300),再除以10,最后结果,(400-300)/10=10,
4)那么最初的几率10+10=20
最后一个判定是jl大于随机数0-99才会三连击,所以58号人物有20%几率打出3连击

第三类:真假型(小二注:这段真的很蛋疼...)

之前二宫给大家留了个题目(小二注:取自教程2.4),据说答对还有奖,于是,有位童鞋是这么回答的:

  1. if JY.Person[pid]["武器"]==236 or (JY.Person[pid]["武器"]>=36 and JY.Person[pid]["武器"]<=42) then
  2.         if wugong==134 and JLSD(0,50,pid) then
  3.                 WAR.BJ=1
  4.         end
  5. end
复制代码

其实按说这样写是最标准简练的写法,可惜,蛋疼的二宫是要求用表和循环来写,所以这位童鞋只能杯具了。

今天,我们就将歪门邪道进行到底,看看如果使用变量,这道问题是怎么解答的

  1. local wq=false --定义临时变量wq为假
  2. if JY.Person[pid]["武器"]==236 then --如果角色装备的武器编号是236,变量wq为真
  3.         wq=true
  4. end

  5. if JY.Person[pid]["武器"]>=36 and JY.Person[pid]["武器"]<=42 then
  6.         wq=true
  7. end

  8. --判定变量wq为真,并且使用武功编号为134,发动几率为50%时
  9. if wq==true and wugong==134 and JLSD(0,50,pid) then
  10.         WAR.BJ=1 --执行暴击
  11. end
复制代码
以上,就是我所说的“真假类变量”(小二注:经另一位教授ivansz解惑,这玩意学名叫布尔型/Boolean),当然,这称呼是我口胡的,不必深究,下面,让我们分解动作- -!
1)首先,我们定义了一个变量wq(武器的拼音简写),并且定义为假
2)接着就是定义变量的延续,用了两个判定,我们只看第一段判定,至于第二段,现在暂时只当它根本不存在,便于我们分析。
3)当角色装备的武器编号为236时(抱歉,我这是用手机写的教程,无法使用工具,所以不知道236号武器到底是啥,暂时就这么称呼吧),变量wq就等于真了
4)之后的判定是,如果变量为真,并且所使用的武功编号为134,并且执行函数JLSD(判定发动几率为50%),这些条件全部成立后,执行暴击

想一下,为什么可以这么写?
因为,变量一开始,我们设置的是这个变量为假,后面我们在设置变量延续时写的是,只有人物在装备上236号武器时,这个变量才变为真,逆向思考一下,这道理很简单,同样代表了“如果装备的不是236号武器时,变量仍然为假”,所以后面我们在写暴击的判定时,判定的wq==true,就代表如果判定通过,那么这个人必然是装备了236号武器

其实这个类型的变量很少用到,而且数据型变量一般都可以替代这种真假型,比如,上面的示例中,我们可以把wq=false改为wq=0,再把wq=true改成wq=1,然后暴击判定里的wq也同样改为1,照样可以用,因为真假变量毕竟只有两种可能,不是真就是假,而随便找两个数字就可以代替,问题是,如果大量使用数据型变量,有时候不免看得头晕眼花,所以,如果发现可以使用这种真假型变量时,还是尽量的用吧

(小二补充:客座教学完毕,鼓掌!另外请大家计算的时候一定要注意括号-_-)

返回教程索引
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-8-17 09:45 | 显示全部楼层
占位占位
这几天没时间了,周末把这篇补齐
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2022-4-10 02:02 来自手机 | 显示全部楼层
苍天泰坦 发表于 2012-8-17 09:45
占位占位
这几天没时间了,周末把这篇补齐

能分享下傲剑狂刀0.79吗,我觉得挺好玩的,网上只能找到0.51,群加不进去,要不就是找不到
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-5-5 22:36

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表