Вопрос Проблема с LVL

Начинающий
Статус
Оффлайн
Регистрация
12 Июл 2020
Сообщения
66
Реакции[?]
11
Поинты[?]
0
Всем привет. Такая проблема, что есть БАР система, которая ломается при достижение у юзера 13 лвл.
с ошибкой к консоли:
1670251339136.png

А вот и код:

Python:
@client.command(aliases = ["Профиль", "профиль", "profile", "Profile"])
async def __profile(ctx, member: discord.Member=None):

    if member is None:
        member = ctx.author

    experience = cursor.execute(f"SELECT exp FROM users WHERE id = {member.id}").fetchone()[0]
    level = cursor.execute(f"SELECT lvl FROM users WHERE id = {member.id}").fetchone()[0]

    current_points = experience
    target_points = remaining_points(level, experience)

    percent = int(24 * (current_points / target_points))
    bar = '█' * percent + '░' * (24 - percent)
    embed = discord.Embed(title=f"Профиль игрока", colour=discord.Colour.gold())
    for row in cursor.execute("SELECT name, cash, rep, mrep, lvl, exp FROM users WHERE id = {}".format(member.id)):
        roles = [role for role in member.roles]
        embed.add_field(name='User-ID', value=f'`{row[0]}`', inline=True)
        embed.add_field(name="Created at", value=member.created_at.strftime("%d.%m.%Y"), inline=True)
        embed.add_field(name="Joined at", value=member.joined_at.strftime("%d.%m.%Y"), inline=True)
        embed.add_field(name="Top role", value=member.top_role.mention, inline=True)
        embed.add_field(name='Money', value=f'{row[1]:.2f} :leaves:', inline=True)
        embed.add_field(name='Reputation', value=f'{row[2]} ❤ | {row[3]} 💔', inline=True)
        embed.add_field(name='LVL', value=f'{row[4]} 📈', inline=True)
        embed.add_field(name=f'{bar} EXP', value=f'{current_points} / {target_points} 🎓', inline=True)

    await ctx.send(embed = embed)

def remaining_points(lvl, experience):
    lvl_end = int(experience ** (1 / 4))

    if (lvl < lvl_end):
        return experience

    return remaining_points(lvl, experience + 6)
 
Начинающий
Статус
Оффлайн
Регистрация
5 Дек 2022
Сообщения
6
Реакции[?]
0
Поинты[?]
0
Основная проблема заключается в том, что функция remaining_points содержит бесконечный цикл. Это может привести к крашу при достижении пользователем 13 уровня. Чтобы устранить эту проблему, необходимо изменить логику функции remaining_points так, чтобы она не была рекурсивной и не порождала бесконечный цикл.


Код:
def remaining_points(lvl, experience):
    lvl_end = int(experience ** (1 / 4))

    if (lvl < lvl_end):
        return experience

    while lvl < lvl_end:
        experience += 6
        lvl_end = int(experience ** (1 / 4))

    return experience
 
Начинающий
Статус
Оффлайн
Регистрация
12 Июл 2020
Сообщения
66
Реакции[?]
11
Поинты[?]
0
Основная проблема заключается в том, что функция remaining_points содержит бесконечный цикл. Это может привести к крашу при достижении пользователем 13 уровня. Чтобы устранить эту проблему, необходимо изменить логику функции remaining_points так, чтобы она не была рекурсивной и не порождала бесконечный цикл.


Код:
def remaining_points(lvl, experience):
    lvl_end = int(experience ** (1 / 4))

    if (lvl < lvl_end):
        return experience

    while lvl < lvl_end:
        experience += 6
        lvl_end = int(experience ** (1 / 4))

    return experience
Понял. Лишь осталось понять, что делать с BAR. Так как теперь он теперь поломан
1670324783454.png
Основная проблема заключается в том, что функция remaining_points содержит бесконечный цикл. Это может привести к крашу при достижении пользователем 13 уровня. Чтобы устранить эту проблему, необходимо изменить логику функции remaining_points так, чтобы она не была рекурсивной и не порождала бесконечный цикл.


Код:
def remaining_points(lvl, experience):
    lvl_end = int(experience ** (1 / 4))

    if (lvl < lvl_end):
        return experience

    while lvl < lvl_end:
        experience += 6
        lvl_end = int(experience ** (1 / 4))

    return experience
Но чёт пока не могу понять, что именно теперь мне надо делать:с
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
5 Дек 2022
Сообщения
6
Реакции[?]
0
Поинты[?]
0
что именно теперь мне надо делать
Для того, чтобы починить бар, вам скорее всего поможет измениние логики расчета процента прогресса следующим образом:
Код:
percent = int(24 * (current_points / target_points))
bar = '█' * percent + '░' * (24 - percent)
В этом случае процент будет вычисляться на основе текущего и оставшегося количества очков опыта, а не на основе уровня пользователя.
Ну либо просто добавить что при достижении 13-ого уровня пользователем, сбрасывается xp:
Код:
def remaining_points(lvl, experience):
    if lvl == 13:
        return experience
    lvl_end = int(experience ** (1 / 4))

    if (lvl < lvl_end):
        return experience

    return remaining_points(lvl, experience + 6)
 
Начинающий
Статус
Оффлайн
Регистрация
12 Июл 2020
Сообщения
66
Реакции[?]
11
Поинты[?]
0
Для того, чтобы починить бар, вам скорее всего поможет измениние логики расчета процента прогресса следующим образом:
Код:
percent = int(24 * (current_points / target_points))
bar = '█' * percent + '░' * (24 - percent)
В этом случае процент будет вычисляться на основе текущего и оставшегося количества очков опыта, а не на основе уровня пользователя.
Ну либо просто добавить что при достижении 13-ого уровня пользователем, сбрасывается xp:
Код:
def remaining_points(lvl, experience):
    if lvl == 13:
        return experience
    lvl_end = int(experience ** (1 / 4))

    if (lvl < lvl_end):
        return experience

    return remaining_points(lvl, experience + 6)
Понял. Ну я уже пробую изменять логику
 
Сверху Снизу