在太阳神三国杀中,判定是一件非常有乐趣的事情。想想马超铁骑时志在必得的呐喊,想想邓艾屯田时无比期待的眼神。判定,不仅带来的是理论上的缓冲与加成,更带给我们的,是成功时的欣喜若狂,和失败后的气急败坏……
</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>当然,这个技能也是需要用标志约束一下发动次数的,这里就不管它了。
- 编写说明
- 第一章 创建一个新武将
- 1.1 开发环境准备
- 1.2 创建一个新的武将扩展包
- 1.3 创建我们的新武将
- 第二章 添加技能
- 第三章 武将美化
- 3.1 美化环境准备
- 3.2 添加武将卡牌
- 3.3 添加武将头像
- 3.4 添加武将标签
- 第四章 创建一个新技能
- 第五章 添加音效
- 5.1 打造自己的声音工作室
- 5.2 添加技能使用音效
- 5.3 添加武将阵亡音效
- 第六章 添加提示信息
- 6.1 添加代码注释
- 6.2 显示提示信息
- 6.3 启动全屏信息特效
- 第七章 武将变更
- 第八章 启用AI
- 8.1 创建我们的AI文件
- 8.2 真实的AI
- 8.3 动手写AI
- 第九章 修改距离
- 第十章 技能管理
- 10.1 技能判定
- 10.2 创建技能
- 10.3 获得技能
- 10.4 失去技能
- 第十一章 修改手牌上限
- 第十二章 体力变更
- 12.1 流失体力
- 12.2 制造伤害
- 13.3 恢复体力
- 12.4 流失体力上限
- 12.5 增长体力上限
- 第十三章 游戏进程的变更
- 13.1 创建阶段触发技能
- 13.2 跳过回合阶段
- 13.3 插入一个额外的回合阶段
- 13.4 启用翻面
- 13.5 获得一个额外的回合
- 第十四章 启用标记(Mark)
- 14.1 添加标记
- 14.2 获得标记
- 14.3 失去标记
- 14.4 查看标记数目
- 第十五章 卡牌转换
- 15.1 主动牌的转换
- 15.2 被动牌的转换
- 第十六章 卡牌传递
- 16.1 创建摸牌技能
- 16.2 游戏中摸牌
- 16.3 游戏中弃牌
- 16.4 从其他武将处获得牌
- 16.5 判断目标区域是否有牌
- 16.6 移动场上的牌
- 第十七章 用牌实现技能效果
- 第十八章 启用标志(Flag)
- 第十九章 涉足判定领域
- 19.1 启用判定
- 19.2 更改判定
- 19.3 获得判定牌
- 第二十章 私家牌堆
- 20.1 向牌堆中添加牌
- 20.2 查看牌堆中牌的数量
- 20.3 从牌堆中移除牌
- 第二十一章 牌的锁定
- 第二十二章 免疫牌
- 第二十三章 让房间提供牌
- 23.1 提供主动牌
- 23.2 提供被动牌
- 第二十四章 启用标签(Tag)
- 第二十五章 濒死结算
- 第二十六章 交换座次
- 第二十七章 创建主公技
- 27.1 创建由主公发起的主公技
- 27.2 创建由他人发起的主公技
- 第二十八章 强力技能
- 28.1 直接死亡
- 28.2 改换身份
- 28.3 原地复活
- 28.4 立即胜利