2014-02-03 3 views
1

Я пытаюсь создать систему уровней, основанную на точках, но это не слишком длинный код. Если вы можете помочь мне сделать это меньше, я бы очень оценил это. Чтобы описать то, что он должен делать, это получить очки и посмотреть, на каком уровне они находятся, и если они повысят уровень, он расскажет, сколько раз они имеют уровень и какой уровень они сейчас находятся. Я хочу, чтобы идти до 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

Первое, о чем вы могли подумать, это сделать сначала функцию - математическую, затем в коде, которая представляет вашу прогрессию уровня. Что-то вроде 'lvl = points/500' и ​​работа оттуда. Это должно уменьшить количество '' '' '' '' '' elif''''', – icedwater

ответ

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

Это довольно здорово. Это должно помочь мне многое. Большое спасибо. – user3230748

+0

Не могли бы вы привести пример того, как это будет работать для части lvl = sum. – user3230748

+0

@ user3230748 Что вы имеете в виду? Приведенный выше код просто работает, все, что вам нужно, это определить ваши уровни и передать количество точек для определенного пользователя в переменную 'points' ... – sashkello

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

Отредактировал ее перед вашим ответом ... Не понимаю, почему здесь имеет значение целое число. – sashkello

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) является следующий элемент в списке.

+0

Включает ли bisect с python при загрузке или мне нужно его получить? – user3230748

+1

Построен. Здесь: http://docs.python.org/2/library/bisect.html – theodox

Смежные вопросы