2023-04-09 05:35:35 +00:00
|
|
|
|
.. SPDX-License-Identifier: GFDL-1.3-or-later
|
|
|
|
|
|
2023-04-01 15:07:15 +00:00
|
|
|
|
函数定义和调用,以及数组
|
|
|
|
|
========================
|
|
|
|
|
|
|
|
|
|
fkparse多少也算一门编程语言了(或许),因此对函数的支持自然也必不可少。本章向大家介绍在使用fkparse时,如何定义和调用自己的函数。
|
|
|
|
|
|
|
|
|
|
定义函数
|
|
|
|
|
--------
|
|
|
|
|
|
|
|
|
|
所谓函数,其实就是一段给定了一些前提条件(也就是函数参数)的代码块而已。通过定义函数,我们少写许多重复的代码。在三国杀这个体系中,“函数”大约就相当于“定义新概念”吧。三国杀也是通过定义一堆新概念来减少描述字数的,虽然搞得有点儿难懂=
|
|
|
|
|
=
|
|
|
|
|
|
|
|
|
|
fkparse中,定义一个函数的格式如下:
|
|
|
|
|
|
|
|
|
|
::
|
|
|
|
|
|
|
|
|
|
定义函数 <标识符> <定义参数表> [返回 <类型标识符>] <代码块>
|
|
|
|
|
|
|
|
|
|
定义函数的位置也有讲究,所有的函数必须定义在第一个技能之前,也就是说所有的函数都定义完成后才能开始自定义技能。
|
|
|
|
|
|
|
|
|
|
这里我们又遇到了两个没有见过的新东西:\ ``<参数表>``\ 和\ ``<类型标识符>``\ 。下面一起来看看吧。
|
|
|
|
|
|
|
|
|
|
类型标识符
|
|
|
|
|
~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
类型标识符是一个词法单元,它可以取如下的一些格式:\ *数字类型、布尔类型、字符串类型、玩家类型、卡牌类型、数字数组、字符串数组、玩家数组、卡牌数组*\ 。这些东西都不需要引号,它们用来指定一些变量的类型。
|
|
|
|
|
|
|
|
|
|
定义参数表
|
|
|
|
|
~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
所谓定义参数表,就是函数定义的时候用到的参数表,这个取名主要是为了和“调用参数表”区分开来。(至于调用参数表又是啥,后面就知道了)
|
|
|
|
|
|
|
|
|
|
定义\ ``<定义参数表>``\ 的格式如下:
|
|
|
|
|
|
|
|
|
|
::
|
|
|
|
|
|
|
|
|
|
'(' { <定义参数> ',' } [定义参数] ')'
|
|
|
|
|
|
|
|
|
|
而\ ``<定义参数>``\ 的格式为:
|
|
|
|
|
|
|
|
|
|
::
|
|
|
|
|
|
|
|
|
|
<标识符> ':' <类型标识符> [ '=' <表达式> ]
|
|
|
|
|
|
|
|
|
|
<标识符>是参数的名称,<类型标识符>表示这个参数需要的类型。后面的<表达式>表示这个参数的默认值。
|
|
|
|
|
|
|
|
|
|
定义好定义参数表后,函数体(也就是函数定义的格式的那个<代码块>)就可以随意将参数当做已经定义了的变量使用了,类似其他编程语言那样。
|
|
|
|
|
|
|
|
|
|
如果函数有返回类型,那么别忘记在某处使用返回语句。
|
|
|
|
|
|
|
|
|
|
调用函数
|
|
|
|
|
--------
|
|
|
|
|
|
|
|
|
|
定义了函数后,自然还有函数的调用了。调用函数的格式为:
|
|
|
|
|
|
|
|
|
|
::
|
|
|
|
|
|
|
|
|
|
<标识符> <参数表>
|
|
|
|
|
|
|
|
|
|
参数表
|
|
|
|
|
~~~~~~
|
|
|
|
|
|
|
|
|
|
相对于定义参数表,调用函数时候的参数表格式为:
|
|
|
|
|
|
|
|
|
|
::
|
|
|
|
|
|
|
|
|
|
'(' { <参数> ',' } [参数] ')'
|
|
|
|
|
|
|
|
|
|
参数的格式为:
|
|
|
|
|
|
|
|
|
|
::
|
|
|
|
|
|
|
|
|
|
<标识符> ':' <表达式>
|
|
|
|
|
|
|
|
|
|
<标识符>是对应于函数定义那里的那个参数的名字,<表达式>则是参数的取值。
|
|
|
|
|
|
|
|
|
|
需要注意的是,在调用函数时的参数表中,各个参数没有顺序要求(毕竟已经指明参数的名字了),但是对于没有默认值的参数,必须手动给它指定值。
|
|
|
|
|
|
|
|
|
|
由于函数调用既能用来执行一些动作,又能产生值,所以它既可以作为表达式,又可以作为语句。但是当单独的函数调用作为语句的时候,需要在后面跟上一个分号,表示这是一个单独的语句。
|
|
|
|
|
|
|
|
|
|
对数组的操作
|
|
|
|
|
------------
|
|
|
|
|
|
|
|
|
|
fkparse提供了数组类型,那自然必不可少的就是数组的操作了。
|
|
|
|
|
|
|
|
|
|
遍历
|
|
|
|
|
~~~~
|
|
|
|
|
|
|
|
|
|
所谓遍历数组,就是对数组中每个元素逐个进行某些操作。比如想要做到“对所有其他角色各造成一点伤害”,但是造成伤害的语句只允许对一个人造成伤害,这时候我们就需要遍历“其他角色”这个数组,然后一一造成伤害了。
|
|
|
|
|
|
|
|
|
|
遍历数组的格式为:
|
|
|
|
|
|
|
|
|
|
::
|
|
|
|
|
|
|
|
|
|
对 <表达式> 中每个 <标识符> 重复此流程: <代码块> 以上
|
|
|
|
|
|
|
|
|
|
其中,<表达式>是需要遍历的数组,必须为数组类型;<标识符>表示数组中正在被遍历的那个元素,可以在接下来的代码块中作为变量使用;<代码块>是循环体,也就是前面说的“某种操作”。
|
|
|
|
|
|
|
|
|
|
插入元素
|
|
|
|
|
~~~~~~~~
|
|
|
|
|
|
|
|
|
|
fkparse支持对数组的头部和尾部插入新元素。
|
|
|
|
|
|
|
|
|
|
从头部插入的语法为:
|
|
|
|
|
|
|
|
|
|
::
|
|
|
|
|
|
|
|
|
|
向 <表达式> 插入 <表达式>
|
|
|
|
|
|
|
|
|
|
从尾部插入的语法为:
|
|
|
|
|
|
|
|
|
|
::
|
|
|
|
|
|
|
|
|
|
向 <表达式> 追加 <表达式>
|
|
|
|
|
|
|
|
|
|
上面两个语法中,第一个<表达式>是被操作的数组,第二个表达式是要插入的元素。元素必须符合数组的类型才行。
|
|
|
|
|
|
|
|
|
|
删除元素
|
|
|
|
|
~~~~~~~~
|
|
|
|
|
|
|
|
|
|
fkparse支持删除数组中的某个元素。格式为:
|
|
|
|
|
|
|
|
|
|
::
|
|
|
|
|
|
|
|
|
|
从 <表达式> 删除 <表达式>
|
|
|
|
|
|
|
|
|
|
上面两个语法中,第一个<表达式>是被操作的数组,第二个表达式是要删除的元素。
|
|
|
|
|
|
|
|
|
|
遍历、插入、删除这三个操作可以作为语句使用。
|
|
|
|
|
|
|
|
|
|
获得数组的信息
|
|
|
|
|
~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
fkparse支持获得数组的长度,以及根据数组下标取得元素。这两个操作可以作为表达式使用。
|
|
|
|
|
|
|
|
|
|
要获得长度的话,直接’数组’的"长度"这样就行了。根据下标取得元素的格式为:
|
|
|
|
|
|
|
|
|
|
::
|
|
|
|
|
|
|
|
|
|
<表达式> 第 <表达式> 个元素
|
|
|
|
|
|
|
|
|
|
数组的下标从1开始。
|