禁道具和连携击败姜世离

禁道具和连携击败姜世离

前言

谢沧行在锁妖塔与姜世离殊死较量的场景让人难忘,而对应困难模式的战斗则更是让人大呼过瘾。网上关于此战的策略,多半依赖以下道具或手段:

  • 烤鸭
  • 连携
  • 隐蛊

这些方法让战斗变得分外轻松,完全没有濒死对抗阶段的心惊肉跳,可以说,是对本战的一种不合适的解读。
笔者曾于一周目后试图摆脱这三种在多数战斗都过强的战术,提出了一种依靠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 900 1500 750 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,从而压力骤增,胜率骤降。

本战中,除了使用仙风云体术,谢沧行的其他行动都是小行动。

战斗流程

在详细介绍战斗流程之前,请先观看视频,带着直观印象阅读起来会更加轻松。

【情牵版】为了显示濒死阶段能扛住姜世离的四次出手,防御了几回合:
https://v.youku.com/v_show/id_XOTYxNDg3NTgw.html?spm=a2h0k.11417342.soresults.dtitle

【速战版】濒死阶段姜世离尚未第三次出手就被击败:
https://v.youku.com/v_show/id_XOTYxNTA4MTAw.html?spm=a2h0k.11417342.soresults.dtitle

一般阶段

本阶段利用阳系法术进行回复,利用寒泉术进行输出,利用聚法维持神的平衡。因为神量充足,治疗可以统一选用五气真言。注意情牵版中谢沧行血量要维持在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较远不能代表胜率大,也不能得出情牵版胜率优于速战版的结论。由于此模型涉及大量离散随机分布的运算,直接精确求解概率非常复杂,而估计时也不容易得到满意的胜率下界。
所以我们采用模拟战斗的方法来估计胜率。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#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,b;
do
{
a=rand();
b=rand();
}
while(a==0&&b<24); //32768^2%100=24 抽到相应24个数时重抽
return (a*68+b)%100+1; //(32768*a+b)%100 = (a*68+b)%100
}

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和连携击败姜世离

前言

上面文章提到的方法难免让人诟病:谢沧行水火双修就为这一战?太浪费时间了吧。另一方面,道具中比较不平衡的也只有烤鸭和隐蛊,此外DLC里面还有一些能让本战难度大幅下降的道具如恶鬼冥晶和蓄势符咒。换一种思考方式,假如把仙术也给禁了,再把上面那些破坏平衡的道具给禁了,有没有成功的方法呢?
有了妄念弑心咒就有了底气。经过尝试,确实存在这样的方法。由于内容简单不必单独成文,又与上面的内容有所关联,故附在本文最后。

战前规划

本战禁仙术输出,但不在本战之前禁。需要利用火系修为1500的效果,还是要练一下仙术的。

衣服 鞋子 最低修为 称号 贴符 道具 其他
天罡斗衣 天罡仙履(58身法) 火系1500 速战速决 强火 拼尽 积气 聚气 吸屏 续咒 幻偶雾10个 朱雀羽20个 混沌烟1个 石头83个 妄念弑心咒7个 食用赤兔筋1个

行动周期和前边速战版的是相同的,我们只要修改一下平均伤害表。

普通攻击 裂穹斩 刑锁念刃
1953 2995 3070

注意强火能让谢沧行的绝技伤害提高30%。不过这次我们只用裂穹斩这一种绝技。

战斗流程

在详细介绍战斗流程之前,仍请先观看视频。

【妄念弑心咒】一次强袭都没出,险胜:
https://v.youku.com/v_show/id_XMTY2NjM5NzgwMA==.html?spm=a2hzp.8244740.0.0

一般阶段

本阶段利用朱雀羽进行免疫和回复,利用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,可胜。

胜率分析

仍用战斗模拟来估计胜率。只需修改上面的程序,改动过的函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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");
}

结果如下:

也还是令人满意的。