FreeKill/docs/fkp/usr/exp_stat.rst

234 lines
6.2 KiB
ReStructuredText
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

.. SPDX-License-Identifier: GFDL-1.3-or-later
表达式和语句
============
要讨论语句,自然避免不了表达式了。我们先来看看表达式。
表达式
------
表达式用来产生一个值。它可能本身就是一个值,也可能是值与值之间进行加减之类的运算,也可能是执行一个动作获得返回值之类的。
数值型表达式
~~~~~~~~~~~~
数值型表达式,说白了就是一个值。它具体又分为这几种类型:
布尔型
^^^^^^
布尔型就是\ *真、假*\ 这两个字。实践表明这两个字几乎不会被用到。
数量型
^^^^^^
一个整数比如1376之类的。很遗憾只能是整数但三国杀里面也基本用不着小数来着。
字符串型
^^^^^^^^
一个字符串。
变量
^^^^
一个变量。关于变量,将在下一节进行讨论。
数组
^^^^
跟C语言的数组的格式差不多fkparse中数组的格式为
::
'[' [<表达式> {,<表达式>}] ']'
一对\ **半角**\ 方括号,中间是零个或者多个表达式。如果是多个的话,中间要有逗号隔开。
这里说明一下fkparse的数组里面所有成员的类型必须相同否则就报错。
字典
^^^^
如同Python里面的字典那样fkparse也支持字典类型而且字典的取值相当自由。其格式为
::
'{' {<字符串> ':' <表达式> ','} '}'
运算型表达式
~~~~~~~~~~~~
表达式之间支持各种运算。
四则运算
^^^^^^^^
加减乘除四种运算,对应的符号分别是\ *+、-、\*、/*\ 。比如2+35*3等等。
这个运算要求两个参与运算的表达式都必须是数字类型。运算结果也为数字类型。
比较运算
^^^^^^^^
可以对两个数字类型的表达式作比较运算,有以下几种运算符。
- *大于*\ :判断前一个是否大于后一个
- *小于*\ :判断前一个是否小于后一个
- *不是*\ :判断两个表达式是否不相等。这个运算符对两侧的表达式没有类型要求
- *是*\ :判断两个表达式是否相等。这个运算符对两侧的表达式没有类型要求
- *不小于*\ :判断前一个是否不小于后一个
- *不大于*\ :判断前一个是否不大于后一个
运算的结果为布尔类型。运算符直接就是汉字使用例2大于3。
这些运算符也可以直接按照C与Lua风格书写\ ``>, <, !=(或者~=), ==, >=, <=``
逻辑运算
^^^^^^^^
两个布尔类型的表达式可以进行逻辑运算。运算符如下:
- *且*\ :若两个都是真,则结果为真,否则结果为假
- *或*\ :只要其中有一个是真,则结果为真;若两者都为假,则结果为假
运算的结果为布尔类型。
运算符就是对应的汉字本身或者也可以按照C风格和Lua风格&&(and), \||(or)
函数调用
~~~~~~~~
详见函数调用那一章。
动作语句表达式
~~~~~~~~~~~~~~
光有上面几种还无法取得所有想要的值,有时候还需要借助动作语句的力量。
动作语句表达式的格式为:
::
'(' <动作语句> ')'
| 也就是用一对圆括号括起来的动作语句。有关动作语句的详情,稍后会进行描述。
| 接下来介绍变量。
.. _变量-1:
变量
----
变量有三种形式:
#. ``<标识符>``\ 。一般是先通过赋值语句定义,然后再进行使用。
#. ``<标识符> 的 <字符串>``\ 。用来获得<标识符>对应的那个变量的某一个属性,比如获得卡牌的花色点数之类的。有关于属性列表的信息,可以在参考手册部分找到,这里不罗列。
#. ``'(' <表达式> ')' 的 <字符串>``\ 。有时候需要获得属性的是一个表达式,此时需要把表达式用括号括起来。
所有的变量都需要定义后使用,但预定义好了的除外。预定义变量又分为两种:
#. 全局有效的预定义变量,不能重新赋值
#. 根据触发时机而确定的跟相关时机有关的变量,可以重新赋值。(但只有某些时机时候重新赋值才有效)比如\ ``'伤害来源'``\ 。
语句
----
表达式用来产生值,而语句则是具体执行的操作。
赋值语句
~~~~~~~~
赋值语句的格式为:
::
令 <变量> 为 <表达式>
或者
::
<变量> 为 <表达式>
这个语句通常用来定义变量,也可以改变变量的值。比如\ ``令'Y'为3``\ 就是一个合法的赋值语句。
注意你不能对系统内置的变量进行重新赋值否则会报错。如果赋值的变量是形如“xx的xx”这种格式的话fkparse可能检测不出错误但这种行为生成的代码可能会无法正常执行。
判断语句
~~~~~~~~
if语句在几乎任何语言里面都有fkparse也不例外判断语句的格式为
::
若 <表达式> 则 <语句块> { 否则若 <表达式> 则 <语句块> } [否则 <语句块>] 以上
循环语句
~~~~~~~~
循环语句的格式如下:
::
重复此流程: <语句块> 直到 <表达式>
这种循环语句是先把语句块执行一遍再判断表达式若表达式条件成立就退出循环。fkp还支持while循环
::
当 <表达式> 重复此流程: <语句块> 以上
这种循环语句会先对表达式进行判断,如果成立的话就执行语句块,然后再判断表达式的值,如此循环,直到表达式不成立为止。
break语句
~~~~~~~~~
break语句用来中止一个循环其格式为
::
中止此流程
请确保自己只在循环语句的内部使用这个fkparse不会去检查的。如果你在别的地方使用的话生成的lua会导致游戏无法启动哦。
返回语句
~~~~~~~~
返回语句用来让函数带上一个返回值,格式为:
::
返回 <表达式>
这个语句只在定义函数的时候用得到,关于函数定义在后续章节中有讲到。
.. _函数调用-1:
函数调用
~~~~~~~~
详见函数那一章。
数组操作
~~~~~~~~
详见后文。
动作语句
~~~~~~~~
终于到所有语句中的重头戏——动作语句了。动作语句用来执行一个实际的动作,比如摸牌、打伤害之类的,有些动作语句还能产生值。
但是由于动作语句的类型太多了,在这里罗列不太现实。请各位去查看参考手册吧。