扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 2064|回复: 2
收起左侧

[脚本教学] 从零开始学脚本 - 6.条件判断以及随机数

[复制链接]

一米阳光商人

贡献:2803

金钱:9554

威望:1495

589

主题

680

帖子

2万

积分

优秀版主荣誉管理RO骑士

RO精灵 RO精灵

RO侏儒 RO侏儒

RO巨人 RO巨人

RO诸神 RO诸神

RO创世 RO创世

发表于 2016-6-8 21:20:11 | 显示全部楼层 |阅读模式
今天是条件判断
参考资料 script_commands.txt 中
*if
*else
*else if

这几条命令是条件判定语句,可能有些帮助文档里搜索不到,但是这几条命令在所有编程语言里都有出现。

在 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

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%

贡献:66

金钱:28

威望:48

0

主题

38

帖子

332

积分

Rank: 3Rank: 3

发表于 2016-11-1 16:19:36 | 显示全部楼层
好系统,一一学习,希望以后还有类似系统学习

贡献:583

金钱:232

威望:332

0

主题

89

帖子

2245

积分

Rank: 5Rank: 5

发表于 2017-1-13 13:30:51 | 显示全部楼层
好文章 就是要頂
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为兴趣而生…… 立即登录 立即注册
TOP

从零开始学脚本 - 6.条件判断以及随机数

今天是条件判断 参考资料 script_commands.txt 中 这几条命 ...

温馨提示:手机扫描二维码继续浏览

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