前言
谢沧行在锁妖塔与姜世离殊死较量的场景让人难忘,而对应困难模式的战斗则更是让人大呼过瘾。网上关于此战的策略,多半依赖以下道具或手段:
- 烤鸭
- 连携
- 隐蛊
这些方法让战斗变得分外轻松,完全没有濒死对抗阶段的心惊肉跳,可以说,是对本战的一种不合适的解读。
笔者曾于一周目后试图摆脱这三种在多数战斗都过强的战术,提出了一种依靠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。
- 一般阶段:姜世离的血量超过一个阈值,比如说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 |
濒死阶段
| 回合 | 敌方剩余周期 | 操作 | 备注 |
|---|---|---|---|
| 我方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 |
胜率分析
#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; else base*=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); } else hp-=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); } else hp-=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); } else hp-=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); } else hp-=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和连携击败姜世离
前言
战前规划
本战禁仙术输出,但不在本战之前禁。需要利用火系修为1500的效果,还是要练一下仙术的。
| 衣服 | 鞋子 | 最低修为 | 称号 | 贴符 | 道具 | 其他 |
|---|---|---|---|---|---|---|
| 天罡斗衣 任一种 |
天罡仙履 神秘商店购买 加58身法 |
火系1500 | 速战速决 | 强火 拼尽 积气 聚气 吸屏 续咒 |
幻偶雾10个 朱雀羽20个 混沌烟1个 石头83个 妄念弑心咒7个 |
食用赤兔筋1个 |
| 普通攻击 | 裂穹斩 | 刑锁念刃 |
|---|---|---|
| 1953 | 2995 | 3070 |
战斗流程
在详细介绍战斗流程之前,仍请先观看视频。
- 妄念弑心咒 - 一次强袭都没出,险胜。
一般阶段
本阶段利用朱雀羽进行免疫和回复,利用2000伤害的石头进行输出,或者其他总共可以造成点伤害的道具都行。先给姜世离一个混沌烟,然后持续扔石头。记下最初的石头数量,减去83,当石头数量为此值时停止输出,进入下一阶段。
周旋阶段
和之前类似,最大的前提是保证敌人行动前我方血量充足或有火屏状态。利用幻偶雾维持神行状态,在有神行状态的前提下,如果小行动操作预见下回合落后姜世离,则使用幻偶雾。只要姜世离的行动不是屠焱,我们现在就有了连续5次行动机会。如果姜世离的行动是屠焱,我们只需重新等待创造上述机会即可,一般10个幻偶雾和20个朱雀羽都是完全够用的。
濒死阶段
在进入濒死阶段时,行动条最不利的情况下,有行动次序如下:
| 回合 | 敌方剩余周期 | 操作 | 备注 |
|---|---|---|---|
| 我方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); } else hp-=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"); }
结果如下:

也还是令人满意的。


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/62835.html