企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
在太阳神三国杀中,判定是一件非常有乐趣的事情。想想马超铁骑时志在必得的呐喊,想想邓艾屯田时无比期待的眼神。判定,不仅带来的是理论上的缓冲与加成,更带给我们的,是成功时的欣喜若狂,和失败后的气急败坏…… </br>如此的欢乐自然深深吸引了生性爱玩的孙悟空,没办法,我们只好想着给它设计了一个带有判定的技能,好好体验一下判定的疯狂…… > 斗法:出牌阶段,你可以摸一张牌并进行一次判定,若结果为黑桃,你将武将牌翻面并恢复1点体力,否则你弃置一张牌。 </br>不过呢,在动手之前,我们要先认识一下一个关于判定的结构体:JudgeStruct。这个结构体中保存了关于判定的各种信息,是进行判定不可缺少的物件~ </br>关于这个结构体的具体信息,可以参考源码(可在群文件里搜索 秒沉水 查找到源码)中的src\core\structs.h文件。 </br>从文件中可以看到,这个结构体有以下一些成员变量: 1. `negative`表示当判定结果落在判定规则`pattern`规定的范围中时,对进行判定的人是否不利。填true的话,表明这是一个不利判定,填false就说这是一个有利的判定啦。(编者:其实这个没什么用,可以忽略……) 2. `play_animation`表示本次判定是否播放动画,就是在判定生效时画在判定牌上的那个判定成功是的绿色对钩和失败时的红色十叉。 3. `who`表示进行判定的武将。 4. `card`表示本次判定的判定牌。 5. `pattern`表示判定的规则。格式是这样的: sgs.QRegExp("(卡牌判定结果):(花色判定结果):(点数判定结果)") </br>卡牌判定结果:填具体的卡牌的类型名称,像peach(桃子)之类的; </br>花色判定结果:填具体的花色代号,比如: - 黑桃:spade - 红心:heart - 草花:club - 方块:diamond </br>点数判定结果:填具体的点数,比如A、2、……;也可以是点数范围,格式是"[最小点数-最大点数]",像闪电的点数判定结果就是[2-9]。 </br>在同一个方面,如果有多个需要判定的结果,可以用竖线分割开,比如铁骑的判定,在花色方面有两个结果,一个红心、一个方块,所以在花色判定结果那里,就是"heart|diamond"了;如果有哪个方面与判定无关,可以用一个点和一个星号".*"代替,表示不关心。 </br> 6. good:表示是否期望判定结果落在pattern规定的范围里面。如果是true,表示期待对pattern的判定成功;false则表示判定结果还是不在pattern中比较好。 7. reason:表示判定的原因,一般是技能的名字。 8. time_consuming:(编者:这个也没什么用,忽略掉吧……)。 ![](https://img.kancloud.cn/41/a9/41a909e57a23d7f26aa9972af6a1ba85_425x530.png) </br>创建一个判定结构体,用的方法是sgs.JudgeStruct()。创建之后就可以填写那些成员变量,创造丰富多彩的判定场景了。 </br>当我们填好这些判定信息后,就可以真正进行判定了! </br>在太阳神三国杀里面,进行判定是在具体的房间中进行的,所以用到的当然也是Room的一个成员函数了,它就是:judge。函数原型是这样的: ``` judge(judge_struct) ``` ![](https://img.kancloud.cn/dc/4e/dc4ed7a9b0d602624140d21e781470ea_381x25.png) </br>其中,参数`judge_struct`就是我们的判定结构体JudgeStruct对象了。 </br>至于我们的斗法技能,我们可以将它设计成一个使用零张牌发动的视为技,把我们需要制造的效果写进技能卡中,然后使用它。 </br>根据这个思路,我们可以将代码写成这个样子: </br>技能卡部分: ![](https://img.kancloud.cn/33/3c/333c8391ca33470fb16c1c1cb67373eb_682x307.png) </br>视为技部分: ![](https://img.kancloud.cn/f2/73/f273940983b5f469500c8151332c4455_403x172.png) </br>但是,判定行为的确会发生,然后呢?没有下文了,没有翻面或弃牌的事情发生。 </br>所以进行一次判定,除了判定的过程本身,还要包括对判定结果的处理。如果判定结果是好的,该怎么做,如果不好,又该怎么做。 </br>首先,JudgeStruct为我们提供了两个方法,查看当前判定结果是否有利。 </br>其中一个是`isGood()`。如果它的答案为true,就表示判定成功,结果是好的;如果告诉我们false了,那么判定失败,结果是不利的。 </br>另一个是`isBad()`。与isGood()正好相反,答案为true时表示判定失败,false反而说明判定是成功的。 </br>所以接下来的代码,就应该是这样的: ![](https://img.kancloud.cn/e1/48/e1484ff0f0313d5064c4f17ef4942b9c_588x353.png) </br>噢,那个`askForDiscard`是用来提示弃牌的,是Room的一个成员函数。下面是它的原型: ``` askForDiscard(target, reason, discard_num, min_num, optional=false, include_equip=false, prompt) ``` ![](https://img.kancloud.cn/eb/99/eb9982341488c82c3849d28bdda1241c_1052x46.png) </br>其中: 1. `target`表示被询问的需要弃牌的角色。 2. `reason`表示弃牌的原因,一般是技能的名字。 3. `discard_num`表示要求弃牌的数目。 4. `min_num`表示弃牌的最小数目。 5. `optional`表示是否有时间限制,如果填true表示有限制,时间到了会由系统进行强制弃牌;填false就是没有限制了。默认是填false的。 6. `include_equip`表示弃牌是否包括装备,填true表示可以弃装备牌,填false就只能弃手牌了。默认是填false,只允许弃手牌的。 7. `prompt`表示提示信息,就是显示在那个要求弃牌的小窗口正文部分的内容。默认是什么也没有的空信息。 </br>好了,赶紧到游戏中体验一下判定吧。 </br>这是判定成功的情况: ![](https://img.kancloud.cn/9b/01/9b0158b94f66cc9c3d07ade5fef86fbc_216x113.png) </br>而这是判定失败的情况: ![](https://img.kancloud.cn/1d/41/1d41710b12f0bc9ec542033c76f63bfa_210x105.png) </br>当然,这个技能也是需要用标志约束一下发动次数的,这里就不管它了。