FreeKill/docs/diy/09-exppattern.rst
2023-04-25 14:26:38 +08:00

51 lines
2.4 KiB
ReStructuredText
Raw Permalink 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
解析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啥的。