前言
谢沧行在锁妖塔与姜世离殊死较量的场景让人难忘,而对应困难模式的战斗则更是让人大呼过瘾。网上关于此战的策略,多半依赖以下道具或手段:
- 烤鸭
- 连携
- 隐蛊
这些方法让战斗变得分外轻松,完全没有濒死对抗阶段的心惊肉跳,可以说,是对本战的一种不合适的解读。
笔者曾于一周目后试图摆脱这三种在多数战斗都过强的战术,提出了一种依靠DLC中恶鬼冥晶取得胜利的战略,在与他人讨论并经过大量测试后又成功将DLC的依赖摆脱,实现了借助寒泉术输出的方案。
这一次,笔者决定探究清楚所有细节,给出两种战术,实现对连携和道具的完全禁用,并模拟计算胜率。这里的禁道具,包括在战斗前食用各种属性药(但其中一种战术需要给谢沧行留一个赤兔筋,这是非常容易达成的目标,也能大幅提高胜率)。
姜世离 AI
AI控制着姜世离每回合的行动,我们先看看姜世离的行动规律是怎样的。
- 血量大于25%时,按几率使用以下招数。
- 屠焱 (40%几率)
- 冥龙袭 (30%几率)
- 炎弑斩 (20%几率)
- 焚世龙火 (10%几率)
- 血量不超过25%时,开始计算回合。接着按顺序使用以下招数。
- 弑神斩
- 屠焱
- 冥龙袭
- 炎弑斩
- 焚世龙火★
- 持续使用10倍伤害的焚世龙火★
姜世离血量小于25%,即小于56250时有濒死垂头动作,而血量小于等于25%时——因为取整影响,实际上是血量小于58500时——就会进入濒死阶段。因此无法通过姜世离垂头动作来判断行动,只能根据血量条来目测。
名称 | 属性 | 威力 | 行动周期 | 附加伤害 |
---|---|---|---|---|
屠焱 | 火 | 288 | 12 | |
冥龙袭 | 火 | 540 | 20 | |
炎弑斩 | 火 | 750 | 20 | |
焚世龙火 | 火 | 950 | 20 | |
焚世龙火★ | 无 | 2000 | 20 | |
弑神斩 | 无 | 0 | 20 | 若谢沧行血量超过20%,则扣除到只剩20% |
弑神斩的伤害结算受取整影响,准确的说是扣除到只剩20%至21%。例如谢沧行当血量为1217时,计算血量比例为1217/5085=23.9%,取整为23%,于是弑神斩会扣除3%血量,即5085*3%=152.5,取整为152。进入濒死阶段时,谢沧行的血量为1217-152=1065。
我们把与姜世离的战斗按时间顺序分为3个阶段:
- 一般阶段:姜世离的血量超过一个阈值,比如说30%。以后我们即称此为阈值。此阶段只需要快速输出和兼顾治疗即可,具体数值不作计算。
玩家通过观察姜世离的血条,肉眼可确定姜世离的血量是否在26%与阈值之间,或者说在58500至67500之间(如果取30%)。阈值越小,胜率就越高,我们认为玩家通过短时间的训练,可以轻松地使阈值小于30%。
当然我们可以通过统计每回合的伤害来限制阈值达到最小的26%,但这使得战斗拖沓无趣,我们认为玩家不会愿意采用这样的方法。 - 周旋阶段:姜世离的血量在26%与阈值之间。此阶段与敌人周旋,找机会创造连续大量的回合,然后连续施放寒泉术,直到姜世离的回合过后进入下一阶段。
- 濒死阶段:此阶段谢沧行不能使用仙术和道具。配合使用绝技和普攻,想办法在有限回合内创造最大伤害。
战前规划
俗话说磨刀不误砍柴工,我们的宗旨是允许在战斗前花大量的时间进行准备,目标是提高战斗的效率和胜率。
下面分两种战术来分别介绍战斗前的准备,读者可能要读完全篇并亲自尝试后方知这样选择的理由。
由于两种战术使用的称号不相同,而由此带来战术的变化,因此将战术使用的称号作为战术的名称。
名称 | 衣服 | 鞋子 | 最低修为 | 称号 | 贴符 | 其他 |
---|---|---|---|---|---|---|
情牵版 | 天罡斗衣 寒晶岛换得 加仙防375 |
天罡仙履 任一种 |
风系 200 水系1700 火系1500 阳系1700 |
剑牵情牵 | 猛力·贰 拼尽 强水 仙身·贰 聚法 续咒 |
无 |
速战版 | 天罡斗衣 任一种 |
天罡仙履 神秘商店购买 加58身法 |
风系 200 水系1700 火系1500 阳系1700 |
速战速决 | 猛力·贰 拼尽 强水 聚气 聚法 续咒 |
食用赤兔筋1个 |
此时我们需要重点关注谢沧行的一些基础属性,它们将在伤害计算和分析中产生重要作用。
战术 | 攻击 | 仙攻 | 防御 | 仙防 | 水加成 | 水抗性 | 火抗性 | 暴击 | 连击 | 身法 |
---|---|---|---|---|---|---|---|---|---|---|
情牵版 | 4189 | 1853 | 1804 3804 |
50 | 12 | 79 | 24 | 495 | ||
速战版 | 4090 | 1754 | 1705 3705 |
40 | 12 | 59 | 24 | 477 | ||
姜世离 | 600 | 750 | 900 1500 |
10 | 464 |
其中有两行的数据分别代表濒死阶段前后的数据变化。代入伤害公式,计算得到濒死阶段时互相的平均伤害。
战术 | 寒泉术 | 普通攻击 | 裂穹斩 | 刑锁念刃 | 屠焱 | 冥龙袭 | 炎弑斩 | 焚世龙火★ |
---|---|---|---|---|---|---|---|---|
情牵版 | 10426 | 2478 | 2339 | 2398 | 73 | 138 | 192 | 583 |
速战版 | 9238 | 2246 | 2304 | 2362 | 130 | 245 | 340 | 686 |
其中普通攻击为算上连击暴击和94%的命中率得到的期望伤害,衣服统一为加375仙防的天罡斗衣。只要谢沧行进入濒死阶段前的血量不少于1017,进入濒死阶段后的血量一定也不少于1017,因此计算得:
-
情牵版:姜世离行动四次,输出为73+138+192+583=986
看起来很危险,但冥龙袭有4段,焚世龙火★有8段。由大数定律以及取整影响可知,伤害值飙升到1017以上的几率极小;此外进入濒死阶段时血量还可能多几十,所以其实很安全。
-
速战版:姜世离行动三次,输出为130+245+340=715
这便是将仙身·贰换下的原因。因为少了剑牵情牵加的99点仙防,无论如何不能坚持到姜世离的四次行动,因而减伤符咒对于濒死阶段没有任何意义。
接着我们关注一下谢沧行的行动周期。
战术 | 小行动 | (神行) 小行动 | (神行) 大行动 |
---|---|---|---|
情牵版 | 7 | 5 | 10 |
速战版 | 6 | 4 | 8 |
如果不食用赤兔筋,小行动周期为7,这使得濒死阶段损失1~2回合输出;更重要的是,有神行时大行动周期变为9,这使得周旋阶段一次性最多获得的回合有可能降低到4,从而压力骤增,胜率骤降。
本战中,除了使用仙风云体术,谢沧行的其他行动都是小行动。
战斗流程
在详细介绍战斗流程之前,请先观看视频,带着直观印象阅读起来会更加轻松。
- 情牵版链接 – 为了显示濒死阶段能扛住姜世离的四次出手,防御了几回合
- 速战版链接 – 濒死阶段姜世离尚未第三次出手就被击败
一般阶段
本阶段利用阳系法术进行回复,利用寒泉术进行输出,利用聚法维持神的平衡。因为神量充足,治疗可以统一选用五气真言。注意情牵版中谢沧行血量要维持在3000以上,速战版3500以上。当姜世离血量下降到阈值以下,即玩家无法判断继续输出会不会使姜世离血量小于26%,就进入下一阶段。
阳修为1700并不是必须的,只依靠初始的100阳修为照样来得及治疗。这么做是为了压缩战斗时间,玩家实际体验时可以不练阳系。
周旋阶段
为了寻找连续行动的机会,最大的前提是保证敌人行动前我方血量充足。利用仙风云体术维持神行状态,在有神行状态的前提下,如果小行动操作预见下回合领先姜世离(将鼠标放在“攻”上观察人物位置),而大行动操作预见下回合落后姜世离(将鼠标放在“仙风云体术”上观察人物位置),如下两张图:
则使用仙风云体术,只要姜世离的行动不是屠焱,我们现在就有了最多回合的连续行动机会(情牵版4次,速战版5次)。如果姜世离的行动是屠焱,我们只需重新等待创造上述机会即可。
接下来利用多次的输出机会,不断使用寒泉术,以争取在进入下一阶段前打掉敌人尽可能多的血。
战术 | 平均输出 | 剩余血量 (按阈值30%计) |
---|---|---|
情牵版 | 41704 | 25796 |
速战版 | 46190 | 21310 |
待敌人行动后,我们便进入下一阶段。
濒死阶段
此时我们的有效输出只有绝技和普攻。由于绝技伤害和普通伤害半斤八两,所以使用绝技无回合损失,但裂穹斩和刑锁念刃分别有30%和40%几率附加强袭3回合(在续咒作用下为5回合,实际对4次普攻有加成),因此选择使用。
在进入濒死阶段时,行动条最不利的情况下,情牵版战术有行动次序如下:
回合 | 敌方剩余周期 | 操作 | 备注 |
---|---|---|---|
我方1 | 15 | 刑锁念刃 | 剩余20气 |
我方2 | 8 | 普通攻击 | |
我方3 | 1 | 普通攻击 | |
敌方1 | -6 | 屠焱 | 回复2气 (火系修为不小于1500的角色受火属性攻击每段回复2气) |
我方4 | 6 | 普通攻击 | |
敌方2 | -1 | 冥龙袭 | 4段伤害,共回复8气 |
我方5 | 19 | 普通攻击 | |
我方6 | 12 | 普通攻击 | |
我方7 | 5 | 普通攻击 | |
敌方3 | -2 | 炎弑斩 | 回复2气,通过受火属性攻击累计回复12气 |
我方8 | 18 | 普通攻击 | |
我方9 | 11 | 普通攻击 | |
我方10 | 4 | 普通攻击 | 我方累计执行普攻操作9次 运气不太差的话,通过普攻回复的气应在18以上 |
敌方4 | -3 | 焚世龙火★ | |
我方11 | 17 | 裂穹斩 | 如果此时气还不足50则普通攻击 |
我方12 | 10 | 普通攻击 | |
我方13 | 3 | 普通攻击 | 如果敌人还没死,我们就输了 |
敌方4 | -4 | 10倍伤害焚世龙火★ | 胜败乃兵家常事,大侠请重新来过 |
行动条最不利的情况下,速战版战术有行动次序如下:
回合 | 敌方剩余周期 | 操作 | 备注 |
---|---|---|---|
我方1 | 14 | 刑锁念刃 | 剩余20气 |
我方2 | 8 | 普通攻击 | |
我方3 | 2 | 普通攻击 | |
敌方1 | -4 | 屠焱 | 回复3气 |
我方4 | 8 | 普通攻击 | |
我方5 | 2 | 普通攻击 | |
敌方2 | -4 | 冥龙袭 | 4段伤害,共回复12气 |
我方6 | 16 | 普通攻击 | |
我方7 | 10 | 普通攻击 | |
我方8 | 4 | 普通攻击 | 我方累计执行普攻操作7次 运气不太差的话,通过普攻回复的气应在12以上 |
敌方3 | -2 | 炎弑斩 | 回复3气,通过受火属性攻击累计回复18气 |
我方9 | 18 | 裂穹斩 | 如果此时气还不足50则普通攻击 |
我方10 | 12 | 普通攻击 | 如果此时气达到50则使用裂穹斩 |
我方11 | 6 | 普通攻击 | 如果此时气达到50则使用裂穹斩 |
我方12 | 0 | 普通攻击 | 如果此时气达到50则使用裂穹斩 |
敌方4 | -6 | 焚世龙火★ | 胜败乃兵家常事,大侠请重新来过 |
用期望作为单回合输出,忽略可能附加的强袭状态,有下表:
战术 | 平均输出 | 剩余血量 (按阈值30%计) |
---|---|---|
情牵版 | 31995 | -6199 |
速战版 | 27126 | -5816 |
胜率分析
平均值偏离0较远不能代表胜率大,也不能得出情牵版胜率优于速战版的结论。由于此模型涉及大量离散随机分布的运算,直接精确求解概率非常复杂,而估计时也不容易得到满意的胜率下界。
所以我们采用模拟战斗的方法来估计胜率。
#include<stdlib.h>
#include<stdio.h>
#include<time.h>double battle_rand() //战斗中普遍使用的随机因子
{int n=rand()%32+240;return n/256.0;
}int rate_rand() //返回1~100的随机整数
{int a;do{a=rand();}while(a<68); //32768%100=68 抽到相应68个数时重抽return a%100+1;
}int atk_damage(int atk,int qx,int bj,int lj, int*dp) //计算单次普通攻击伤害。atk是攻击力,qx=1表示有强袭//bj为暴击,lj=1表示发生连击,dp是气的指针
{double base=atk*2.0*(1-1500/2600.0)*(1-1500/2600.0)*battle_rand();int r=rate_rand();if (r>=95)return 0;r=rate_rand();if (r<=bj){base*=1.5;*dp+=1;}if (lj) base*=0.7;int damage=base;if (qx)damage*=1.5;damage*=1.15; //这是猛力2符咒 可将失误率下降到1/10 *dp+=2;return damage;
}int water_damage(int matk,int jc) //计算寒泉术单段伤害 matk是仙攻 jc是水加成(剑牵情牵有10点水加成)
{double base=(1+matk/100.0)*(1+jc/100.0)*1.3*1.3*(1-750/4000.0)*0.9*288*battle_rand();int damage=base;return damage;
}int skill_damage(int atk,int type) //计算绝技总伤害(为了简单就不分段了,两次绝技误差撑死12点,可忽略)
{double base=(990+atk/2+200)*(1-1500/2600.0)*(1-1500/2600.0)*battle_rand();if (type)base*=4.08;elsebase*=3.98;int damage=base;return damage;
}int test(int hp,int mode) //测试一场战斗 hp为姜世离剩余血量 mode=1表示剑牵情牵 =0表示速战速决
{int atk,matk,bj,qx,r,i,n;int dp=100; //100点气 if (mode) //剑牵情牵战术模式{atk=4189;matk=1853;bj=79;qx=0;for(i=0;i<4;i++) //连续4发寒泉术hp-=water_damage(matk,50);hp-=skill_damage(atk,1); //使用刑锁念刃 40%几率强袭dp-=80;r=rate_rand(); if (r<=40)qx=1;for(i=0;i<9;i++){if (i==4)qx=0; //强袭状态消失r=rate_rand();if (r<=24) //判断是否发生连击{hp-=atk_damage(atk,qx,bj,1,&dp);hp-=atk_damage(atk,qx,bj,1,&dp); }elsehp-=atk_damage(atk,qx,bj,0,&dp);}dp+=12; //受姜世离攻击回复12气 n=3; //接下来还有3回合 if(dp>=50) //事实上此时气还不足50的几率可以忽略{dp-=50;n--;hp-=skill_damage(atk,0); //使用裂穹斩 30%几率强袭r=rate_rand();if (r<=30)qx=1;}for(i=0;i<n;i++){r=rate_rand();if (r<=24){hp-=atk_damage(atk,qx,bj,1,&dp);hp-=atk_damage(atk,qx,bj,1,&dp); }elsehp-=atk_damage(atk,qx,bj,0,&dp); }}else{atk=4090;matk=1754;bj=59;qx=0;for(i=0;i<5;i++)hp-=water_damage(matk,40);hp-=skill_damage(atk,1);dp-=80;r=rate_rand();if (r<=40)qx=1;for(i=0;i<7;i++){if (i==4)qx=0;r=rate_rand();if (r<=24){hp-=atk_damage(atk,qx,bj,1,&dp);hp-=atk_damage(atk,qx,bj,1,&dp); }elsehp-=atk_damage(atk,qx,bj,0,&dp);}dp+=18; //受姜世离攻击回复18气for(i=0;i<4;i++) //对于速战速决,有技能就放才是王道 {if(dp>=50){dp-=50;hp-=skill_damage(atk,0);r=rate_rand();if (r<=30)qx=1; }else{r=rate_rand();if (r<=24){hp-=atk_damage(atk,qx,bj,1,&dp);hp-=atk_damage(atk,qx,bj,1,&dp); }elsehp-=atk_damage(atk,qx,bj,0,&dp);}}}return hp; //返回姜世离剩余hp
}int main()
{int i,s,j=0,num=0,hp=0;printf("输入要模拟战斗的组数:");scanf("%d",&num);printf("输入姜世离血量阈值:");scanf("%d",&hp);srand((unsigned)time(0));for(i=0;i<num;i++){if(test(hp,0)>0)s++;if(test(hp,1)>0)j++;}printf("阈值HP:%d\t战斗次数:%d\n",hp,num);printf("情牵版失败次数:%d\t失败率:%lf%%\n",j,j*100.0/num);printf("速战版失败次数:%d\t失败率:%lf%%\n",s,s*100.0/num);system("pause");
}
- 30%的阈值,两种方法胜率已经超过99%,值得信赖
- 阈值下降2500后,失误率下降近90%,可见火眼金睛非常重要
- 如果用计算器游戏,这两种方法都可以认为是必胜
- 总的来说,速战速决比剑牵情牵更加稳定,因为普攻的不确定因素相对较多
禁仙术、烤鸭、隐蛊、DLC和连携击败姜世离
前言
上面文章提到的方法难免让人诟病:谢沧行水火双修就为这一战?太浪费时间了吧。另一方面,道具中比较不平衡的也只有烤鸭和隐蛊,此外DLC里面还有一些能让本战难度大幅下降的道具如恶鬼冥晶和蓄势符咒。换一种思考方式,假如把仙术也给禁了,再把上面那些破坏平衡的道具给禁了,有没有成功的方法呢?
有了妄念弑心咒就有了底气。经过尝试,确实存在这样的方法。由于内容简单不必单独成文,又与上面的内容有所关联,故附在本文最后。
战前规划
本战禁仙术输出,但不在本战之前禁。需要利用火系修为1500的效果,还是要练一下仙术的。
衣服 | 鞋子 | 最低修为 | 称号 | 贴符 | 道具 | 其他 |
---|---|---|---|---|---|---|
天罡斗衣 任一种 |
天罡仙履 神秘商店购买 加58身法 |
火系1500 | 速战速决 | 强火 拼尽 积气 聚气 吸屏 续咒 |
幻偶雾10个 朱雀羽20个 混沌烟1个 石头83个 妄念弑心咒7个 |
食用赤兔筋1个 |
行动周期和前边速战版的是相同的,我们只要修改一下平均伤害表。
普通攻击 | 裂穹斩 | 刑锁念刃 |
---|---|---|
1953 | 2995 | 3070 |
注意强火能让谢沧行的绝技伤害提高30%。不过这次我们只用裂穹斩这一种绝技。
战斗流程
在详细介绍战斗流程之前,仍请先观看视频。
- 妄念弑心咒 – 一次强袭都没出,险胜。
一般阶段
本阶段利用朱雀羽进行免疫和回复,利用2000伤害的石头进行输出,或者其他总共可以造成166500点伤害的道具都行。先给姜世离一个混沌烟,然后持续扔石头。记下最初的石头数量,减去83,当石头数量为此值时停止输出,进入下一阶段。
周旋阶段
和之前类似,最大的前提是保证敌人行动前我方血量充足或有火屏状态。利用幻偶雾维持神行状态,在有神行状态的前提下,如果小行动操作预见下回合落后姜世离,则使用幻偶雾。只要姜世离的行动不是屠焱,我们现在就有了连续5次行动机会。如果姜世离的行动是屠焱,我们只需重新等待创造上述机会即可,一般10个幻偶雾和20个朱雀羽都是完全够用的。
接下来利用多次的输出机会,不断使用妄念弑心咒。姜世离剩余血量:58500-7000*5=23500。
待敌人行动后,我们便进入下一阶段。
濒死阶段
在进入濒死阶段时,行动条最不利的情况下,有行动次序如下:
回合 | 敌方剩余周期 | 操作 | 备注 |
---|---|---|---|
我方1 | 14 | 裂穹斩 | 剩余50气 |
我方2 | 8 | 裂穹斩 | 剩余0气 |
我方3 | 2 | 普通攻击 | |
敌方1 | -4 | 屠焱 | 回复5气 |
我方4 | 8 | 普通攻击 | |
我方5 | 2 | 普通攻击 | |
敌方2 | -4 | 冥龙袭 | 4段伤害,共回复20气 |
我方6 | 16 | 普通攻击 | |
我方7 | 10 | 普通攻击 | |
我方8 | 4 | 普通攻击 | |
敌方3 | -2 | 炎弑斩 | 回复5气,通过受火属性攻击累计回复30气 |
我方9 | 18 | 普通攻击 | 我方累计执行普攻操作7次 通过普攻回复的气应在20以上 |
我方10 | 12 | 裂穹斩 | |
我方11 | 6 | 普通攻击 | |
我方12 | 0 | 普通攻击 | |
敌方4 | -6 | 焚世龙火★ | 胜败乃兵家常事,大侠请重新来过 |
这里变数比较多,不能完全按表来行动,准确的行动规则是:有强袭状态或气不足50点时普攻,否则使用裂穹斩。
用期望作为单回合输出,假定没有加到强袭状态(几率34.3%),平均输出为26562 > 23500,可胜。
胜率分析
仍用战斗模拟来估计胜率。只需修改上面的程序,改动过的函数如下:
int atk_damage(int atk,int qx,int bj,int lj, int*dp) //计算单次普通攻击伤害。atk是攻击力,qx=1表示有强袭//bj为暴击,lj=1表示发生连击,dp是气的指针
{double base=atk*2.0*(1-1500/2600.0)*(1-1500/2600.0)*battle_rand();int r=rate_rand();if (r>=95)return 0;r=rate_rand();if (r<=bj){base*=1.5;*dp+=1;}if (lj) base*=0.7;int damage=base;if (qx)damage*=1.5;// damage*=1.15; *dp+=3;return damage;
}
int skill_damage(int atk) //计算绝技总伤害
{double base=(990+atk/2+200)*(1-1500/2600.0)*(1-1500/2600.0)*battle_rand()*1.3;base*=3.98;int damage=base;return damage;
}
int test(int hp) //测试一场战斗
{int atk,bj,qx,r,i;int dp=100; //100点气 int round; //记录一下强袭的回合数 atk=4090;bj=59;qx=0;for(i=0;i<12;i++){switch(i) //姜世离攻击加气的回合{case 3: case 8: dp+=5; break;case 5: dp+=20; break;}if(qx) //回合开始清算状态{round--;if(!round)qx=0;}if(qx||dp<50) //有强袭或气不足50就普攻{r=rate_rand();if (r<=24){hp-=atk_damage(atk,qx,bj,1,&dp);hp-=atk_damage(atk,qx,bj,1,&dp); }elsehp-=atk_damage(atk,qx,bj,0,&dp); }else //否则使用50气绝技{dp-=50;hp-=skill_damage(atk);r=rate_rand();if (r<=30) //30%几率加强袭{qx=1;round=5;}}}return hp; //返回姜世离剩余hp
}
int main()
{int i,j=0,num=0;printf("输入要模拟战斗的组数:");scanf("%d",&num);srand((unsigned)time(0));for(i=0;i<num;i++){if(test(23500)>0)j++;}printf("失败次数:%d\t失败率:%lf%%\n",j,j*100.0/num);system("pause");
}
结果如下:
也还是令人满意的。