背景: #EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  
阅读新闻

脚本系列讲座第四讲-使用IF

[日期:2006-08-18] 来源:乘风破浪网  作者:clane [字体: ]

脚本系列讲座第四讲--使用IF 
注意:当你在学习使用IF判定语句的时候,如果对代数有一个比较好的掌握,那将会很容易的理解IF的表达式的概念。所以如果你对代数一点也不了解,那我建议最好先去看看一些介绍代数的书或是网站。(注:个人认为,IF这种东西还是比较容易理解的,即使没有什么数学基础。这并不会牵涉到什么高深的代数概念,有小学文化也就差不多了。如果有编程基础,你可以不用看这一章了。呵呵) 

IF判定在sphere中非常的有用,它可以帮助你判定某项条件是否成立,并且根据这个条件是否成立执行不同的命令语句。一般来说,判断是否成立的表达式都是一个简单或者复杂的代数表达式。一个简单的IF判定语句就像这样: 

IF (1 == 2) 
SAY Hello world! 
ENDIF 

这个判定语句检查数字1和2是否相等。在上面的那个判定中,由于数字都是常量,不会改变,那显然这个判定表达式是永远不成立的,在IF和ENDIF中的那条语句也就永远不会被执行到。而如果我们将这个判定中的那个数字2改成1,这个判定很显然就成立了,那么在IF和ENDIF中的语句也就肯定会被执行到。 
在这里,用括号将表达式1==2括起来并不是必要的,但这将会使你脚本的可读性更好。到以后,如果使用一个复杂的表达式,你会发现使用一个括号将会是绝对有必要的,所以还是在最初就养成使用括号的好习惯,我本人使用的括号就远远超过正常的需要。看起来,好像这根本没有必要,但实际上,它会让你避免很多莫名其妙的问题,并且能使你自己在以后更容易的读懂代码。此外,最好在一个IF和ENDID之间的内容的每一行的开头与IF这一行的开头之间保持一个tab的缩进,这也会大大增加你代码的可读性。 

在表达式中"=="被称作是一个操作符,你使用操作符来判定条件是否成立。在Sphere中可以使用下面这些操作符: 

== 等于 A==B A等于B 
!= 不等于 A!=B A不等于B 
> 大于 A>B A大于B 
< 小于 A<B A小于B 
>= 大于等于 A>=B A大于等于B 
<= 小于等于 A<=B A小于等于B 

IF (1 >= 2) 
SAY Hello world! 
ENDIF 

显然1绝对没有可能大于等于2的,所以这段脚本其实并没有做什么实质性的事。如果将表达式翻转一下变成1<=2,这又很显然是百分之一百的成立。事实上,在脚本并没有人会去用这种毫无意义的两个常量的表达式,一般来说,都是将一个变量属性与一个数字或是另外一个变量属性相比较: 

IF (<SRC.HITPOINTS> > 15) 
SAY Hello world! 
ENDIF 

这这段代码里,脚本检查源物体的HITPOINTS是否大于15,如果是大于的,就执行SAY hello world!这个语句,然后继续执行EDIF后面的代码。如果你想使脚本在执行IF和ENDIF中的语句后中止,你可以使用RETURN语句。IF和RETURN的灵巧结合将会是非常游泳的。举个例子,还是用我们前几讲用过的那个大砍刀。目标是使他需要一定的Swordsmanship才能装备上去,为实现这个目标脚本可以这么写: 

[ITEMDEF i_claymore] 
ID=013b7 
NAME=claymore 
TYPE=t_weapon_sword 
WEIGHT=14 
SKILL=swordsmanship 
DAM=15,43 
REQSTR=50 
TWOHANDS=Y 

ON=@CREATE 
HITPOINTS=115,150 
We'll make it require 60 swordsmanship to equip, by adding these lines: 

ON=@EQUIP 
IF (<SRC.SWORDSMANSHIP> < 60.0) 
SRC.SYSMESSAGE You are not skilled enough to equip this. 
RETURN 1 
ENDIF 

这个简单的判定检查玩家的swordsmanship技能是否小于60.0,如果是,则告诉玩家,技能不够,并且使用REUTRN 1阻止玩家将物品装备上去。(注:还记得上一讲中RETRUN 0和RETURN 1的区别吗?)IF使用是很灵活的,我们也可以这样来实现我们的目标: 

ON=@EQUIP 
IF (<SRC.SWORDSMANSHIP> > 59.9) 
RETURN 0 
ENDIF 
SRC.SYSMESSAGE You are not skilled enough to equip this. 
RETURN 1 

这里的判定检查是否大于59.9(注:这里也可以用<SRC.SWORDSMANSHIP>>=60.0,或许这样能更清楚一点)。如果是,则继续装备的动作,如果不是,就告诉玩家不能装备,并终止这个动作。另外你还可以这样来实现你的目的: 

ON=@EQUIP 
IF (<SRC.SWORDSMANSHIP> > 59.9) 
RETURN 0 
ELSE 
SRC.SYSMESSAGE You are not skilled enough to equip this. 
RETURN 1 
ENDIF 

和上面有很大不同的是,这里使用了一个ELSE。在ELSE与ENDIF之间的语句将会在表达式不能成立的时候被执行。在某些情况下面它很有用,不过它有很大的限制,你可以使用另外一个更强有力的工具ELSEIF. 

ON=@EQUIP 
IF (<SRC.SWORDSMANSHIP> > 59.9) 
RETURN 0 
ELSEIF (<SRC.SWORDSMANSHIP> < 60.0) 
SRC.SYSMESSAGE You are not skilled enough to equip this. 
RETURN 1 
ENDIF 

除了必须在IF判定中使用外,ELSEIF和IF非常类似,在ELSEIF和ENDIF中的语句也仅仅当ELSEIF中的表达式成立的时候才会被执行到。所以在上面这个例子中,ELSEIF下面的两条语句仅仅当SRC.SWORDSMANSHIP小于60的时候才会被执行到。(注:在这个例子中似乎没有体现出ELSEIF的好处,还是上一个使用ELSE的简单嘛!但如果你将60.0改为20就会发现它的优点了:ELSEIF可以对20-60之间这段技能不处理,而ELSE则无能为力了) 
在上面的几个例子中,显然第一个是最简洁和最好的,因为它使用了最少的行数(记住:在你脚本中的每一行都会占用一点你cpu和内存的资源。)。所以可以知道虽然IF..ELSEIF..ENDIF很灵活且强有力,但也不能滥用。简单是一个很重要的原则,遵循这个原则,让我们看看我们最终的大砍刀: 

[ITEMDEF i_claymore] 
ID=013b7 
NAME=claymore 
TYPE=t_weapon_sword 
WEIGHT=14 
SKILL=swordsmanship 
DAM=15,43 
REQSTR=50 
TWOHANDS=Y 

ON=@CREATE 
HITPOINTS=115,150 

ON=@EQUIP 
IF (<SRC.SWORDSMANSHIP> < 60.0) 
SRC.SYSMESSAGE You are not skilled enough to equip this. 
RETURN 1 
ENDIF 

如果我们还使装备大砍刀需要60.0的tactics,应该怎么做呢?我们可以使用ELSEIF来实现它,但这里有一个更简单的方法可以做到。 

IF (<SRC.SWORDSMANSHIP> < 60.0) || (<SRC.TACTICS> < 60.0) 
SRC.SYSMESSAGE You are not skilled enough to equip this. 
RETURN 1 
ENDIF 

||表示或者的意思,用于表达式。在用||相连的表达式之间,只要有一项成立,表达式就表示成立。另外我们还可以这么写: 

IF (<SRC.SWORDSMANSHIP> > 59.9) && (<SRC.TACTICS> > 59.9) 
RETURN 0 
ENDIF 
SRC.SYSMESSAGE You are not skilled enough to equip this. 
RETURN 1 
在这里我们使用了&&而非||,&&表示并且的意思.在表达式中,只有用&&相连的所有表达式都成立,这个表达式才会成立。 


好了,到了这里,我想你们也应该开始理解IF的用法了(如果我没有犯错的话)。不过进步最好的方法就是不断的实践。从别人的源代码中和自己的编写过程中能得到远多于一次讲座的东西。 


讲座到了这里,初级的东西已经快讲完了。多看一些别人写的脚本,差不多也就算是入了门,以后就看各自的修行了。这几天比较忙,我的sphere55i转到linux下来,要去写程序设法解决中文问题(也不知道能不能解决。 ).讲座就告一段落吧,以后等我对脚本更熟悉,并且有时间了,再来继续。如果有什么疑问请写信给我clane@21cn.com 


translated by clane 

阅读:
录入:admin

推荐 】 【 打印
上一篇:脚本系列讲座第三讲-简单的触发脚本
下一篇:发个自己写的sphere0.51帐号注册程序,顺便找高手帮助.
相关新闻      
本文评论       全部评论
发表评论


点评: 字数
姓名:

  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款