FreeKill/docs/diy/09-exppattern.rst

51 lines
2.4 KiB
ReStructuredText
Raw Normal View History

.. SPDX-License-Identifier: GFDL-1.3-or-later
解析Exppattern
================
所谓Exppattern类似于各大编程语言中的正则表达式。不过和正则表达式不同的是正则匹配的是字符串而Exppattern匹配的对象是一张张卡牌。通过Exppattern可以判断各种卡牌的情况比如这张牌是否符合“既是红桃也是点数3-5的牌”等等一系列复杂的规则。
你可能也已经注意到了在不少Room中的askFor...函数中出现了很多次pattern参数。这个pattern就是Exppattern它用来辅助确定询问的卡牌必须满足哪些需求。
2023-04-25 14:26:38 +08:00
由于用作参数的pattern基本都是string类型所以这里主要围绕如何编写这种字符串来说。
2023-04-25 14:26:38 +08:00
pattern的语法
-------------
一个完整的pattern是用多个 ``matcher`` 组成的,并用分号 ``;`` 相连接。
而每个单独的matcher的语法则类似这样
.. code::
牌名|点数|花色|区域|完整牌名|牌类型|牌id
一个个来看看:
- 牌名:能匹配的牌名,准确来说匹配的是 ``trueName`` 。比如slash也能匹配火杀。但反过来就不行了。
- 点数匹配的牌的点数。可以用波浪线表示范围2~6等。
- 花色匹配的牌的花色可以写heart, spade, club, diamond
- 区域匹配的牌的区域匹配hand手牌区, equip装备区以及各种私人牌堆。
- 完整牌名:类似牌名,但匹配的是 ``name``
- 牌类型:匹配牌的类型,可以写 basic, trick, equip
- 牌id匹配牌的id
在这每一项中,你可以用逗号 ``,`` 来分隔相应的项,让他能匹配多种情况。比如 ``slash,jink`` 就能同时匹配杀和闪。
你也可以使用 ``^`` 来否定某一个元素,这样会匹配除了他之外的卡牌。比如 ``.|.|.|.|.|.|^65`` 匹配所有id不为65的牌。
若想同时否定多个元素,则需要用括号,例如 ``^(3,5)````^3,^5`` 会被认为是匹配所有不是3或者所有不是5这样一来就变成匹配所有了。
说到匹配所有,使用点号 ``.`` 即可让这一项匹配所有。默认情况下每一项都是匹配所有情况。
对pattern进行测试
-----------------
答案是使用dbg大法让游戏停下然后可以用如下的代码测试一个pattern:
.. code:: lua
Exppattern:Parse(".|2~8"):match(card)
至于card自己想办法获取吧比如getCardById啥的。