💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
一分耕耘,一分收获,我们要学会推迟自己的满足感,暂时的辛苦说不定会带来更大的汇报,你说是不是呀,悟空?(孙悟空:孩儿们,甭听他乱扯,咱们舞起来~) </br>这次我们打算为孙悟空设计这样的技能教育教育它: > 积蓄:摸牌阶段,你可以少摸一张牌并进行一次判定,若结果为基本牌,则回合结束阶段开始时,你可以摸X张牌,其中X为此基本牌的点数。 </br>显然,这个技能可以分成两个部分,一个在摸牌阶段进行判定,另一个在回合结束阶段摸牌。相应地,就有了两个触发时机。代码如下: ![](https://img.kancloud.cn/49/f9/49f9385db7d829fbda413f46ee0d0f2b_620x351.png) </br>先实现少摸一张牌的效果,这可以类比摸牌技能的代码: ![](https://img.kancloud.cn/d9/72/d972d7fb5828c7153a4848ae330d5add_634x177.png) </br>然后是进行一次判定。值得注意的是我们只关心这次判定的结果是不是基本牌,所以对判定牌具体的类型啊、花色啊、点数啊什么的都没有要求,于是判定规则那里就可以直接写`sgs.QRegExp("(.*):(.*):(.*)")`了,而且也不需要分辨判定结果是否有利了。 ![](https://img.kancloud.cn/c8/39/c83992f7682d053d68316e98811aaedd_554x195.png) </br>当判定结束后,我们需要检查判定牌是否为基本牌。这当然还要用Card的成员函数`isKindOf`了: ![](https://img.kancloud.cn/83/32/833299ec8b202982e0a45f266c986a45_508x109.png) </br>其中"BasicCard"表示基本牌。而装备牌是"EquipCard",锦囊牌则是"TrickCard"。锦囊牌还可以继续细分,比如“DelayedTrickCard”表示延时性锦囊,“NDTrickCard”表示非延时性锦囊,还有“AOE”似乎表示多目标锦囊等。 </br>现在我们遇到了一个麻烦:得到的点数怎么处理?或者说,在回合结束阶段,我们怎样知道当初摸牌阶段判定时得到了一个什么点数呢? </br>所以我们使用了一项之前没有用过的手段:标签。 </br>我们可以在房间里设置一个标签,用来保存我们在游戏过程中产生的一些信息;当其它时候我们需要查看这些信息的时候,就可以从标签中得到它们了。 </br>设置一个标签,用到的是Room的一个成员函数`setTag`。它的函数原型是: ``` setTag(key, value) ``` ![](https://img.kancloud.cn/dd/80/dd80c8ac791350f76e592ad818723e0f_550x26.png) </br>这里,参数`key`表示标签的名字,而`value`就是我们要存放的信息了。 </br>考虑到信息的多种多样,value在太阳神三国杀的支持下投靠了sgs.QVariant,所以我们可以通过`setValue`对它进行传值。当然,我们也可以直接在我们的信息外面套上一层sgs.QVariant()作为参数的值。 </br>现在我们把获得到的这个基本牌的点数放到一个标签里保存起来,让回合结束阶段可以继续使用它。嗯,标签的名字就叫作"Jixu_count"好了。 </br>代码如下: ![](https://img.kancloud.cn/0f/9a/0f9ade5dd8e26a6dccc3085a901981d0_509x134.png) </br>现在我们在摸牌阶段干的活就完成了,然后把目光转向回合结束阶段吧。 </br>回合结束阶段要做的事情是多摸X张牌,那么首先我们要从标签中把存起来的数值拿到才行。这个动作是通过Room的另一个成员函数 `getTag`实现的: ``` getTag(key) ``` ![](https://img.kancloud.cn/18/cf/18cf81fd352c0ab3039c945f662e1b29_425x25.png) </br>这个key就是刚才提到的标签名字了。 </br>于是我们顺利地写出了下面的代码: ![](https://img.kancloud.cn/56/93/5693b471e1cefadfd1016e0a77afa7e1_558x197.png) </br>至此我们的技能就实现了所有的描述,不过还有一点事情要做,那就是把我们设置的这个标签清除掉。因为标签本身就是提供给未来使用的,系统并不知道什么时候会使用完它,所以并不像标志那样主动清除它,需要我们在代码里面进行清除。要是不清除的话,以后每个回合,不论我们是否发动了技能,回合结束后就都能摸X张牌了,显然不是技能所期盼的样子。 </br>清除标签所用的方法依然是Room的成员函数,一个叫做`removeTag`的,函数原型是: ``` removeTag(key) ``` ![](https://img.kancloud.cn/66/8e/668e0f586b8d4f3aa6a65f836983f805_354x23.png) </br>其中`key`表示标签的名字。 </br>所以这里我们要加上这样的一句代码: ``` room:removeTag("Jixu_count") ``` ![](https://img.kancloud.cn/d0/4f/d04fc18f6f48fc876a34dfe3a72d5fae_477x95.png) </br>这样就真正完整地完成了。(编者:孙悟空!去看看积蓄有多好去!) </br>游戏记录如下: ![](https://img.kancloud.cn/26/d5/26d537bc3bf0b959ff125dace4f80b76_223x234.png) </br>由于判定结果为雷杀(属于基本牌),点数为8,所以在回合结束阶段摸了8张牌。(孙悟空:……孩儿们,咱们舞起来~编者:唉……)