2016-11-23 58 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