首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据点找到和更新相应的级别?

如何根据点找到和更新相应的级别?
EN

Stack Overflow用户
提问于 2019-08-12 10:41:41
回答 1查看 76关注 0票数 0

我正在创建一个rails应用程序,就像一个游戏。所以它有积分和等级。例如:要成为第一级,用户必须至少获得100分,而对于第二级,用户必须达到二级,用户必须收集200个积分。水平差异在每10个层次之后变化,即每个层次之间的差异总是在10个层次之后变化的。我的意思是,第一级和第二级的差值是100,第11和12级的差是150,依此类推。没有级别的上限。

现在我的问题是,假设一个用户的总分是3150,并且刚刚更新到3155。找到当前级别并在需要时更新它的最佳解决方案是什么?

我可以用will循环得到一个解,然后再在里面循环,这样就可以得到O(n^2)的结果。我需要更好的东西。

我认为这段代码有效,但我不确定这是否是最好的方法

代码语言:javascript
复制
def get_level(points)
  diff = 100
  sum = 0
  level = -1
  current_level = 0

  while level.negative?
    10.times do |i|
      current_level += 1
      sum += diff

      if points > sum
        next
      elsif points <= sum
        level = current_level
        break
      end
    end  
    diff += 50
  end
  puts level
end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-12 18:04:52

我编写了一个get_points函数(应该不难)。然后在此get_level函数的基础上,通过求解二次方程求出high值,然后计算low

如果你有什么问题,告诉我。

检查输出这里

代码语言:javascript
复制
#!/usr/bin/env python3

import math


def get_points(level):
    high = (level + 1) // 10
    low = (level + 1) % 10
    high_point = 250 * high * high + 750 * high  # (3 + high) * high // 2 * 500
    low_point = (100 + 50 * high) * low
    return low_point + high_point


def get_level(points):
    # quadratic equation
    a = 250
    b = 750
    c = -points
    d = b * b - 4 * a * c
    x = (-b + math.sqrt(d)) / (2 * a)
    high = int(x)
    remainder = points - (250 * high * high + 750 * high)
    low = remainder // (100 + 50 * high)
    level = high * 10 + low
    return level


def main():
    for l in range(0, 40):
        print(f'{l:3d} {get_points(l - 1):5d}..{get_points(l) - 1}')

    for level, (l, r) in (
        (1, (100, 199)),
        (2, (200, 299)),
        (9, (900, 999)),
        (10, (1000, 1149)),
        (11, (1150, 1299)),
        (19, (2350, 2499)),
        (20, (2500, 2699)),
    ):
        for p in range(l, r + 1):  # for in [l, r]
            assert get_level(p) == level, f'{p} {l}'


if __name__ == '__main__':
    main()

为什么要设置a=250和b= 750的值?你能给我解释一下吗?

让我们每隔10个级别写出一次,并说明各点之间的差异:

代码语言:javascript
复制
lvl - pnt  (+delta)
 10 - 1000 (+1000 = +100 * 10)
 20 - 2500 (+1500 = +150 * 10)
 30 - 4500 (+2000 = +200 * 10)
 40 - 7000 (+2500 = +250 * 10)

除以500 (10 levels * 50 difference changes),并收到从2开始的算术级数:

代码语言:javascript
复制
 10 - 2  (+2)
 20 - 5  (+3)
 30 - 9  (+4)
 40 - 14 (+5)

使用算术级数获取积分公式表示level = k * 10值等于:

代码语言:javascript
复制
sum(x for x in 2..k+1) * 500 =
(2 + k + 1) * k / 2 * 500 = 
(3 + k) * k * 250 = 
250 * k * k + 750 * k

现在我们有了points,并且希望找到最大的high,例如point >= 250 * high^2 + 750 * high,即250 * high^2 + 750 * high - points <= 0.值a = 250是正的,抛物线的分支是向上的。现在我们找到了二次方程 250 * high^2 + 750 * high - points = 0的解决方案,并放弃了真正的部分(在python脚本中是high = int(x) )。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57459713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档