0
JX3PVE
首页
宏库
工具
职业
副本
捏脸
广场
江湖
更多
登录
|
注册
剑网3PVE官方站(JX3PVE.COM)
›
首页
›
发布文章
发布文章
标 题:
B
I
U
HTML文件名:
.html
分页标题:
频道栏目
选择分类
焦点头条
文章来源
来源地址
发布时间
自动获取
帖子 tid
日志 id
获取楼主所有帖子
获取
跳转URL
原作者
关闭
上传图片
相册图片
网络图片
请输入图片地址
宽(可选)
高(可选)
提交
创建
取消
点击图片添加到编辑器内容中
选择相册:
选择相册
默认相册
点击图片添加到编辑器内容中
关闭
上传附件
文件名
文件大小
点击文件名将附件添加到文章中
<font size="5"><strong>第三章·第7节:表达式优化</strong></font><font size="2"><br /> </font><br /> <font size="2">主稿:楚玄枫<br /> <br /> </font><hr class="l" /><font size="2"><br /> </font><div align="left"><font size="2">在进入本节之前,我们的重点内容依然是注意事项:</font></div><div align="left"><font size="2">注意:请在阅读本节前,仔细阅读并确保自己已经明确不同的判断参数返回值的类型属于true、false和num中的何种,并确保自己知道true、false、num之间的区别。请在阅读本节前,尽可能掌握变量命令/var的基本用法。</font></div><font size="2"><br /> <strong>1.变量</strong></font><div align="left"><font size="2">前文已经对变量进行了最基本的介绍,那么请读者在此处回忆一下变量的几种情况,以及各种基本运算符号。</font></div><div align="left"><font size="2">注意:本节中所有的变量,意指由宏定义的,以v_开头的具有相应数值的量。相应的,所有数字、true或false,以及通过参数引入的数值或真值(如:buff:调息,bufftime:风·灭气>5),均视为常量。</font></div><div align="left"><font size="2">我们为什么要引入一个变量?</font></div><div align="left"><font size="2">最主要也是最广泛使用的作用,就是引入变量开关,使使用者可以通过调整变量的值来控制宏的语句执行。</font></div><div align="left"><font size="2">第二个比较广泛的应用,是通过将复杂的条件定义为一个新的变量,来方便对这个条件进行引用。通常此类变量拥有一个十分有意义的名字,如某知名唐门宏中的v_队里有一堆唐门,v_救命啊他要放追命了,等等。</font></div><div align="left"><font size="2">变量的另一个广泛应用,就是用来存储一些中间结果,以应用到后面的宏或变量表达式中。如不少宏,通过开关定义了加速阈值等级,再通过计算获得对应的技能的时间,以用于后文的计算。</font></div><font size="2"><br /> <strong>2.变量表达式</strong></font><div align="left"><font size="2">变量表达式是区别于常量表达式的一个概念。表达式的概念请右转百度百科。</font></div><div align="left"><font size="2">我们在写宏的时候,每个语句中,使用中括号[]所括起来的整个部分,就是一个表达式。当用于/skill、/if、/dia等等语句的时候,以表达式的真值来决定其运行;用于/var或/print时,则是对相应表达式的值进行赋值或打印。</font></div><div align="left"><font size="2">常量表达式指表达式的所有量均为常量的表达式;使用了变量的表达式则称为变量表达式。</font></div><font size="2"><br /> <strong>3.表达式优化</strong></font><div align="left"><font size="2">本节的重点,是如何针对宏中的大量表达式进行优化。</font></div><div align="left"><font size="2">本节所有例子将均从本站知名宏中节选,部分内容可能有删改。</font></div><u><font size="2">3-1 常量表达式优化</font></u><div align="left"><font size="2">常量表达式通常不需要进行大量优化,但在超级宏的架构上,可以将部分庞大的表达式进行合并。</font></div><div align="left"><font size="2">例如:</font></div><blockquote><div align="left"><div class="quote"><blockquote><font size="2">/skill [tpre:掷锤>0.5,nobuff:镇山河] 打断,后撤<br /> /skill [tar:何莘涯,dis<10,nobuff:镇山河,tpre:力拔千钧>0.7] 打断,后撤</font></blockquote></div><br /> <font size="2"><br /> </font></div></blockquote><div align="left"><font size="2">可以优化为</font></div><blockquote><div align="left"><div class="quote"><blockquote><font size="2">/skill [nobuff:镇山河,(tpre:掷锤>0.5;tar:何莘涯,dis<10,tpre:力拔千钧>0.7] 打断,后撤</font></blockquote></div><br /> <font size="2"><br /> </font></div></blockquote><div align="left"><font size="2">又如:</font></div><blockquote><div align="left"><div class="quote"><blockquote><font size="2">/skill [tnopre:掷锤|吞云吐纳|骨牢|皇之怒,buff:莺鸣,nobuff:夜雨,sktest:四季剑法|三柴剑法,tbufftime:梅隐香>3] 风来吴山<br /> /skill [tnopre:掷锤|吞云吐纳|骨牢|皇之怒,buff:莺鸣,nobuff:夜雨,sktest:四季剑法|三柴剑法,!tar:boss] 风来吴山</font></blockquote></div><br /> <font size="2"><br /> </font></div></blockquote><div align="left"><font size="2">可以优化为:</font></div><blockquote><div align="left"><div class="quote"><blockquote><font size="2">/skill [tnopre:掷锤|吞云吐纳|骨牢|皇之怒,buff:莺鸣,nobuff:夜雨,sktest:四季剑法|三柴剑法,(tbufftime:梅隐香>3;!tar:boss)] 风来吴山</font></blockquote></div><br /> <font size="2"><br /> </font></div></blockquote><div align="left"><font size="2">此类例子较多,但有时合并会导致表达式变得冗长不利于阅读。</font></div><font size="2"><br /> </font><div align="left"><u><font size="2">3-2 /if下的/skill(/dia、/return等等)优化</font></u><div align="left"><font size="2">实际上,由于除/var和/print以外的语句表达式的真值即决定其是否执行,因此在实际应用中,如果不是需要降低表达式长度以利阅读,此类语句可以通过优化不使用/if即完成判断。/var也可以使用相应的表达式算法来优化使之不需要/if。唯有/print,由于种种原因,必须使用/if来限制其执行与否以防止刷屏。</font></div><div align="left"><font size="2">在进行带有/else的/if的优化时,需要预先计算好,优化后的语句真值是否与优化前相同。</font></div><div align="left"><font size="2">针对/if下的/skill优化举例:</font></div><blockquote><div align="left"><div class="quote"><blockquote><font size="2">/if [mount:问水诀,cdtime:平湖断月>1.5]<br /> /skill [tarisem,mount:问水诀,rage>82,fight,sktest:四季剑法|三柴剑法,cd:黄龙吐翠] 啸日<br /> /else<br /> /skill [tarisem,mount:问水诀,rage>82,fight,sktest:四季剑法|三柴剑法] 啸日<br /> /end<br /> /if [(rage<17,v_剑气=1);(rage<20,v_剑气=2)]<br /> /skill [tarisem,mount:山居剑意,cdtime:雪断桥>1.5&雪断桥<60&莺鸣柳>1.5&莺鸣柳<110] 啸日<br /> /end</font></blockquote></div><br /> <font size="2"><br /> </font></div></blockquote><div align="left"><font size="2">可以优化为:</font></div><blockquote><font size="2"><br /> </font><div class="quote"><blockquote><div align="left"><font size="2">/skill [tarisem,mount:问水诀,rage>82,fight,sktest:四季剑法|三柴剑法,(cd:黄龙吐翠,cdtime:平湖断月>1.5;!cdtime:平湖断月>1.5)] 啸日</font></div><div align="left"><font size="2">/skill [tarisem,mount:山居剑意,cdtime:雪断桥>1.5&雪断桥<60&莺鸣柳>1.5&莺鸣柳<110,(rage<17,v_剑气=1;rage<20,v_剑气=2)] 啸日</font></div></blockquote></div><br /> <font size="2"><br /> </font></blockquote><div align="left"><font size="2">当然,本例中的两个语句可以通过合并为一个语句,但那样将会导致语句过长。</font></div><div align="left"><font size="2">一般情况下,通过/if的优化获得的语句还可以进一步优化。</font></div><font size="2"><br /> <u>3-3 真值表达式的优化</u></font><div align="left"><font size="2">在深入本节之前,请再次确认自己已经明白三种基本逻辑运算(或、且、非;超级宏中分别为’;'、’,'、’!')的关系。</font></div><div align="left"><font size="2">观察上例中的(cd:黄龙吐翠,cdtime:平湖断月>1.5;!cdtime:平湖断月>1.5)。如果我们定义:</font></div><blockquote><font size="2"><br /> </font><div class="quote"><blockquote><div align="left"><font size="2">/var [cd:黄龙吐翠] v_a</font></div><div align="left"><font size="2">/var [cdtime:平湖断月>1.5] v_b</font></div></blockquote></div><br /> <font size="2"><br /> </font></blockquote><div align="left"><font size="2">那么这个表达式可以写作(v_a,v_b;!v_b)。可以很清楚的明确,这个表达式只有当v_a与!v_b同为假时才为假,其他时候均为真。因此这个表达式可以写作(v_a;!v_b),也即(cd:黄龙吐翠;cdtime:平湖断月<=1.5)</font></div><div align="left"><font size="2">绝大多数情况下,只涉及到两个量的布尔表达式,都可以进行一定程度上的简化。</font></div><font size="2"><br /> <u>3-4 数值表达式的优化</u></font><div align="left"><font size="2">超级宏中,数值型变量均可参与简单的加减乘除计算,如上例中的(rage<17,v_剑气=1;rage<20,v_剑气=2),可以简单的简化为rage<14+v_剑气*3(前提是v_剑气只能取为1或2)。</font></div><div align="left"><font size="2">又例如,计算花间在梦歌状态下的加速,可以写作:</font></div><blockquote><font size="2"><br /> </font><div class="quote"><blockquote><div align="left"><font size="2">/var [6.26] v_speed –无BUFF的面板加速</font></div><div align="left"><font size="2">/var [v_speed+(buff:梦歌;0)*0.9765625] v_nowspeed</font></div></blockquote></div><br /> <font size="2"><br /> </font></blockquote><u><font size="2">3-5 混合表达式算法</font></u><div align="left"><font size="2">在超级宏中,涉及到数值的计算,以及数值与真值的混合计算,参考下面的规则:</font></div><font size="2"><br /> </font><div class="quote"><blockquote><div align="left"> true and 3=3<br /> 2 and 3=3<br /> 3 and 2=2<br /> false and 3=false<br /> true or 3=true<br /> 2 or 3=2<br /> 3 or 2=3<br /> false or 3=3 <br /> </div></blockquote></div><br /> <font size="2"><br /> </font><div align="left"><font size="2">根据这一点,我们可以简化很多混合表达式。最常用的简化形式是(a,b;c)型表达式,意为当a为真是,值为b,否则为c。</font></div><font size="2"><br /> <br /> <u>3-6 /if下的/var优化</u></font><div align="left"><font size="2">最简单的情况是下面这种情况,在很多宏中都有这样的情况:</font></div><blockquote><div align="left"><div class="quote"><blockquote><font size="2">/if [v_快雪>0.15;v_快雪=0;noota:快雪时晴]<br /> /var [true] v_快雪可断<br /> /else<br /> /var [false] v_快雪可断<br /> /end</font></blockquote></div><br /> <font size="2"><br /> </font></div></blockquote><div align="left"><font size="2">此种情况可以很直接的写成:</font></div><blockquote><div align="left"><div class="quote"><blockquote><font size="2">/var [v_快雪>0.15;v_快雪=0;noota:快雪时晴] v_快雪可断</font></blockquote></div><br /> <font size="2"><br /> </font></div></blockquote><div align="left"><font size="2">另一种可以优化的情况是如下的情况:</font></div><blockquote><div align="left"><div class="quote"><blockquote><font size="2">/if [v_动态打断,ping<0.5]<br /> /var [ping] v_动态变量<br /> /else<br /> /var [0.02] v_动态变量<br /> /end</font></blockquote></div><br /> <font size="2"><br /> </font></div></blockquote><div align="left"><font size="2">该情况可以利用上文所述的(a,b;c)型表达式简单的优化成:</font></div><blockquote><div align="left"><div class="quote"><blockquote><font size="2">/var [v_动态打断,ping<0.5,ping;0.02] v_动态变量</font></blockquote></div><br /> <font size="2"><br /> </font></div></blockquote><div align="left"><font size="2">有的时候,/if语句是对/var有着执行约束,如下例:</font></div><blockquote><div align="left"><div class="quote"><blockquote><font size="2">/if [cdtime:芙蓉并蒂>=5]<br /> /var [false] v_ind<br /> /end</font></blockquote></div><br /> <font size="2"><br /> </font></div></blockquote><div align="left"><font size="2">该语句限制了只有在cdtime:芙蓉并蒂>=5时才对v_ind修改数值,因此此例可以同样写为:</font></div><blockquote><font size="2"><br /> </font><div class="quote"><blockquote><div align="left"><font size="2">/if [cdtime:芙蓉并蒂>=5]</font></div><div align="left"><font size="2">/var [false] v_ind</font></div><div align="left"><font size="2">/else</font></div><div align="left"><font size="2">/var [v_ind] v_ind</font></div><div align="left"><font size="2">/end</font></div></blockquote></div><br /> <font size="2"><br /> </font></blockquote><div align="left"><font size="2">从而可以优化为</font></div><blockquote><div align="left"><div class="quote"><blockquote><font size="2">/var [cdtime:芙蓉并蒂>=5,false;v_ind] v_ind</font></blockquote></div><br /> <font size="2"><br /> </font></div></blockquote><div align="left"><font size="2">再根据真值优化可以进一步简化为</font></div><blockquote><div align="left"><div class="quote"><blockquote><font size="2">/var [cdtime:芙蓉并蒂<5,v_ind] v_ind</font></blockquote></div><br /> <font size="2"><br /> </font></div></blockquote><div align="left"><font size="2">下面是一个针对变量的综合优化例子,是某宏中的一个限定执行模块,只在当前循环中v_st9=1时执行一次:</font></div><div align="left"><font size="2">【声明:此模块及其优化结果引自变速箱-花间宏,直接转载或引用请注明引用来源】</font></div><blockquote><div align="left"><div class="quote"><blockquote><font size="2">/if [v_st9=1]<br /> /var [false] v_mention<br /> /var [false] v_tomention<br /> /else<br /> /var [!v_mention] v_tomention<br /> /end<br /> /if [v_tomention]<br /> /print [v_st9=2,string:xxx]<br /> /var [true] v_mention<br /> /var [false] v_tomention<br /> /end</font></blockquote></div><br /> <font size="2"><br /> </font></div></blockquote><div align="left"><font size="2">前面的一个/if块可以简单的优化为</font></div><blockquote><font size="2"><br /> </font><div class="quote"><blockquote><div align="left"><font size="2">/var [v_st9=2,v_mention] v_mention</font></div><div align="left"><font size="2">/var [v_st9=2,!v_mention] v_tomention</font></div></blockquote></div><br /> <font size="2"><br /> </font></blockquote><div align="left"><font size="2">后面一个/if因为限制了只有当v_tomention为真的时候才执行,而当v_tomention为假时,需要保持原来的值,因此可以写为</font></div><blockquote><font size="2"><br /> </font><div class="quote"><blockquote><div align="left"><font size="2">/var [v_tomention;v_mention] v_mention</font></div><div align="left"><font size="2">/var [false] v_tomention</font></div></blockquote></div><br /> <font size="2"><br /> </font></blockquote><div align="left"><font size="2">根据上下文语句,由于当v_mention置为true时,v_tomention会在下一个循环置为false,因此最后一个语句可以被省略。</font></div><div align="left"><font size="2">全文优化结果为:</font></div><blockquote><div align="left"><div class="quote"><blockquote><font size="2">/var [v_st9=2,v_mention] v_mention<br /> /var [v_st9=2,!v_mention] v_tomention<br /> /if [v_tomention]<br /> /print [v_st9=2,string:xxx]<br /> /end<br /> /var [v_tomention;v_mention] v_mention</font></blockquote></div><br /> <font size="2"><br /> </font></div></blockquote></div><font size="2"><br /> </font><br /> <br /> <br />
摘要
第三章·第7节:表达式优化 主稿:楚玄枫 在进入本节之前,我们的重点内容依然是注意事项:注意:请在阅读本节前,仔细阅读并确保自己已经明确不同的判断参数返回值的类型属于true、false和num中的何种,并确保自 ...
聚合标签
原创
热点
组图
爆料
头条
幻灯
滚动
推荐
添加相关文章
选择
提交
显示分页导航
您当前使用的浏览器版本过低,网站部分功能可能失效,请更换合适的浏览器。
了解更多
返回顶部