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