我希望(不使用gem)为我的用户创建一个级别和体验点系统。
在创建他的帐户时,他以0的经验点开始0级。要达到1级,他需要额外10分,总共10分。对于3级,他将需要30个额外的分数,总共60个经验点。每增加一个等级都需要10个额外的经验点。(见下文示例)。
Level | Total XP | XP for next level|
----------------------------------------|
0 | 0 | 10 |
1 | 10 | 20 |
2 | 30 | 30 |
3 | 60 | 40 |
4 | 100 | 50 |
5 | 150 | 60 |
etc...
我希望我的用户表中有一个xp列来代表用户的全部体验。
在我看来,我想展示它的水平。但计算这一点的公式是什么呢?
让我们想象一下,我的用户总共有157个体验点。它对应于第5级,如何仅通过总经验点来计算一个水平,以及如何计算它,而不管它的总经验点是38,像369还是4393。
发布于 2022-07-28 00:46:55
我不确定这是不是你想要的。这更像是一种算法,而不是公式,但是这里有一种方法,它将根据所给出的经验返回适当的级别。想一想bar
变量,就像为了满足一个新级别而必须通过的栏,并考虑step
变量,就像在每个级别之间添加的经验量(如您在最右边的专栏中所描述的)。
def calculate_level(experience)
level = 0
bar = 10
step = 10
while experience >= bar
level += 1
step += 10
bar += step
end
level
end
示例输出:
irb> calculate_level(0) # => 0
irb> calculate_level(9) # => 0
irb> calculate_level(10) # => 1
irb> calculate_level(11) # => 1
irb> calculate_level(29) # => 1
irb> calculate_level(30) # => 2
irb> calculate_level(31) # => 2
irb> calculate_level(59) # => 2
irb> calculate_level(60) # => 3
irb> calculate_level(61) # => 3
irb> calculate_level(99) # => 3
irb> calculate_level(100) # => 4
irb> calculate_level(101) # => 4
irb> calculate_level(149) # => 4
irb> calculate_level(150) # => 5
irb> calculate_level(151) # => 5
发布于 2022-07-28 17:36:39
计算上述注释的逆值,并取floor
def calculate_level experience
(Math.sqrt(0.2 * experience + 0.25) - 0.5).floor
end
发布于 2022-07-28 11:47:23
你可以使用这样的“公式”
def calculate_level(experience)
(1..).find { |i| (experience -= 10 * i).negative? } - 1
end
每次减少10倍的经验,检查结果是否为负值。
calculate_level(0)
# => 0
calculate_level(9)
# => 0
calculate_level(10)
# => 1
calculate_level(11)
# => 1
calculate_level(29)
# => 1
calculate_level(30)
# => 2
calculate_level(31)
# => 2
calculate_level(59)
# => 2
calculate_level(60)
# => 3
calculate_level(61)
# => 3
calculate_level(99)
# => 3
calculate_level(100)
# => 4
calculate_level(101)
# => 4
calculate_level(149)
# => 4
calculate_level(150)
# => 5
calculate_level(151)
# => 5
calculate_level(209)
# => 5
calculate_level(210)
# => 6
https://stackoverflow.com/questions/73144928
复制相似问题