【问题标题】:Discord Python Bot: Leveling Up SystemDiscord Python Bot:升级系统
【发布时间】:2020-05-13 11:04:08
【问题描述】:

所以我在谷歌上搜索了几个不同的搜索,并观看了这个视频https://www.youtube.com/watch?v=pKkrCHnun0M,关于为我的机器人制作关卡系统。基本上,机器人(IN PYTHON)就像一个冒险坦克游戏;游戏给你一个坦克开始,允许你选择一张地图,移动到地图的不同区域,并会使用 rng 来判断是否有敌方坦克。每个被摧毁的敌方坦克会给你 10 点经验值。现在,在前面提到的视频中,为了添加 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

请注意,最后一个 sn-p 会生成之前发布的错误。

这也是我的第一篇文章,我不知道我应该说得有多具体,请多多关照 :^) 很抱歉这么长,如果都错了,请告诉我。

感谢任何帮助。如果您想查看更多代码,请询问。

【问题讨论】:

    标签: python bots discord


    【解决方案1】:

    我已经尽力了,我已经做了一个关卡系统!它是特定于服务器的,并显示了您需要获得的经验值才能达到下一个级别。

    @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)
    

    【讨论】:

      猜你喜欢
      • 2018-03-12
      • 2020-07-31
      • 2021-03-25
      • 2019-11-11
      • 1970-01-01
      • 2021-07-18
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多