一米阳光商人
RO精灵 RO侏儒 RO巨人 RO诸神 RO创世
|
今天是条件判断
参考资料 script_commands.txt 中
这几条命令是条件判定语句,可能有些帮助文档里搜索不到,但是这几条命令在所有编程语言里都有出现。
在 rAthena 端里是控制脚本走向的一个基本功能。
首先,if 是一个条件判定语句。
具体格式:
if(条件判定式){执行代码}
在大多数编程语言里,条件判定式可能是任何内容,变量,数值,字符.....
或者是一系列计算,而条件判定式的结果~就是判断if语句是否执行的根据
举一个很简单的例子:
if(天上有太阳){出门晒太阳}
这里~当条件满足天上有太阳的时候~就出门去晒太阳
但是有人会问了,那没太阳的时候咋办? 所以这个语句就可以进行扩展
if(天上有太阳)
{
出门晒太阳
}
在家睡觉
这样扩展了以后,就变成如果天上有太阳就出门晒太阳,如果天上没太阳,就在家睡觉
但是这种写法是不严谨的,有可能有很多情况导致天上没有太阳
所以~我们可以将天上没有太阳的时候分成不同的情况来进行细分
if(天上有太阳)
{
出门晒太阳
}
if(晚上<没太阳>)
{
去夜店high
}
if(下雨<没太阳>)
{
带着肥皂出门洗澡
}
if(阴天<没太阳>)
{
在家睡觉
}
这样~就详细的区分了每一种天上没太阳的情况,这是针对所有编程语言通用的思维逻辑
一般来说,条件判定式最后的结果只有两种,要么是真,要么是假
换个说法就是,条件判定式是一个两选的题~要么是第一种结果~要么是第二种结果
在编程语言里,条件判定式的结果是一种叫做布尔值的东西,布尔值只能是0或者1
当为0时,表示假~为1时表示真,条件判定式结果为真时,执行{}内代码的内容
如果为假时,跳过{}的内容,直接执行后面的内容
条件判定式可以不光是布尔值
可能由于变量类型定义的关系,条件判定式里的内容只要为数值型(int/整形变量),就可以进行条件判定
而条件判定的结果相应就放宽了
最终的结果就是,在ro服务端里
条件判定式的结果为0时,结果为假,
条件判定式结果不为0时,结果为真
例子如下
set @i,1;
if(@i){mes "答案为"+@i+"";close;}
在例子中,@i的值被定义为1,所以条件判定式的结果就是1
由于不为0,所以就会执行{}里的内容
反过来,如果@i为0时,{}里的内容就不会执行
只要@i不为0(比如为1,2,3,4,5甚至为100000)的时候,条件判定结果都是真~所以都会执行{}里的内容
神奇的分割线---------------------------------
else
在if命令中,当条件判定式结果不为0时,将会执行{}里的内容】
如果为0时,会跳过{}执行后面的内容,但是有一些时候,可能会出现这样的情况
set @i,1;
if(@i == 1)
{
mes "结果是1";
}
mes "结果不为1";
在这个例子中,会同时显示出结果是1和结果不为1,这是因为脚本的运行顺序是由上往下的
在执行外if的{}里的内容以后,会继续执行{}之后的内容,这样~就和最开始想要的效果不同了
那么为了解决这种情况,就需要将格式修改为这样
set @i,1;
if(@i == 1)
{
mes "结果为1";
}
else
{
mes "结果不为1";
}
else代表了当条件判定式为假的时候~执行的内容
神奇的分割线-----------------------------
else if
else代表了条件表达式结果为假的内容
但是如果我们想要判定多个条件,根据每个条件都有不同的执行代码的时候呢
像是在说if内容的时候举得哪个晒太阳的例子
每一个条件都是由一个if语句来判定结果的
这是因为~几种情况不会产生冲突
天上有太阳和天上没太阳~甚至每一种没有太阳的情况都不会产生冲突~所以只有一种情况是真实情况
但是一旦几种条件之间有冲突的情况~可能就会被判定为好几个情况都满足从而执行了多余的代码的情况
if()
{}
else if()
{}
像是这种结构就能解决这个情况
if()
if()
{}
else
{}
这种结构可以将结果区分为两种情况
if()
{}
else if()
{}
if()
{}
else if()
{}
else if()
{}
.......
else if()
{}
else
{}
而这种结构可以设计为任意多个条件,从上往下依次判定
当其中一条满足条件的 时候~其他部分的{}都不会被执行~满足条件的{}里的内容执行完毕以后~会跳转到
最后一个{}之后继续运行
例子
set @i,5;
if(@i == 1)
{mes "结果是1";}
else if(@i == 2)
{mes "结果是2";}}
else if(@i == 3)
{mes "结果是3";}}
else if(@i == 4)
{mes "结果是4";}}
else if(@i == 5)
{mes "结果是5";}
close;
在这个例子中
我最开始将@i设定为5了,那么只有当运行到判定@i是否为5的判定时结果才为真,那么会输出<结果是5>的这行话
又因为当执行玩{}里的内容以后,会跳转到最后一个{}的下一行开始运行
所以无论@i为几,最后一行执行的都是close~所以避免了close的重复
神奇的分割线
神奇的分割线--------------------------
最后要额外说一条命令
用于今天完成作业时需要的
rand愿意是随机的意思,顾名思义,在doc里能看到
实际的格式是:rand(最小值,最大值);
他会在最小值到最大值里随机挑选一个数字
这里有个小技巧,rand里的最小值和最大值实际上并不一定非要谁大谁小~
前面的是最大值后面的是最小值也是可以的,他会在这个取值范围以内随机取一个数作为结果
例子
set @i,rand(1,10);
mes "@i的值为"+@i+"";
close;
今天的作业
创建一个npc/使用一个固有npc
为npc设计3-5套不同的对话
玩家同npc对话时,随机出现这些套对话的其中一套对话
扩展作业
创建一个npc/使用一个固有npc
为npc设计3套对话
玩家同npc对话时,随机出现这三套对话的其中一套
第一套对话的出现几率为50%
第二套对话的出现几率为30%
第三套对话的出现几率为20%
|
|