我正在尝试建立一个基于点的关卡系统,但它有点太长了代码。如果你能帮我把它变小,我真的很感激它。要描述它想要做的是得到积分并看看它们处于什么水平,如果它们升级,它将告诉它们水平的次数和它们现在的水平。我希望它升到100并且在升高时更加难以升级..这是我到目前为止所拥有的:
def pointLevel(name):
point = Point.dPoint[name]
points, lvl = int(point), int(lvl)
if points < 500:
lvl = 1
elif points < 1500:
lvl = 2
elif points < 2500:
lvl = 3
elif points < 5000:
lvl = 4
elif points < 10000:
lvl = 5
elif points < 15000:
lvl = 6
elif points < 20000:
lvl = 7
elif points < 30000:
lvl = 8
elif points < 50000:
lvl = 9
elif points < 100000:
lvl = 10
elif points < 250000:
lvl = 11
notes.store("levels", user.name, "You have leveled up. You are now level "+str(lvl)+"!", int(time.time()))
答案 0 :(得分:5)
只是缩短代码,您可以将级别保存为列表,然后通过将点数与级别分割进行比较来计算用户已经过多少级别:
levels = [100, 200, 300, 400, 500]
lvl = len([x for x in levels if points > x])
我不担心这里的速度,但使用发电机可以被认为是一种更好的做法(或者不是,在这种情况下是品味问题):
lvl = sum(1 for x in levels if points > x)
答案 1 :(得分:2)
bisect模块适用于查找“此列表中的哪个项目位于正确的范围内”。它返回您的值所属范围的上端的索引号。例如
import bisect
exp_level = [100,200,300,400,500] # bisect lists need to be sorted
level = bisect.bisect(exp_level, 127) # = 1
在该示例中,bisect.bisect将返回“1”,因为索引1(即200)是列表中的下一个项目。
答案 2 :(得分:1)
如果你发现自己一遍又一遍地重复相同/相似的代码 两次以上,那么你需要使用循环是一个好兆头:
xp_levels = [500, 1500, 2500, 5000, 10000, 15000, 20000, 30000, 50000, 100000, 250000]
def pointLevel(name):
points = int(Point.dPoint[name])
level = -1
for index, xp in enumerate(xp_levels):
if points < xp:
level = index
break
答案 3 :(得分:-1)
要详细说明@sashkello,这里有一个函数,它将点作为整数接收,并吐出水平:
def getLevel(points):
levels=[500,1500,2500,5000,10000,15000,20000,30000,50000,100000,250000]
lvl = len([x for x in levels if points > x])
return lvl