什么是【脚本】?
掌管游戏运行的简单程序语言称为脚本。

与一般把「显示文章」这样的指令称为脚本的情况不同,RPGXP 把

在事件指令之上,更接近程序概念的指令称为脚本。所有事件指令

其实不是程序,只有脚本系统解读后才能运行。

脚本的编辑,是针对游戏系统的高级用户提供的功能,难度很高。如

果只是制作普通游戏,就没有必要了解。最初的脚本系统完全可以

制作不错的游戏,最好只在对默认脚本感到不满意的时候再进行编

辑。

Ruby 是什么脚本语言是一种独特的简单语言,RPGXP 采用的是

Ruby 脚本语言。Ruby 的官方网页是 http://www.ruby-

lang.org/ 。

Ruby 是松本行弘先生开发的免费软件,描述大规模的游戏也能保持

良好性能。是善长文本处理的语言,照原样会加大游戏开发的难度

。因此,对游戏开发用途的 Ruby 语言进行了特殊化,这就是

RGSS(Ruby Game Scripting System),中文意思就是 Ruby 游

戏脚本系统。详细内容请参照 RGSS 参考。

另外,把 Ruby 标记为 ruby 是充许的,但是不能标记为 RUBY、

ルビー或るびー(这两个日语的发音同 Ruby)。

脚本编辑器
在主菜单「工具」菜单中选择「脚本编辑器」。会出现脚本编辑器

对话框。

运行像 RPG 这类大规模的游戏需要非常多的脚本程序,所以把全部

脚本程序分为多个适当的单位来管理是很重要的。RPGXP 把这个单

位称为组。脚本编辑器左侧显示的就是组列表。

脚本编辑器,和数据库有相似的设计便于操作。同数据库一样按

「F4」、「F5」键,就能在各个组中上下选择。这里还增加了一个

「F6」键,可以取光标当前位置的单词复制为该脚本组的名称。

组的操作
在组名称上点右键会出现弹出菜单。选择「插入」,就会在所选组

前面添加一个新的空白组。同样,选择「剪切」和「复制」操作,

就能更改组的顺序。

和数据库不同,组不是以 ID 来管理的。而是按照各组在列表中的

顺序,从上到下依次运行。游戏开始脚本是列表最下面的“Main”

,各种定义完成后实际游戏的运行是从该组开始的。

编辑操作
在右侧文本编辑窗口中点右键,会出现一个弹出菜单如右图。就能

进行「剪切」、「复制」、「查找」、「替换」等基本的编辑操作

文本编辑中还可使用 Ctrl+F 和 Ctrl+G 等快捷键。

如果使用「查找」在编辑的组中没有找到目标,而想对全部脚本组

进行文本搜索时,可以在组的弹出菜单中选择「查找」。快捷键是

Ctrl+Shift+F。

脚本的使用方法脚本除了能在脚本编辑器中直接编辑以外还有以下

三种使用方法。

在事件指令「脚本」中使用。
在事件指令「条件分歧」的条件中使用。
作为「移动路线」内的指令使用。
比如「调用加入了独立脚本的事件指令」的情况就能使用到脚本。

这样或许能设计出各种各样有趣的使用方法。

 

 

 

 

 


【基础篇】
在基础篇,将一边完成单个短程序一边解说 RGSS 的基础知识。

首先,来进行开始学习的准备吧。

建立工程首先建立一个工程,把它作为学习脚本入门用的新工程。

脚本是有关游戏实际运行的数据,照原样改动制作完成的工程,一

个小小的错误也将引起游戏不能正常运行。因此,推荐使用新建的

工程进行学习。

另外,RGPXP 脚本数据是保存在 Data 文件夹内的

Scripts.rxdata 文件中,如果对此文件(或游戏全部数据)已经

备份的话,也可以使用既存的工程。

建立组
建立工程后,在主菜单「工具」菜单中选择「脚本编辑器」。

显示脚本编辑器对话框后,在最上面新建一个组。点击右键于弹出

菜单中选择「插入」,就建立了一个新的空白组。

组的名称是什么无所谓,可以取个容易理解的,我们这里暂命名为

“TEST”。名称的输入在窗口左下方的「名称」里进行。

结束程序
首先,请输入下面的代码。

exit

注意,在 Ruby 中是区分字母大小写的,所以不能输入 EXIT 或

Exit。当然全角文字也不行。请全部以半角的小写字母输入。输入

完毕按「确定」键关闭脚本编辑器,运行(游戏测试)看看吧。

运行游戏测试,窗口应该显示一瞬间后立即关闭。总之,在这里写

的 exit 是结束程序的命令。

在最上面的 TEST 组中写入 exit,因此程序就此结束。而在后面

众多组中编写的脚本都没有执行。以后示例程序都会省略 exit,在

实际测试时请在最后一行加入 exit。如果没有加入 exit 而运行

测试,就会显示出游戏的标题画面。

注释在 Ruby 中,# 符号后面的一整行文字会认定为注释。

# 后的注释代码不会执行,不会影响到程序的运作,只作为编写者

标记的备忘记录来使用。

exit    # 结束程序

这和事件指令的「注释」功能相同,是记录程序处理内容的简单说

明,使用注释会很容易知道这段脚本是做什么的。即使是自己编写

的程序,但时间一长,该段内容是指定做什么处理也会忘记。在脚

本的学习和实际操作时,推荐注意多使用注释功能。

还有,作为程序的说明,在后面的学习中脚本会写有很多的注释。

但实际操作中没有必要完全仿效其注释的内容。# 以后的文字,可

以按实际中最容易理解的说明注释。

语法和库程序语言在结构上大致分为语法和库两种。

所谓语法,就是使用语言记录某些处理时的规则。与中文和英文等

自然语言一样,程序语言也有语法。例如条件分歧的语法、循环的

语法等等。「# 符号后面的一整行文字认定为注释」这也是语法之

一。语言的说法,狭义上指的就是语法。

所谓库,就是字符串的处理和图片的显示等带有应用功能的语言集

。与中文英文等自然语言中的单词和词组的意思相似。学习了英文

的语法在使用英文时,增加词汇量(掌握库的使用方法)则是非常

必要的。

这个「脚本入门」基础篇是以学习语法为重点。最开始学习时或许

会产生「学习语法,到底有什么用」的厌烦感,应用逻辑思维来理

解基本语法就能突破最初的屏障,仔细阅读参考程序记住实际的使

用方法,其实并不是多么困难的事情。

那么现在就开始吧!
【数字的计算】
是关于 Ruby 中数字和计算的基础知识。作为例子将使用计算器那

样简单的计算来解说。

数字Ruby 中能使用的数字,包括整数和浮点数两种。

3           # 整数
52          # 整数
-99         # 整数
1.5         # 浮点数
3.0         # 浮点数

所谓浮点数,就是使用小数点以下计算的数。数值相同的话写作 3

是整数,而写作 3.0 即是浮点数。整数计算速度快,如果不需要小

数点以下的话尽量使用整数。

显示数字即在画面上显示数字。想显示某些数字时,使用 p 命令。

小写字母 p,半角字符,再把想要显示的数值按顺序输入后换行。

今后会出现各种各样的命令和符号,除注释外其它一律使用半角输

入。不小心输入全角字符的话,要注意发现错误。

p 3

这个 p 命令可以在排除程序故障时使用,学习显示数字将会是十分

有用的。

运行这个程序,会看到在弹出的对话框中显示 3。原本 p 不是显示

对话框的命令,但是游戏开发时特殊化的 RGSS 在没有其它输出地

点时就会自动显示对话框。

计算方法在 Ruby 上进行计算吧。

p 1 + 1             # 加法
p 10 - 3            # 减法
p 7 * 5             # 乘法
p 24 / 4            # 除法

这样,写上普通算式就会输出计算的结果。+ 和 - 等符号称为运算

符。

另外还有乘法的 * 和除法的 /。不熟悉的人,一定要记住这些重点

优先顺序
和普通的算式一样,* 和 / 计算要优先于 + 和 - 计算。想改变

这个顺序就要使用括号 ( ),括号中的算式将会优先计算。

p 2 * 2 + 3 * 4     # => 16
p 2 * (2 + 3) * 4   # => 40
p 2 * (2 + 3 * 4)   # => 28

按优先顺序,示例第一行其实是 4+12,第二行是 2*5*4,第三行

是 2*14,所以会是不同的计算结果。

括号还可以多层重叠起来(即使是二层三层的情况也是使用同一个

符号)。

还有,示例程序的注释中使用 => 符号,主要是表示这行的输出结

果。这是为了方便直观的理解而做的说明。

小数点以下的计算
整数除整数的情况下,会省略余数,答案将还是整数。想得到小数

点以下的答案,就要使用到浮点数。除数或被除数至少要有一个是

浮点数(明确标明了小数点以下),计算的答案就会是浮点数。

p 15 / 4            # => 3
p 15.0 / 4          # => 3.75
p 15 / 4.0          # => 3.75

余数的计算
求余数(除法的余数),是使用 % 符号。

p 14 % 4            # => 2
p 13 % 4            # => 1
p 12 % 4            # => 0

运行示例第一行的算式,是求 14 除以 4 的余数,就会输出计算结

果 2。

乘方的计算
没必要强迫记住,乘方(同一个数指定次数的相乘)是使用 ** 符

号。

p 2 ** 4            # => 16

这个示例求 2 的 4 次方,也就是计算 2*2*2*2。
【变量】
所谓变量,就是某些数值附上名称。是相对于常量的数据类型。

变量的命名变量命名的管理。我们可以为变量取比如 x 和 y 或者

更长的像 level 或 gold 这样的名称。名称的长度没有限制。

变量有几个类型,首先我们来学习最基本的局部变量。局部变量的

命名规则有以下几点。其中的第 1 条应该特别注意。

第一个字符必须以小写英文字母或 _(下划线)开头。
第二个字符开始可以使用英文字母、数字或 _(下划线)。
不能使用保留字作变量的名称。
保留字是作为 Ruby 中具有特殊意义的词而被系统所「保留」,所

以变量名称不能使用。以下就是系统的保留字。

alias    def      false    nil      return   unless
and      do       for      not      self     until
begin    else     if       or       super    when
break    elsif    in       redo     then     while
case     end      module   rescue   true     yield
class    ensure   next     retry    undef

除上面列出的保留字以外,其它的词都可以作变量的名称。

赋值和引用在实际中使用变量看看吧。

x = 3
y = 4
p x + y     # => 7

第一行和第二行是进行变量的赋值。其中 = 号是赋值运算符。和数

学上使用等号表示「左边等于右边」的意思不同,这里表示「左边

的变量代入右边的数值」。在上述示例中,第一行 x 变量和第二行

y 变量分别代入数值 3 和 4。

第三行是引用变量 x 和 y。所谓引用就是取得那个变量的数值。变

量的计算和数字的计算方法完全一样。这里的 x + y 可以解释为 3

+ 4,计算结果就为 7。

另外,引用从未进行赋值的局部变量,就会使程序出现错误。

p zzz       # ERROR!!

请记住,变量一定要进行赋值后才能使用。

zzz = 5
p zzz       # => 5

这个示例中,第一行变量 zzz 为其赋值代入 5 后,第二行引用。

自运算变量引用自己的数值,并再次代入计算结果称为自运算。

x = 1
x += 7
x -= 3
x *= 2
p x         # => 10

第二行的 x += 7 相当于 x = x + 7,总之就是向变量 x 里加上

7。同样 -=、*=、/=、%= 等也是如此使用。这些运算符就是自运

算运算符。

RPGXP 的变量进行自运算计算处理时思考方法都相似。这个示例中

第一行是赋值直接代入 1,第二行加上 7,这时 x 的值其实是 8,

第三行减去 3,第四行再乘以 2,最后的计算结果就是 10。

全局变量局部变量是暂时使用的变量,只能在函数和类等定义(在

后面讲述)内部使用,之外变量就无效。与之相对,在程序任何地

方都能引用的就是全局变量。全局变量可以在程序中任何地方使用

,名称相同,就必然是同一个变量。

如下面的示例,以 $ 号开头的变量就作为全局变量使用。赋值方法

和局部变量完全相同。

$global

虽然在任何地方都能引用,但使用全局变量不一定比局部变量好。

全局变量十分强大,胡乱使用恐怕会使程序变得很难懂。请在使用

时注意。
【字符串】
一般来说,由文字连接起来的数据就称为字符串。

print双引号 "" 或单引号 '' 中间的部分,就作为字符串数据使

用。

p "RPG Maker XP"                    # => "RPG Maker XP"
p 'RPG Maker XP'                    # => "RPG Maker XP"

p 命令会导致双引号和字符串一起输出,所以使用 print 命令代替

print "RPG Maker XP"                # => RPG Maker XP

这次双引号就没有了。p 是按照人们容易理解的形式来显示的命令

,所以它会加上双引号来强调字符串。print 和 p 相似,但它只显

示字符串本身。

为变量赋值和数字一样,字符串也能代入变量为该变量赋值。

a = "RPG Maker XP"
print a                         # => RPG Maker XP

字符串也能作加法,字符串加上字符串,就会得到一个连接起来的

字符串为答案。

a = "我的 "
b = "RPG Maker XP"
print a + b                     # => 我的 RPG Maker XP

还可以作乘法,字符串乘以一个整数,就会得到该整数次重复的字

符串为答案。

a = "RPG Maker XP"
print a * 2                     # => RPG Maker XPRPG

Maker XP

控制码字符串中的 符号,是作为一段连续文字中换行等操作使用

的特殊文字。比如 n 是表示换行。

控制码有 t(Tab)和 s(空格)等多种代码,另外 n 表示换

行,重叠起来的 \ 表示 文字本身,这两个一定要记住。

a = "RPG Maker XP"
b = "\10,290"
print a + "n" + b              # => RPG Maker XP
                                #    10,290

单引号 '' 中间的字符串,除 \( 符号本身)和 '(单引号)

外不能使用任何的控制码。这在打算原样显示文字本身的情况下使

用会十分方便。

print 'RPG Maker XPn'              # => RPG Maker XPn

符号本身即为计算机内部的控制码。以后实际字符串操作中应注

意正确使用。

内嵌表达式在字符串里面,可以用 #{变量名} 的形式把变量的内容

嵌入在字符串当中。

game = "RPG"
print "#{game} Maker XP"         # => RPG Maker XP

上述示例里,第一行是为 game 变量赋值代入字符串“RPG”。第二

行里面,其中 #{game} 是表示直接嵌入变量 game 的值字符串

“RPG”,和后面的“ Maker XP”组合在一起,从而输出一个新的

字符串。 RPGXP 的事件指令「显示文章」里,在文章中使用 V

[n] 和 N[n] 控制码可以把变量的值和角色的名称作为信息嵌入

文字中,这个功能好像和那个十分相似。

这个功能,让我们举例来说明在预置脚本中应如何使用。

print("文件 #{filename} 没找到。")

print 的显示内容应附加上括号 (),如果其优先顺序不易混淆的话

可以省略(本章 print 的使用示例介绍中全部省略了括号)。预置

脚本中基本上都统一使用有括号,所以在这儿也加上一个。

这个是当然,

print("文件 " + filename + " 没找到。")

像这样写也可以,使用内嵌表达式的方法会使读取程序变得很容易

另外内嵌表达式和控制码一样,在单引号 '' 中间的字符串里使用

也会无效。
【条件分歧】
满足特定的条件与否,之后的动作会根据其不同而改变就叫作条件

分歧。

比较运算符在具体地学习处理条件分歧的方法之前,要先记住条件

构成中使用的运算符。

下面 6 个运算符称为比较运算符。使用这些运算符,和给予的条件

(数字和字符串)相比较,然后返回结果。

== 相等
!= 不相等
< 小于
> 大于
<= 小于或相等
>= 大于或相等

这里一定要注意的是,判断相等的运算符不是 = 而是 ==。像已学

习过的那样,所谓 = 符号表示的不是比较而是代入。请注意不要弄

混淆了。

真伪值比较运算的运算结果就称为真伪值。有真(正确)、伪(错

误)两种情况。

比较后是正确的话为 true 值,是错误的话就为 false 值。请试

试看吧。

p ("早安" == "早安")                # => true
p ("早安" == "晚安")                # => false
p (3 + 1 == 3 + 5)                  # => false
p (3 + 1 == 2 + 2)                  # => true

逻辑运算符下面 6 个运算符称为逻辑运算符。

and
&& 「~,与,~」的意思
or
|| 「~,或,~」的意思
not
! 「非~」的意思

英文单词运算符和符号运算符,无论用哪个都是一样的。在预置脚

本中运用的主要是英文单词。使用这些逻辑运算符就能指定更加复

杂的条件。

p (100 > 77 and 1 + 1 == 2)         # => true
p (100 > 77 && 1 + 1 == 2)          # => true

上述示例中,第一行和第二行表示的都是一个内容「100 大于 77

同时 1 + 1 等于 2」。不用说 100 是比 77 大的整数,1 + 1 答

案也为 2,两个运算都成立。所以输出结果就为 true(真,正确)

那么,看下一个算式吧。

p (1 + 1 == 3 or 2 + 2 == 3)        # => false
p (1 + 1 == 3 || 2 + 2 == 3)        # => false

上述示例中,第一行和第二行表示的也都是一个内容「1 + 1 等于

3 或 2 + 2 等于 3」。很显然,1 + 1 不等于 3,2 + 2 也不等

于 3,这样两个运算都不成立。比较运算符 or(||)是只要有一个

运算成立就为 ture(真,正确),而这里两个运算全都不成立,所

以输出结果就为 false(伪,错误)。

另外,not(!)和上面的例子稍微有些不同, not(!)表示的内容

为后面的条件不成立。可以理解为颠倒 true 或 false 的运算符

p (not true)                        # => false
p (! true)                          # => false

上述示例中的内容是「非 true」的意思,所以输出结果为 false

if ~ elsif ~ else ~ endif ~ end 语句是条件分歧的句法。

这个和英文的 if(如果~就)意思相同,表示「如果 if 后面的条

件成立的话,就运行下面的处理」的意思。下面示例中的 3~5行就

是条件分歧。

a = 20              # 为变量 a 赋值代入 20。

if a >= 10          # 如果 a 为 10 以上的话,
  print "big"       #   显示 big。
end                 # 分歧结束。

在条件不满足时也要进行处理的情况下就使用 else,条件不满足但

指定另一个条件的情况下就使用 elsif。

a = 7               # 为变量 a 赋值代入 7。

if a >= 10          # 如果 a 为 10 以上的话,
  print "big"       #   显示 big。
elsif a >= 5        # 除此之外,如果 a 为 5 以上的话,
  print "medium"    #   显示 medium。
else                # 其他,
  print "small"     #   显示 small。
end                 # 分歧结束。

unless ~ end与 if 相反,在条件不满足时才进行某些处理的情

况下使用 unless 语句。

a = 7               # 为变量 a 赋值代入 7。

unless a >= 10      # 如果 a 不为 10 以上的话,
  print "small"     #   显示 small。
end                 # 分歧结束。

case ~ end在条件为特定的变量值进行分歧的情况下使用 case

语句会更方便。

a = 0               # 为变量 a 赋值代入 0。

case a              # 分歧开始。
when 0              #  当 a 为 0 时,
  print "零"        #   显示 零。
when 1              #  当 a 为 1 时,
  print "壹"        #   显示 壹。
when 2              #  当 a 为 2 时,
  print "贰"        #   显示 贰。
end                 # 分歧结束。

把第一行 a = 后面的 0 改为 1 和 2,然后再来看看分歧的结果

吧。当 a 代入 1 时会显示“壹”,代入 2 时会显示“贰”。

条件运算符使用符号 ? 和 : 也是运算符形式的条件分歧语句。

a = 3

p (a >= 10 ? "big" : "small")   # => "small"

这个示例的意思是,变量 a 的值在 10 以上的话就显示 "big",

9 以下的话就显示 "small"。条件运算符的语法是「条件 ? 真时

的值 : 伪时的值」。上述的条件是 a >= 10,真时的值为 "big"

,伪时的值为 "small",会根据条件是否满足来决定使用 ? 或 :

的值。

当然使用 if 语句也能完成同样的事情。

a = 3

if a >= 10
  p "big"
else
  p "small"
end

使用 if 语句的语法会像上面写的那样,但是使用条件运算符语句

会更加简洁。该语句在当前的脚本中也使用得很多,所以最好事先

记住。
【循环】
重复进行特定的处理就要使用循环。

while ~ end在满足特定条件期间进行循环的情况下使用 while

语句。

a = 0               # 为变量 a 赋值代入 0。
i = 1               # 为变量 i 赋值代入 1。

while i <= 5        # 当变量 i 为 5 以下时循环开始(重复以

下处理),
  a += i            #   变量 a 加上 i 的值。
  i += 1            #   变量 i 的值增加 1。
end                 # 循环结束。

p a                 # 显示计算结果。

这个示例是求从 1 到 5 这五个数字总和的程序。在这里,变量 i

是用来产生从 1 到 5 这五个数字用的。当然变量名也可以不用 i

,一般情况下循环处理用的变量会使用 i、j、k 为名称。

那么,这个程序最重要的是 i += 1 这行。如果没有这行 i 的值

永远为 1,而 i <= 5 的条件也会一直满足,就会成为无限循环。

因此,这里每次都向 i 加上 1 使得 i 的值依次变为 2、3、4、5

、6 从而使得循环结束。

变量 a 和 i 的数值变化,如下表所示。

循环 a 的值 i 的值
初始状态 0 1
1 次后 1 2
2 次后 3 3
3 次后 6 4
4 次后 10 5
5 次后 15 6

循环 5 次后,在 a 的数值里面实际上进行了 1+2+3+4+5 的计算

,i 的值也超过了 5 而执行 end 使得循环结束。

然后以 p 命令显示最终 a 的值,就会显示出答案 15。

变化范围数值的范围,例如类似于「从 1 到 5」这样的概念就称为

变化范围。

1..5

上述示例表示「从 1 到 5」的意思。使用 .. 运算符,就能作成一

个变化范围。

而且,使用 ... 运算符也可以。

1...5

和 .. 不同的是「不含最后一个数」。所以,这种情况实际上表示

的是「从 1 到 4」的意思。

for ~ in ~ end想在变化范围表示的范围内循环的情况下使用

for 语句。

a = 0               # 为变量 a 赋值代入 0。

for i in 1..5       # 变量 i 的值按从 1 到 5 的范围变化,
  a += i            #   变量 a 加上 i 的值。
end                 # 循环结束。

p a                 # 显示计算结果。

这个示例和使用 while 语句的示例完全相同,也是求从 1 到 5

这五个数字总和的程序,但比使用 while 的情况更加简洁。在

while 中变量 i 加上 1 表示的是从 1 到 5 的范围,然而在 for

中是用变量 i 按「从 1 到 5 的范围」的顺序代入来表示。表面看

起来不同,但实际上进行的是意思完全相同的处理。

Ruby 中有许多语法,循环中也存在各种各样不同的方法。在不同语

法使用中,请按照这个示例提示的「让编写更简便」的方式来思考

。实际上,如果理解了条件分歧和循环的话,就能进行大部分逻辑

运算了。

loop do ~ end未指定循环次数和条件的情况下,也就是想进行无

限循环时使用 loop 语句。这个与 while 和 for 语句的性质稍微

有所不同,一般情况下没有必要注意。

i = 0               # 为变量 i 赋值代入 0。

loop do             # 循环开始。
  i += 1            #   变量 i 的值增加 1。
  p i               #   显示变量 i 的值。
end                 # 循环结束。

这个示例是「一边把 i 的值加上 1,一边显示 i 的值」的程序,

没有结束条件。一旦运行的话就会连续显示 1、2、3……。如果这

种对话框不断显示的话,就算要结束程序也是不可能的,只能按着

F12 键不放强行关闭对话框,并点击右上方的结束按钮关闭程序。

break想中途中断循环就要使用 break 命令。

i = 0               # 为变量 i 赋值代入 0。

loop do             # 循环开始。
  i += 1            #   变量 i 的值增加 1。
  if i == 5         #   如果变量 i 的值为 5 的话,
    break           #     中断循环。
  end               #   条件分歧结束。
  p i               #   显示变量 i 的值。
end                 # 循环结束。

上述示例在程序中加上了「i 等于 5 的就中断循环」的条件。运行

该程序,显示 1、2、3、4 就结束了。

break 即使在 while 和 for 等其它方法作成的循环中也能使用。

next在不中断循环的情况下,跳过本次循环而进入下一次循环时使

用 next 命令。

for i in 1..5       # 变量 i 的值按从 1 到 5 的范围变化,
  if i == 3         #   如果变量 i 的值为 3 的话,
    next            #     进入下一次循环。
  end               #   条件分歧结束。
  p i               #   显示变量 i 的值。
end                 # 循环结束。

运行这个示例,会显示 1、2、4、5。
【函数】
数字的计算和字符串的显示等,能够进行某种处理的被命名的功能

称为函数。

函数的使用我们一直在使用的 exit、p、print 命令其实也是函数

的一种。

学习自定义函数的方法前,让我们像函数那样来使用函数吧。先介

绍生成随机数的 rand 函数。

p rand(100)

这个示例是每次运行都会显示出(0~99)中的任意一个随机数字的

程序。rand 函数是从 0 到指定整数这个不大的范围中随机选取一

个数字并返回的函数。这个「指定的值」就称为参数。参数通常在

函数名称后面的括号 () 内指定。上面示例里 100 就是 rand 函

数的参数。参数如不直接指定数值的话,还可以像下面的示例那样

使用任意的运算。

x = 10
y = 20
p rand(x + y)       # 等同于 p rand(30)

与参数相反,函数将原始数值进行处理后返回的结果数值称为返回

值。也就是说,rand 函数的返回值是在特定范围内的随机数值。函

数的返回值可以像普通数字和变量那样被使用。

p rand(6) + 1

上面示例的意思是 rand 函数的返回值加上 1,并显示其计算结果

。rand 函数在给予的参数为 6 的情况下返回值为 0 到 5 范围内

的任意一个数,所以再加上 1,就像丢骰子一样随机显示一个 1 到

6 范围内的数值。

像 exit 和 rand 那样的函数已预先被系统定义,所以称为系统函

数。

函数的定义函数的定义是从 def 开始到 end 结束。具体的语法如

下所示。

def 函数的名称
  函数的内容
end

函数名称的命名方法,基本上和局部变量有相同的限制。也能在开

头使用大写字母,但不推荐函数命名时使用。另外,作为函数命名

的例外,在名称的最后还可以添加 ? 或 ! 符号。

比如,先前的 rand(6) + 1 处理可以定义为 dice 名称的函数,

我们下面就来进行。这样定义了该函数,从此以后只要写 dice 就

会得到一个 1 到 6 的随机数字。

def dice
  return rand(6) + 1
end

p dice              # 等同于 p rand(6) + 1

这里的 return 就是结束函数处理的命令。函数可以考虑为 RPGXP

的公共事件,而 return 就是相当于「中断事件处理」的意思。

return 右侧所写的运算,就是该函数的返回值。在中途中断函数的

情况以外还可以省略 return,这大概会更方便吧。预置脚本中也是

这样,大多数情况下都省略了 return 没写。

参数含有参数的函数,如下面示例那样定义。

def abs(x)
  if x < 0          # 如果 x 小于 0 的话,
    return -x       #   结束函数,返回值 -x。
  else              # 除此之外,
    return x        #   结束函数,返回值 x。
  end               # 分歧结束。
end

p abs(-3)           # => 3

这个是返回指定参数数值绝对值的函数。这里「指定参数数值」暂

时定义为 x。这个 x 称为临时参数。在函数内部使用有条件分歧,

x 小于 0 时(为负数)返回值 -x,除此之外(为 0 以上的整数

)返回值 x。最后一行是指定参数为 -3 的实际情况下使用函数,

其结果用 p 函数输出。与 x 为临时参数相比,这儿的 -3 称为实

参数。

顺便讲一下,所谓绝对值是数学上提出的概念,是表示到原点(上

述情况可以认为是 0)距离的数值。-3 也好 +3 也好,原点为 0

的情况下,每个到 0 的距离值都为 3。

含有多个参数的函数也能定义。多个参数要用逗号“,”分开来指定

def sum(x, y)
  return x + y      # 结束函数,返回值 x + y。
end

p sum(2, 3)         # => 5

这个是返回指定参数两个数值之和的函数。当然实际中写成 2 + 3

更快更容易,一般不会定义这样简单的函数。这只是说明语法的示

例。

实际中参数省略括号 () 也能使用。

默认参数定义函数时就已指定且使用时可以省略的参数称为默认参

数。默认参数是在临时参数后面加上符号 = 来指定的。事先设定好

了默认参数,在使用函数时未指定括号 () 内实参数数值的情况下

,临时参数就会自动代入默认参数数值。

def dice(n = 6)
  return rand(n) + 1
end

p dice              # 等同于 p dice(6)

上述示例中未指定参数,使用函数时会返回一个 1~6 的随机数字

,然而指定参数的话,就能更改随机数字的最大值。比如,使用

dice(8) 就会返回一个 1~8 的随机数字。

多参数函数同样能够指定各个默认参数,这样使用时就可以省略。

函数的重定义下面的示例中,hello 名称的函数被重复定义了 2 回

def hello
  return "您好"
end

def hello
  return "晚安"
end

p hello         # => "晚安"

在 Ruby 中,函数名称重复的话不会出现错误。这种情况下系统会

认定后面定义的函数有效,而先前的定义就无效了。

arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()