赞 | 342 |
VIP | 10 |
好人卡 | 8 |
积分 | 262 |
经验 | 235776 |
最后登录 | 2024-9-23 |
在线时间 | 2387 小时 |
Lv5.捕梦者 (版主) 遠航の猫咪
- 梦石
- 3
- 星屑
- 23191
- 在线时间
- 2387 小时
- 注册时间
- 2005-10-15
- 帖子
- 1166
|
本帖最后由 SailCat 于 2020-4-21 02:15 编辑
从建模的角度上讲,最直接的办法是把表做死,然后直接查表
当然,“表”可以用公式来表示。
比方说:
让角色从1-99级(或敏捷从1-999),逐渐从100%打1击变成100%打4击
这其实是期望伤害从100%变成400%的意思
那么可得你的期望伤害公式=100+等级*3%(这个变化其实是103-397,但就按这个来也行)
另外,这个是线性变化,以下讨论两种情况
1. 全程线性变化的情况
2元1次方程组直接可以解,剩下的就是怎么实现
比如:在1 2 3 4连击的判定下,怎么做103%的伤害
很简单:97%出1击,3%出2击,这平均伤害就是103%
也就是说,每减少3%1击判定率,增加3%2击判定率,就可以提升伤害3%
当然,你也可以减少2%的1击判定率,增加1%的2击判定和1%的3击判定,这也提升伤害3%
那么
设自变量范围是[1,99]
那么首先,每级减少3%1击判定,增加3%2击判定
至11级时,判定从[97,3,0,0]变成[67,33,0,0]
这时1击的判定率已经是2击的2倍了,就改用:每级减2%的1击判定,增加1%的2击判定和1%的3击判定
至22级时,判定变为[45,44,11,0]
这时1击的判定率已经和2击相同,此时要改用第三个改法:每级减1%的1击和1%的2击判定,增加2%的3击判定(对,这也是+3%)
至33级时,判定变为[34,33,33,0]
这时,改为每级-1%2击判定和3击判定,+2%4击判定
至41级时,为[34,25,25,16],此时改为每击-1%1击,+1%4击。
至50级时,为[25,25,25,25]
从50-99级,按上面的逆向操作就可以了。至99级为[0,0,3,97]
def rand_hit(n) m = n > 50 ? 100 - n : n case m when 1..11 x = [100 - 3*m, 3*m, 0, 0] when 12..22 x = [89-2*m, 22+m, m-11, 0] when 23..33 x = [57-m, 66-m, m, 0] when 34..41 x = [34, 66-m, 66-m, m*2-66] when 42..50 x = [75-m, 25, 25, m-25] end x.reverse! if n != m y = [x[0], x[0]+x[1], x[0]+x[1]+x[2], x[0]+x[1]+x[2]+x[3]] case rand(100) when 0...y[0] 1 when y[0]...y[1] 2 when y[1]...y[2] 3 else 4 end end
def rand_hit(n)
m = n > 50 ? 100 - n : n
case m
when 1..11
x = [100 - 3*m, 3*m, 0, 0]
when 12..22
x = [89-2*m, 22+m, m-11, 0]
when 23..33
x = [57-m, 66-m, m, 0]
when 34..41
x = [34, 66-m, 66-m, m*2-66]
when 42..50
x = [75-m, 25, 25, m-25]
end
x.reverse! if n != m
y = [x[0], x[0]+x[1], x[0]+x[1]+x[2], x[0]+x[1]+x[2]+x[3]]
case rand(100)
when 0...y[0]
1
when y[0]...y[1]
2
when y[1]...y[2]
3
else
4
end
end
2. 非全程线性变化的情况(比如你提问的情况)
非全程线性无非就是划分阶段,你先提出你的预期,比如10级内都是1击,30级以内只有2击,50级以内只有3击,51级以上才有4击
然后在每一个阶段内部,变化依然是线性的
例如,你设定好
1级[100,0,0,0]
10级[100,0,0,0]
11级[80,20,0,0]
30级[50,50,0,0]
31级[50,40,10,0]
50级[40,30,30,0]
51级[40,30,20,10]
99级[10,20,30,40]
然后其他级别用上述方法在中间插值就可以了,例如15级[71,29,0,0],43级[43,33,24,0],74级[28,26,24,22]等等
(插值代码略)
3. 指数衰减的判定,这个很简单,直接递归,写成每一击都有等级%机率连击一次即可,然后把最终结果限定为最多判3次(最多4击),这样判定的曲线大概是这样
1级[99,1,0,0]
10级[90,9,1,0]
20级[80,15,4,1]
30级[70,21,7,2]
40级[60,24,10,6]
50级[50,25,13,12]
60级[40,24,14,22]
70级[30,21,15,34]
80级[20,16,13,51]
90级[10,9,8,72]
99级[1,1,1,97]
指数衰减最大的问题,当人工卡次数时,曲线变化非常不平滑,特别是当触发率超过非触发率之后,大量机率堆在第4级别。但1-3级别依然是逐次下降机率,与常识不符。
def rand_hit(n) x = 1 3.times do rand(100) < n ? x += 1 : return x end x end
def rand_hit(n)
x = 1
3.times do
rand(100) < n ? x += 1 : return x
end
x
end
4. 独立判定。即:除第1击外,多判定3次,每一次的触发机率是等级%。但不管是几级都总是判定3次,这样判定的曲线大概是这样
1级[97,3,0,0]
10级[73,25,2,0]
30级[34,44,19,3]
50级[13,37,37,13]
70级[3,19,44,34]
90级[0,2,25,73]
99级[0,0,3,97]
相对来说,最后一个的判定,是最接近人的心理预期的情况。
def rand_hit(n) x = 1 3.times do x += 1 if rand(100) < n end x end
def rand_hit(n)
x = 1
3.times do
x += 1 if rand(100) < n
end
x
end
|
评分
-
查看全部评分
|