Discord Python Bot:升级系统

时间:2020-01-28 03:45:42

标签: python bots discord

因此,我在Google上进行了一些其他搜索,并观看了https://www.youtube.com/watch?v=pKkrCHnun0M这段有关为我的机器人制作关卡系统的视频。基本上,机器人(IN PYTHON)就像一个冒险坦克游戏;游戏会给您提供一辆坦克的起点,让您选择地图,移动到地图的不同区域,然后使用rng来确定是否有敌方坦克。每个被摧毁的敌方坦克会给您10 xp点。现在,在上述视频中,他添加了xp,他使用了消息,并在玩家进入服务器后开始了玩家的统计资料。

现在,我希望我的用户在输入命令'&stats'后开始其个人资料。在视频中,他使用json。我以前从未使用过json,所以自然很困惑,但是我遵循了视频的指导。

我收到此错误:

Ignoring exception in on_message
Traceback (most recent call last):  File "/home/runner/.local/share/virtualenvs/python3/lib/python3.
7/site-packages/discord/client.py", line 270, in _run_event
    await coro(*args, **kwargs)
  File "main.py", line 72, in on_message
    await level_up(users, author, message.channel)  File "main.py", line 435, in level_up
    lvl_end = float('experience ** 1/2')
ValueError: could not convert string to float: 'experience ** 1/2'

在测试服务器上输入任何消息后。但是,我担心这并不重要。 我要在repl.it中构建这个机器人,在这一点上我应该提到, 因此,我想弄清楚如何根据命令启动json文件,并且我还想通过销毁敌人将xp添加到玩家的个人资料中(以及杀死人数,但这没什么大不了)。我也需要水平。目前,我所有这些代码都是

@client.event
async def on_message(message):
  with open('users.json', 'r') as f:
    users = json.load(f)

    await update_data(users, member)



  with open("users.json", 'w') as f:
    json.dump(users, f)
@client.event
async def on_message(message):
  author = message.author

  with open('users.json', 'r') as f:
    users = json.load(f)

    await update_data(users, author)
    await add_experience(users, author, 5)
    await level_up(users, author, message.channel)
  with open("users.json", 'w') as f:
    json.dump(users, f)


  if message.content.startswith("&stats"):
    global Pxp
    global KA
    Pxp = 0
    KA = 0
    await message.channel.send("XP: " + str(Pxp) + ". Enemy Tanks Killed: " + str(KA) + ".")
  if message.content.startswith('&start'):
    await message.channel.send('Choose vehicle: VT-4, M1 Abrams, T-18 Armata. 1, 2, 3.')

并在底部

async def update_data(users, user):
  if not user.id in users:
    users[user.id] = {}
    users[user.id]['experience'] = 0
    users[user.id]['level'] = 1
async def add_experience(users, user, exp):
  users[user.id]['experience'] += exp

async def level_up(users, user, channel):
  experience = users[user.id]['experience']
  lvl_start = users[user.id]['level']
  lvl_end = float('experience ** 1/2')

  if level_start < lvl_end:
    await message.channel.send('{} leveled up to level {}'.format(user.mention, lvl_end))
    users[user.id]['level'] = lvl_end

请注意,最后一个代码段会生成先前发布的错误。

这也是我的第一篇文章,我不知道我应该具体到哪儿,请保持友善:^)很抱歉,这么长的时间,如果全都错了,就告诉我。

感谢您的帮助。如果您想查看更多代码,只需询问。

1 个答案:

答案 0 :(得分:0)

我已经尽力了,我已经建立了一个关卡系统!它是特定于服务器的,显示了进入下一级别所需的xp数量。

@client.event
async def on_message(message):
    if not message.author.bot:
        print('function load')
        with open('level.json','r') as f:
            users = json.load(f)
            print('file load')
        await update_data(users, message.author,message.guild)
        await add_experience(users, message.author, 4, message.guild)
        await level_up(users, message.author,message.channel, message.guild)

        with open('level.json','w') as f:
            json.dump(users, f)
    await client.process_commands(message)




async def update_data(users, user,server):
    if not str(server.id) in users:
        users[str(server.id)] = {}
        if not str(user.id) in users[str(server.id)]:
            users[str(server.id)][str(user.id)] = {}
            users[str(server.id)][str(user.id)]['experience'] = 0
            users[str(server.id)][str(user.id)]['level'] = 1
    elif not str(user.id) in users[str(server.id)]:
            users[str(server.id)][str(user.id)] = {}
            users[str(server.id)][str(user.id)]['experience'] = 0
            users[str(server.id)][str(user.id)]['level'] = 1

async def add_experience(users, user, exp, server):
  users[str(user.guild.id)][str(user.id)]['experience'] += exp

async def level_up(users, user, channel, server):
  experience = users[str(user.guild.id)][str(user.id)]['experience']
  lvl_start = users[str(user.guild.id)][str(user.id)]['level']
  lvl_end = int(experience ** (1/4))
  
  if lvl_start < lvl_end:
      await channel.send('{} has leveled up to Level {}'.format(user.mention, lvl_end))
      users[str(user.guild.id)][str(user.id)]['level'] = lvl_end


@client.command(aliases = ['rank','lvl'])
async def level(ctx,member: discord.Member = None):

    if not member:
        user = ctx.message.author
        with open('level.json','r') as f:
        users = json.load(f)
        lvl = users[str(ctx.guild.id)][str(user.id)]['level']
        exp = users[str(ctx.guild.id)][str(user.id)]['experience']

        embed = discord.Embed(title = 'Level {}'.format(lvl), description = f"{exp} XP " ,color = discord.Color.green())
        embed.set_author(name = ctx.author, icon_url = ctx.author.avatar_url)
        await ctx.send(embed = embed)
    else:
      with open('level.json','r') as f:
          users = json.load(f)
      lvl = users[str(ctx.guild.id)][str(member.id)]['level']
      exp = users[str(ctx.guild.id)][str(member.id)]['experience']
      embed = discord.Embed(title = 'Level {}'.format(lvl), description = f"{exp} XP" ,color = discord.Color.green())
      embed.set_author(name = member, icon_url = member.avatar_url)

      await ctx.send(embed = embed)