下载 App

[重置版]公式对决PVP从入门到完结

精华08/03730 浏览攻略
是的没错,看完这篇教程之后你将完全不需要任何其他攻略。本文预计阅读时间超过2小时,建议分段多次阅读。作为半教程半说明书性质的文章,欢迎反复温习与参考,话不多说,我们出发!

大纲

在这篇教程中,我们会讨论以下内容:
    0.  游戏基本性质扫盲
  1. 什么样的函数是好函数?我们需要什么样的函数(第一章)
  2. 这些函数具体长什么样?如何使用简单的参数控制函数的变化(第二、三、四、五章)
  3. 在实战中,我们如何快速写出这种函数(第六章)
  4. 实战中的估算技巧,以及基于上一条失败公式路径的公式调整方案(第七、八章)
那么,让我们开始吧

0 游戏基本性质扫盲

以防你还不了解这款游戏的基本性质,我来重复一次这个游戏的基本特性:
在游戏中,你将输入一个函数y=f(x),然后在图中画出函数的轨迹。对于函数来说,你的出发点被重新定义为原点(0,0),并以此为基础确定其他坐标。f(x)中的常数项会被自动忽略以保证f(x)过原点,函数f(x)只允许存在可去间断点(在断点处左右极限存在且相等),一旦出现其他间断点,函数立即停止前进。

1 这么多函数,我该选什么?

虽然你会看到电脑使用很多乱七八糟的公式,但实际上人类能使用的只有少数几种,那么什么样的公式是比较符合人的思维的呢?首先他应该足够简单,其次这个函数的某些可变参数应该能直观的改变函数的形状,这样我们才能快速设计出想要的轨迹。作为结论,下列函数将是我们主要使用的函数:直线y=k(x-x1)+y1,指数函数y=10^(±10(x1-x)),高频三角函数y=sin(8x),以及用来实现控制的绝对值函数abs,其他函数在实现同等功能时需要的参数量和计算量均得不偿失,因此不计入讨论范畴。
在此后的章节,你将看到由这些函数组成的形形色色的函数,以及对他们更详细的介绍,我们要加速了,准备好了吗?

2 上天入地无所不能——折线Z

TapTap
你将面对的是这样一种函数图像
函数形式:Z(k0,x,k1,x1,k2,x2……,kn,xn)=
1/2*(k0*2x+k1*(abs(x-x1)+x-x1))+k2*(abs(x-x2)+x-x2)+……)
很吓人,对吗。不要怕,我们先讲这个函数的性质,再讲这个函数是这么设计出来的

2.1 函数参数的作用特点

在这个函数中,红色的参数都是用来改变函数特点的,具体来说,分为斜率ki和拐点xi两种:
斜率ki
这些参数决定折线在每一段上的增长率,假设折线在进入这一段之前的斜率为k,那么这一段折线将以(k+ki)的斜率进行增长。(对于k0,因为他是函数的起始段,k0就是第一段折线的斜率)
拐点xi:
这些参数决定折线在什么地方进入下一段

2.2 函数参数的计算方法

对于折线来说,拐点是很容易看出来的,你希望函数拐弯的横坐标即为函数的拐点(注意,这里的横坐标是相对于出发点来算的,而不是游戏内的绝对坐标,如无特殊说明,本文的所有坐标均指代相对坐标,此后将不再声明),而斜率需要一点算力:首先求出这段折线的绝对斜率ki‘=(y_i-y_{i-1})/(x_i-x_{i-1}),然后做差得到ki=ki'-k_{i-1}'

2.3折线函数的适用范围及使用方法

在需要通过复杂地形时通常使用折线函数,首先确定第一段折线的起始点,以及斜率,然后在这条线上合适的位置确定为第二段折线的起点,然后确定第二段折线的斜率,以此类推直到完全通过地形。在实战中,我们往往是先根据缝隙的大致走向确定一个斜率,然后将其向两端延申得到这一段折线的参数的。

2.3 设计思路,以及入选理由

在实战中,我们经常不能直接接触到对面,层叠复杂的地形要求我们设计出复杂的路线才能摸到对手,这时候函数势必异常复杂,而我们自然会想到,如果能把函数分为多段,每一段都使用最简单的直线,那么就能将复杂的任务解耦,拆成一系列简单的任务,从而大大降低计算量。借助绝对值函数,我们可以快速设计出分段函数的公式,但如果仅保留最原始的形式y=k0x+k1abs(x-x1)+k2abs(x-x2)+……每一个k都取决于其他的k,仍然比较麻烦,因此我们使用了最终你看到的样子,通过将x-xi和abs(x-xi)配套使用,我们创建了一个在x<xi时恒为0的式子,这使得我们可以只关注ki的前一项。
由于绝对值折线的相对简短性以及极小的参数计算量,在面对复杂地形时,折线函数绝对是优选。

3 山穷水复神之一手——阶跃函数U

TapTap
阶跃函数的典型图像
函数形式:U(x,A,x1)=A/(1+9^(19(x1-x)))

3.1 函数的参数的作用特点

观察这个函数,9^(19(x1-x))是一个偏移后的指数函数,它的特点是在x<x1时,这个数会变得非常大,但是一旦x>x1,函数值会迅速接近0,利用这一性质,我们可以得出,原函数在x<x1时值接近0,而在x>x1时接近A。那么我们便可以得到以下结论:
A用来改变阶跃函数的跨度,也就是函数前后的y坐标差,A是正数则向上移,A是负数则下移。
x1用来决定函数何时跨越。
这两个参数都很显然,因此省略参数的计算方法(事实上也不需要计算)

3.2 阶跃函数的适用范围及基础使用方法

在任何需要极其陡的斜线的地方,都可以使用阶跃函数来代替(否则如果你依然选择折线的话,你就要面对类似(1000(abs(x-12)+x-12)-1000(abs(x-12.001)+x-12.001))/2的超长公式了),使用也是及其方便的,只需要计算出x1和A即可。

*3.3 阶跃函数进阶技巧:限制结束点

在某些时候,我们只希望在某一段向上阶跃,而之后又回到原来的位置,这时候就可以采用阶跃函数的变式:
U’(x,A,x1,x2)=A/(1+9^(k(x1-x)(x2-x)))
相较于原本的阶跃函数,我们在指数部分加入了第二个参数,考虑到原函数事实上是围绕(x1-x)的正负性进行的讨论,我们仅需要对(x1-x)(x2-x)的正负性进行讨论即可。这个函数仅在x1<x<x2的区域为负,也就是说,f(x)在x1<x<x2时接近A,其他地方接近0。这样我们就得到了仅在某一段区间内非0的函数。
细心的你应该发现这里使用了k作为参数,这是因为指数函数增长极快,一旦指数部分超过300左右就会导致数值超出上限而失效,因此这里的k需要取小一点,建议为1左右即可(也就是说,你可以直接去掉这个参数)

*3.4 阶跃函数进阶技巧:分段函数

前面介绍的阶跃函数形式为U(x,A,x1)=A/(1+9^(19(x1-x))),让我们用另一种方式去理解这个函数。
如果将A视为常函数g(x)=A,不难发现函数后半段/(1+9^(19(x1-x)))其实是指定了g(x)的作用域:f在x>x1的时候,值等于g。
基于这个思想,我们可以将g换为任何函数,这样我们事实上实现了分段函数。
但是,实战中在通过相同障碍时阶跃函数的复杂度已经远远超过绝对值折线函数,同时阶跃函数还面临着边界点震荡等一系列不良性质,因此这种技巧仅在少数条件下可以使用(也就是你将在第五章看到的复合扫描函数)。

4 千机巧变动若脱兔——突变函数T

TapTap
函数公式:T(x,A,x1)=-A*9^(-99(x-x1)^2)
这个函数很短,我们也就简单讲讲,事实上要实现这个效果,完全可以使用阶跃函数做到(留作思考题???),但是这个函数用的长度更短,所以最终采用了这个函数。A是突变量,这是因为在突变点x=x1,函数值为A,而x改变后,函数值迅速接近0。

4.1 起始点突变

TapTap
作为突变函数的特例,我们使用T(x,A,0)=A*-9^(-9x)来作为起始点的突变函数。
不使用x^2是因为函数的定义域(0,+∞)自动保证了指数的非正性,而在前面加上负号之后此时函数在x=0处为-A,其他为0,那么在将函数修正为f(0)=0时,其他地方就会变为A。如果没有这个符号,就会使函数突变方向错误。
什么?这就讲完了?没错hh,但是这个真的蛮有用的,所以单开了一章来讲

5 天罗地网无处可逃——扫描函数S

TapTap
扫描函数的其中一种长这样……是不是挺吓人的?
函数公式:S(x,f,g,x1,x2)=(f(x-x1)+g(x-x1)sin(8x))/(1+9^(x1-x)(x2-x)))
哦我的老天爷啊,你也妹说函数可以这么复杂啊喂!

5.1函数参数的作用特点

首先,这里的f和g并不是具体的数,而是一个函数!你需要为扫描函数设定扫描的规则,而f和g就是这两个规则,其中f被称为路径函数,而g被称为包络函数。如果你记不住这些作者起的乱七八糟的名词也没有关系,我们会在下面看到他们是怎么起作用的。
函数的后半段我们很熟悉了,这表示这个函数只会在(x1,x2)定义域上非零,所以接下来让我们看看f和g在这个区间里到底干了什么:
路径函数f(x-x1)
这个函数在(x1,x2)上没有任何其他系数,所以这部分告诉我们扫描函数会在(x1,x2)上主要沿着什么样的轨迹运动。虽然理论上这个函数可以任意复杂,但是相信算了半天折线的你算到这里的时候已经没什么力气了,所以我们通常直接赋成常函数f(x-x1)=A,如果你真的算力惊人,那么这里可以换成更加灵活的直线函数f(x-x1)=k(x-x1)+b,那么再假设你的注意力非常非常惊人,那你就随便换吧,前面的折线啊,阶跃啊都可以用。
包络函数g(x-x1)
这个函数在(x1,x2)上乘了一个系数sin(8x)(前面没说,但是在某些时候,我们会在这个系数前面加上绝对值变成abs(sin(8x)),你很快就会明白为什么),那么先让我们看看这个系数长什么样:
TapTap
事实上,这个函数的作用就是把前面的函数与x轴连成的区域全部走一遍(以及这个函数关于x轴的轴对称函数),我们先令g(x)=sin(x)和g(x)=x^2来看看具体效果:
TapTap
g(x-x1)=sin(x-x1),注意看红色的函数轮廓,它看起来就是±sin(x-x1)
TapTap
g(x)=0.01x^2,注意观察红色线,领会sin(8x)的“对称“和”扫描“性质
通过上面两个例子,我们已经了解了扫描函数参数的特点,那么我们就可以知道,包络函数g(x-x1)告诉我们扫描函数需要使用什么样的形状对整个区域进行扫描

5.2 路径函数和包络函数的常见组合及对应图像

由于扫描函数的形式过于丰富,我们在这里为读者展示一些常见的组合方式,如果读者在实战中灵光一闪,也可以自己创建一条专属的扫描函数。
等宽直线扫描函数:S(x,k,b,A,x1,x2)=(k(x-x1)+b+Asin(8x))/(1+9^(x1-x)(x2-x)))
TapTap
S=(0.2(x-15)+5+3sin(16x))/(1+9^(19(15-x)(29-x)))
其中k(x-x1)+b是函数的运动路径,k=0时就退化成水平扫描函数。沿着这条线,函数会产生一个等宽的扫描区间,对其中的敌人进行打击.
三角/梯形扫描函数:S(x,k,b,A,x1,x2)=(A+(k(x-x1)+b)abs(sin(8x)))/(1+9^(x1-x)(x2-x)))
TapTap
(3+(0.5(x-9))abs(sin(8x)))/(1+9^(19(9-x)(29-x)))
其中A是初始偏移量,b是梯形底边长度,b=0时函数变成三角形。后面直线是函数的三角/梯形斜边路径,在使用三角/梯形扫描的时候,往往只希望扫描某一边,此时使用abs限制sin是很有必要的。

6 实战的函数选取方案

从这一章开始,我们会对标PVP的实战环境,选出效率最高,同时也是上限最高的公式组合。在进行介绍之前,我想先讲讲我对PVP的理解

6.1 PVP中的”资源“、”结果“与资源分配

在公式对决中,我们的唯一资源是时间,时间有多种支出方式,但无外乎以下三种:挑选公式,计算参数,和写入函数式。而评判结果好坏的,只有是否命中,或者说,估算准确率。其中第一点是可以在赛前完成的,即通过保留上一条历史记录的方法,初始便具有一个固定模板的公式,第二点取决于玩家算力和参数的实际计算量,第三点取决于函数的长度和玩家的手速。将这些资源按照个人能力和非个人能力进行区分,我们发现这个游戏对玩家提出的要求是够快的算力,够快的手速,以及够准的估算。而可以通过学习解决的部分是函数的选用和组合。这也是为什么会有这一章,在通过本文介绍后,仍需要大量实战练习来提升自己的算力以及打字速度,当然这已经超出了本文的讨论范畴。

6.2 最好的函数和它的使用说明书

基于6.1的讨论,一个"好"函数应该具有以下性质:
1.它的参数足够好算
2.它的长度够短
当然,1比2要重要的多,但是我们还是能找到最优的函数组合:
f(x)=Z(x,k0,k1,x1,k2,x2)+T(x,A,0)+U(x,A1,x1)+U(x,A2,x2)+S(x,f,g,x1,x2)或T(x,A1,x1)
我知道这个很长也很吓人,但是不要怕,这是作为初始函数直接显示在输入区的,实战中我们只需要修改其中几个参数即可。我们先来介绍每一部分的功能:
起始点突变函数T(x,A,0):起始点右侧有障碍时使用,让自己进入可以使用折线的区域
折线函数Z:主要函数之一,用来通过复杂地形,直到可以看到敌人,为扫描函数S创造条件
阶跃函数U:用来辅助折线函数,如果遇到非常陡峭的区域,使用阶跃函数跳过这段。
扫描函数S:用来打击敌人,通过扫描函数可以扩大打击区域,方便造成多次击杀。同时也可以使用突变函数对某些刁钻点位进行打击。

6.3 从一局实战学会如何快速写出参数

在了解了各部分的用法后,让我们从一局实战开始分析这个函数母版是怎么运作的,为了方便演示,我会显示某些点的坐标
TapTap
不要在意乱七八糟的地东西www
在这个局面中,我们的路线没有必须使用阶跃函数,起始点突变的必要,因此公式简化为:
f(x)=Z(x,……)+S(x,……)
接下来让我们计算折线函数:
折线函数的参数计算方法:
  1. 首先,我们要找出第一段函数的斜率,因为点一开始的区域比较开阔,我们直接使用k=0的水平线,写下0*2x
  2. 现在前面有障碍物了,我们为了打到上面的点,选择穿过缝隙,观察到:从(2.5,0)到(5,7.5)的直线似乎可以穿过去,而我们的起始点绝对坐标约为(-8.5,1),也就是说拐点大概是x1=2.5+8.5+0.5=11.5(注意这里的0.5是考虑到初始点的纵坐标不为0,大概给出的横坐标补偿),写下3*(abs(x-11.5)+x-11.5).
  3. 现在我们遇到敌兵了,为了让我们能打到,我们使用扫描函数对这一段的敌人进攻,但首先让我们把折线变成水平的防止出现误差,写下-3*(abs(x-14.5)+x-14.5).以及(2.5+sin(8x))/(1+9^((14.5-x)(24-x))).(这里进行了估算1:上一段折线带来的Δy=3*3=9,差不多到y=10的线了。以及估算2:敌人全都落在[11,14]的y区间,使用水平扫描的时候覆盖这些区域就行,取中值12,12-10=2得到f(x)=2,取g(x)=12-11=1,得到扫描函数的样式。以及一个随便填的值24:只要扫过去了,无所谓延申多远,只要不耽误下一段函数就行)
  4. 一般来说算到这里时间已经差不多到了,但是因为这是教程,我们接着分析更复杂的:在扫描之后,紧接着有第三,第四个点要处理,我们对此叠加一个三角扫描:估算1:如果以最右面的点进行三角扫描,就一定会处理掉第三个点,那么就不需要处理第三个点了。估算2:最右面的点绝对横坐标约为24,绝对纵坐标约为-2,考虑到地形足够开阔,为了保证击杀,选点绝对值坐标为(24,-5),然后通过数格子,发现可以使用斜率为-2的点进行扫描,这样三角扫描起始点绝对值坐标变为(14,11)左右←这里14是由15让了1得到的。写下函数(-3/2(x-14-8.5))abs(sin(8x))/(1+9^(19(14+8.5-x)))(注意这里使用绝对坐标加上起始点坐标来计算相对坐标)
这就是通常的参数分析方法了,如果你足够熟练,通常可以在60s的一回合内算完3条折线+1条扫描函数,考虑到还有对手回合的60s,你可以实现更复杂的函数。

7 坐标的估算法

虽然估算准确度是因人而异的,但是使用科学的方法确实可以让你进行更准确的估读,本章介绍作者使用的估算法:5分估算法
首先,一个格子是2.5*2.5的方格,我们将其先划为2个区域:左半区和右半区,这样每个半区都只有1.25宽
TapTap
根据这个可以几乎准确的判断出一个点在整个方格的左,中或者右。
如果你认为点跨过中线了,那么直接估读1.25+格子坐标即可
如果你认为点压了网格自带的线,那么同样直接读格子坐标即可
如果你认为点没有压线,而是贴近左右边线,那么相应的采用±1的坐标进行估读
这样将点分成五种情况进行估读,虽然会有误差,但是往往在可以接受的范围内。

8 我估错了,能悔棋吗

如果你基于估算得到的函数公式并没有按照预期穿过某个缝隙,或者你的扫描函数没扫到人,可以这么调整:
1.检查斜率是否好用:如果斜率不对,需要调整斜率
2.如果函数斜率差不多是对的,尝试调整函数的起始点,这会平移这段函数,帮你实现目标
3.为扫描函数添加常数A,注意这是加在路径函数f上的,这可以帮你微调扫描位置而不改变扫描图形。
horizontal linehorizontal line

结语

至此本文已完,作为一篇终结历史,现在以及将来对这个游戏PVP讨论的帖子,至此洋洋洒洒数千字。感谢社区内提前对诸多函数性质的讨论帖,愿意耐心陪我锻炼技术的群友,以及搬运了这个游戏的作者大大。也很荣幸可以让作为读者的你看到这里,我们下个游戏见。
苏珺亭 2026.08.04
猜你想搜
公式对决 pvp入门教程
[抛砖引玉]基于绝对值+扫描函数的轨迹通解截图
[抛砖引玉]基于绝对值+扫描函数的轨迹通解
前情提要: 在掌握了分段函数之后,我们可以设计一种设计方案,既保证通过复杂路径的准确度,又保证打击时的容错,这就是基于绝对值+扫描函数的设计方案,话不多说,开始教学。 1.设计路径函数 我们使用绝对值函数最擅长处理的折线作为路径,写下函数: f(x)=0.5(A*2x+B1(abs(x-x1)+x-x1)+B2…+B3…) 为了得到正确的函数,我们需要: a.预先设计一个折线 b.找出所有拐点 c
7 赞
9 回复
一阶导数的基础应用截图
一阶导数的基础应用
简单了解导数的定义 d/dxf(x)=lim_(△x→0)(f(x0+△x)-f(x0))/△x 运用导数首先要记住一些基础函数的求导 在学习了之后,就可以开始运用导数了 一,基础,dy/dx=f(x)形式 f(x)不包含y 这种形式最简单,直接对原函数F(x)求导,忽略不必要常数 以下给出几种常用形式 d/dx(a^(x-b))=a^(x-b)*lna a为足够大的正数,b为打击点位
8 赞
5 回复
公式化打法截图
公式化打法
(注:玩家群里的大佬已经有更优秀的函数,本攻略只讲两种)这回讲讲公式化打法,在我和这个游戏的一位玩家@fw聊了一晚后,经过我的实战,总结出了更好用的公式。 先说公式: 1.y=a^(x-b) 2.y=a/(1+n^(b-x)) 第一个函数我在上一个攻略讲了,效果如图二。 这回重点讲第二个式子(效果如图一):关于这个公式的推导我写在图三上了,证明很简单,各个参数意义:a表示上升/下降的数量,n大一点
3 赞
145 回复
【新手必看教程】数格子读取目标坐标截图
【新手必看教程】数格子读取目标坐标
正文:很多新人卡在第一步:不会正确读出目标、障碍物坐标,算出的函数永远打不准! 这篇讲清楚游戏画布网格规则,学会之后可以自主读取任意点位,自己列式推导弹道。 一、游戏画布基础参数(重点!90%新人踩坑) 1. 画布坐标轴范围 X轴:-25 ~ 25 Y轴:-14.6 ~ 14.6 2. 网格关键规则:1个格子 = 2.5单位距离 不要误以为一格=1!这是绝大多数人坐标出错的根源! 3. 坐标系
6 赞
2 回复
00:24
[新手攻略]三对二防守:骗点循环截图
[新手攻略]三对二防守:骗点循环
7 赞
顶级理解分段,给看得懂的高手的高阶玩法:
0.5[2f0(x) + (f1(x-x1)-f1(0)-f0(x)+f0(x1))*(abs(x-x1)/(x-x1)+1) + (f2(x-x2)-f2(0)-f1(x-x1)+f1(x2-x1))*(abs(x-x2)/(x-x2)+1) + (f3(x-x3)-f3(0)-f2(x-x2)+f2(x3-x2))*(abs(x-x3)/(x-x3)+截图
顶级理解分段,给看得懂的高手的高阶玩法: 0.5[2f0(x) + (f1(x-x1)-f1(0)-f0(x)+f0(x1))*(abs(x-x1)/(x-x1)+1) + (f2(x-x2)-f2(0)-f1(x-x1)+f1(x2-x1))*(abs(x-x2)/(x-x2)+1) + (f3(x-x3)-f3(0)-f2(x-x2)+f2(x3-x2))*(abs(x-x3)/(x-x3)+
3 赞
6 回复
真拿大家没办法截图
真拿大家没办法
官方
17 赞
7 回复
突然就95s了截图
突然就95s了
判雷失误率好高好高,太多都不熟悉了。 最喜欢121 132 232能一眼看出来 还有一种是角112,判的特别快,剩下的都好难啊()
1 赞
01:14
【参考答案】弃子·棋子截图
【参考答案】弃子·棋子
2 赞
2 回复
01:17
《碎香集·檀》得祈诸魂截图
《碎香集·檀》得祈诸魂
通关视频,供参考 地图【地图分享】《碎香集·檀》得祈诸魂 https://www.taptap.cn/moment/750313602799372615?share_id=a9bcd912380a&utm_medium=share&utm_source=copylink
3 赞
4 回复