2016-11-23 65 views
2

我正在尝试为我的游戏组创建一个排名系统,类似于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 
... 

所以这里的简单的排名系统布局,它会一路上涨指挥官以42,000rpm点。我的问题是:我如何将Rank与点值相关联,而不必像这样输入所有代码行?

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

回答

1

您可以使用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] 
+0

那岂不是更有用的添加此作为一个答案给你解开了重复的问题吗? – TigerhawkT3

+0

对不起,我不是故意这样做;但现在我找不到你用过的模糊...... –

+0

你可以在右侧边栏(右上角)的相关链接列表中找到它,或者在[这个问题的修订页面](http:///stackoverflow.com/posts/40774655/revisions)。 – TigerhawkT3

0

略有改善丹尼尔·罗斯曼的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占(如您的评论指定)最高等级的时候,而不是raisi容易出错例外。

例子:

>>> 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 
+0

这是我的下一个问题:我们的排名系统没有高峰点平衡;它在指挥官中排名最高,但指挥官实际上被设置为“指挥官<= 42,000”。那么这是否会影响您在最后一段代码中设置的异常处理程序? – PhoenixDeFalco

+0

@PhoenixDeFalco你可以在'except'子句中做任何你喜欢的事情;我已经更新了我的答案,以返回最高排名而不是提出例外。 –

+0

我试过你输入的代码,并得到:'Traceback(最近调用最后一个): 文件“”,第2行, print(“%5d%s”%(n,get_rank(n) )) NameError:名称'get_rank'未定义' 我该如何解决这个问题? – PhoenixDeFalco