根据范围中的数字查找字符串

2024-04-29 12:54:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为我的游戏组创建一个等级系统,在性质上类似于Supercell在其Clash of Clans和Clash Royale android/iOS系统游戏中的奖杯系统。你知道吗

我已经弄清楚了队伍的布局,我们已经有了一个有效的积分系统。。。我现在只需要在实际的队伍中编程。你知道吗

等级的工作非常简单:个人的积分平衡落在特定的值内,与该值对应的等级就是个人的等级。我创建了一个简单的表来显示我的意思。。。下面是它的样子摘录:

Rank: Balance Range
Private: 0-500
Private I: 501-1000
Private II: 1001-1500
Private III: 1501-2500
Corporal: 2501-3000
...

这是一个简单的军衔系统布局,一直到42000点的指挥官。我的问题是:如何将秩与点值相关联,而不必像这样键入所有代码行?你知道吗

0 <= Private <= 500
501 <= PrivateI <= 1000
...

Tags: of游戏系统编程布局privateandroidios
2条回答

对Daniel Roseman的bisect解决方案的一个小小改进是使用一个2元组列表:

from bisect import bisect_right

RANKS = [
    # max balance, rank
    (500, 'Private'),
    (1000, 'Private I'),
    (1500, 'Private II'),
    (2500, 'Private III'),
    (3000, 'Corporal'),
    # ...
    (42000, 'Commander')
]

def get_rank(balance):
    index = bisect_right(RANKS, (balance, ''))
    try:
        return RANKS[index][1]
    except IndexError:
        return RANKS[-1][1]

这里的优点是更容易一目了然,并且在编辑代码以引入新的列组、调整限制等时不容易出错

当提供的点数余额高于RANKS(在您的注释中指定)中的任何值时,它也返回最高等级,而不是引发异常。你知道吗

示例:

>>> for n in range(0,42001,500):
...     print("%5d  %s" % (n, get_rank(n)))
...     print("%5d  %s" % (n + 1, get_rank(n + 1)))
... 
    0  Private
    1  Private
  500  Private
  501  Private I
 1000  Private I
 1001  Private II
 1500  Private II
 1501  Private III
 2000  Private III
 2001  Private III
 2500  Private III
 2501  Corporal
 3000  Corporal
 # ...
 42000  Commander
 42001  Commander

你可以用bisect来做这个。你知道吗

from bisect import bisect
def get_rank(score):
    points = [500, 1000, 1500, 2500, 3000]
    ranks = ["Private", "Private I", "Private II", "Private III", "Corporal"]
    div = bisect(points, score)
    return ranks[div]

相关问题 更多 >