.. 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啥的。