51 lines
2.4 KiB
ReStructuredText
51 lines
2.4 KiB
ReStructuredText
.. SPDX-License-Identifier: GFDL-1.3-or-later
|
||
|
||
解析:Exppattern
|
||
================
|
||
|
||
所谓Exppattern,类似于各大编程语言中的正则表达式。不过和正则表达式不同的是,正则匹配的是字符串,而Exppattern匹配的对象是一张张卡牌。通过Exppattern可以判断各种卡牌的情况,比如这张牌是否符合“既是红桃,也是点数3-5的牌”等等一系列复杂的规则。
|
||
|
||
你可能也已经注意到了,在不少Room中的askFor...函数中,出现了很多次pattern参数。这个pattern就是Exppattern,它用来辅助确定询问的卡牌必须满足哪些需求。
|
||
|
||
由于用作参数的pattern基本都是string类型,所以这里主要围绕如何编写这种字符串来说。
|
||
|
||
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啥的。
|