带帽的简单递减收益


19

问题

玩家每等级可获得5分,最高等级为80,最高得分为400。要分配给5个统计信息,并且对可以添加多少统计信息没有最大限制。

  • 强度
  • 耐力
  • 情报
  • 敏捷
  • 运气-获得暴击率和暴击伤害

我想对一个运气说一个递减的回报方程式。对于暴击机会,我不希望玩家能够击中100%暴击机会。

随着增长的逐渐降低,每增加一个点将达到0,将达到一个上限。

例如,如果我希望玩家拥有的最大暴击几率是40%,那么运气每提高一点,暴击几率就会越来越小,直到暴击几率达到40%左右。通过这1个运气将给出非常非常小的数量。

有什么办法吗?谢谢您的帮助,不胜感激!



@BlueRaja我认为这不是重复的。这个问题通常与递减函数有关,即与损害计算有关。碰巧的是,关于这一问题的答案大多讨论了递减收益函数,但我认为问题仍然明显不同。
Anko 2015年

Answers:


30

您想从渐近函数开始。也就是说,从一个数字开始a并接近另一个数字b,但从未真正达到这个数字。如果a = 0和,这将是最简单的b = 1。您将使用此方程式,输入角色拥有的统计点数(运气点),并获得实际的统计值(暴击率)作为输出。

一个非常简单的例子是y = x / (x + n)其中n一些正常数。这x是您的输入,您在其中输入统计点数,y在输出中,您在此获取最终统计值。

n = 5查看其外观:

[0,100]中x的y = x /(x + 5)图

当您投入时,x = 0您会得到y = 0,但无论x您投入多少,y不会达到1.完美。

现在,您可以根据自己的意愿进行调整。您可以乘以比例因子以将“上限”设置为所需的任何值。y = a * x / (x + 5)。如果您希望上限为40%,请乘以.4。y = .4 * x / (x + n)。现在,当您输入时xy会增加,但永远不会达到.4。

调整n以设置方程式加速的快慢程度。n = 100增长速度将比n = 5

[0,400]中x的y = x /(x + 100)图

n如果您知道想要在特定数量的统计点达到的统计值,则可以求解此方程式。假设角色在100点运气下应该有35%暴击几率。解决.35 = .4 * 100 / (100 + n)n产量n = 14.29

这些数字也不必是原始常量。也许其他统计数据可以用来计算的值n。也许某些字符具有不同n的,所以它们在“首选”统计中的缩放比例更好。

如果您希望曲线的形状不同或更复杂,也可以使用许多其他渐近函数示例。我将让您根据需要进行探索。


3
我最喜欢的曲线是指数曲线。只需将每个级别的剩余池比例固定即可。
John Dvorak

@JanDvorak的完整性,您可以举个例子吗?有很多指数曲线,读者可能不知道如何仅根据先前的评论来应用您的建议。
亚当

这是一个很好的起点,并且对数学进行了很好的解释,但是请记住,您不能只选择看起来不错的函数。这个问题需要仔细考虑和大量调整。例如,这种方法的缺点之一是不鼓励专业化。如果所有五个统计指标都同样可行,则花费在最不发达的一项上的价值最高(而最发达的一项则最少)。理想的构建方式是平均分配点数,这使得玩家在选择如何花费它们上的兴趣减少了。
马克·托马斯

@MarcksThomas假定属性之间没有协同作用,或者在战术上隔离属性并与之“取胜”的能力。举个例子,想象一下一个惊人的弓箭手,他将敏捷提高到敌人到达敌人之前就死亡了:即使敏捷的有效性降低了,所选择的策略也使得其他属性变得不重要。另一种涉及力量的策略可能同样有效,因此属性具有“相等的价值”,但策略通常意味着专业化占主导地位。如果您的属性系统也奖励专业化,那么游戏会有所不同。
Yakk

我称之为“从袋子里掏出石头”系统。该值P = x/(x+n)是给定一个装有n个黑色石头和x个白色石头的袋子时,您从袋子盲孔中抽出一块白色石头的概率。您可以采取的一种方法是,将糖果设置为X =您的运气,而N =他们的运气。如果您和敌人一样幸运,那么您的暴击几率将是50%。如果您希望基本机会是10%,那么我们X =您的运气,N = 9x他们的运气。
Yakk

10

一个好的基数将是类似的函数arctan,因为它穿过原点并表现出水平渐近线。

Arctan

40 / (pi/2)80/pi您想要的限制缩放比例。然后进行变换luck以获得所需的曲线陡度。

critical = 80/pi * arctan(f(luck))

8

我非常喜欢Souls游戏解决这个问题的方式。与其像建议的那样使每个统计量基于连续函数给出奖金,不如以分段线性函数给出奖金。

我不记得确切的数字了,但是函数遵循以下内容(每个统计信息都有自己的常量)

{0 <= x <20:y = 4x,20 <= x <30:y = 3x + 20,30 <= x <40:y = 2x + 50,40 <= x <60:y = 1x + 90 ,60 <= x:y = 0.5x + 120}

情节

这种方法为设计者和玩家提供了很多好处。设计师可以从中受益,因为您可以相当轻松地微调一项技能的每点确切收益,而玩家也可以从中受益,因为他们确切地知道自己会从各个级别获得多少收益。

对于连续函数,由于测量混叠,某些级别可能会带来一些好处,但其收益并未体现在数字中。当然,最后一个水平使您的XYZ奖金增加了0.9,但是由于实际值从23.52变为24.42,并且您在显示该数字之前对其进行了四舍五入,因此玩家没有意识到有什么改变。

从UX的角度来看,我绝对建议使用分段线性函数。但是,使用连续函数可以更容易地在以后进行下调,因为玩家不会像回合常数那样依赖。


1
不需要太多数学运算且易于更改的曲线的近似值。我喜欢。:)
Casey Kuball 2015年

>在显示数字之前先四舍五入 =>补偿的一种方法是ceil增加之前增加数值,并且仅允许整数统计水平。或floor然后x <= 0: x = 1避免不小心越过软帽。
鲍勃

1
虽然您仍然可以执行分段功能,但是它并没有达到您在此处寻找的效果。运气值是一个百分比,最高为400。这意味着,即使在具有100%运气的线性函数中,每个额定值都必须导致值不到1%的增益。技巧只是显示足够的小数点,以使y(399)与y(400)不同。您的函数通过使y变得非常大来做同样的事情,因此,增加总是可以积分的。在x = 40时,y大于x值的4倍。
MichaelS 2015年

@MichaelS我只是在举例说明Dark Souls中使用的函数类型。需要根据所应用的情况对它进行不同的平衡,但是我的观点仍然是,与反正切曲线或圆锥形截面相比,玩家将更容易理解分段线性函数的效果。
卡斯莱2015年

3

Jan Dvorak在评论中指出了指数函数。我会在这里解释。

请注意,指数(和trig)运算的计算量甚至比平方根运算要大得多,而平方根运算本身却比基本数学差得多,因此,如果您每秒要进行多次计算,那么使用亚当的方法可能会更好。 。如果您只是在播放器水平,更换设备等时计算值,则速度并不重要,因此请使用能提供最佳曲线的任何东西。

的指数函数是一些碱,,一些功率,Xy=B^x。数学家通常使用e的底数(〜= 2.718),但没有理由不愿意使用2或10。

y=e^x 看起来像这样: y = e ^ x

请注意,左侧正渐渐地移动到0。因此,我们可以通过y=e^(-来翻转x轴x),但它仍从1下降到0,我们希望它上升。因此,我们可以使用y=-使其沿y轴翻转e^(-x)。现在它从-1升到0。我们可以加1得到y=1- e^(-x),它从0升到1。

y = 1-e ^(-x)

从这里开始,只需要垂直和水平缩放即可。我们可以将整个事物乘以某个值,我们称其为A,它设置了渐近极限。然后,我们可以将x乘以变化率值k来调整它在极限上的闭合速度。

这给了我们的最终方程y=A*(1 - e^(-k*x))。使用的值k=0.012A=0.5,我们可以将限制设置为50%,让它变得相当接近极限左右x=400

y = 0.5 *(1-e ^(-0.012 * k))

现在,您可以对此进行一些调整。我所做的一项调整是将更改为A=0.5041,因此,如果我们舍入到2位小数的百分比(例如32.23%),则y(399)= 49.99%和y(400)= 50.00%。从y(347)开始,在一些地方需要两点才能获得0.01%的变化。但是,最后一个可能的点仍然给出了(几乎)切实的好处,甚至达到了50%。

或者,我们可以调整该k值以产生类似的效果。在时k=0.02305,该值四舍五入为的49.99%y=399和的50.00%y=400。但是,这有一个图是问题末浅-它需要48分得到的百分比,去年的百分位(从y(352)=49.99%y(399)=49.99%y(400)=50.00%)和最后1%的爆击几率花费高达230点(从y(170)=49.01%y(400)=50.00%)这可能会降低收益率。

如果需要,可以同时调整A和k,以便以较慢的速率减小到较高的极限,以在线性衰减和指数衰减之间进行调整。这样做y=0.6*(1-e^(-0.00447*x)),您最终得到以下结果: y = 0.6 *(1-e ^(-0.00447 * x))

请注意,曲线继续超过50%,但由于硬限制等级为400,因此玩家无法通过该点(并且如果他们设法通过该点,则硬限制仍为60%暴击)。使用此等式,您可以使用1个小数位,并且仍然会每2到3点看到收益,最后一个刻度从y(399)=49.9%y(400)=50.0%

从数学上讲,较早的方程式可能看起来更好,因为它们实际上已接近50%,但我个人认为每两点增加0.1%的感觉要好于0.01%。即使使用A=0.05041k=0.012,从y(298)=49.00%到仍然需要102点y(400)=50.00%。25%的点数花费在2%的暴击上,可能太少了。60%的方程式只为最后一个百分点取20分(仍然比第一个百分点所需的4分高5倍)。

使用这最后几个方程式,我只是将这些方程式插入电子表格中,并手动调整了值,直到看起来不错为止。如果您想使用其他上限,则必须执行类似的操作。


2
关于数学运算的相对速度的注释是正确的,但可能与玩家统计数据无关。现代游戏中的瓶颈通常是每帧处理数千个项目(例如,物理和渲染)的东西。相对于此,可能每帧运行几十次的游戏脚本不太容易出现,并且通常无论如何都充满了高速缓存未命中,这将使CPU有大量的时间花时间来做您喜欢的数学运算。tl; dr:除非您正在编写需要大量运行的着色器或其他东西,否则不要为避免昂贵的操作而感到压力
DMGregory

-1

对于一个非常简单的解决方案,平方根x 2

400的平方根(最大可能值)是20,20 * 2 = 40。


为什么要投反对票?它解决了所问的问题,也很简单。
卡特伍德(Catwood),2015年

1
我不是拒绝投票的人,但这可能是因为您的答案过于具体,并且没有提供尚未提供的任何信息(平方根只是的幂次幂1/2),并且您没有解释为什么有用的原因。
卡斯莱2015年

我没有投票,但是我认为这不是一个很好的答案,因为它不是很灵活-平方根不是渐近的,所以如果最大水平发生变化,则需要更改公式以保持最大统计相同。
BlueRaja-Danny Pflughoeft
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.