首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不和谐的Python机器人:升级系统

不和谐的Python机器人:升级系统
EN

Stack Overflow用户
提问于 2020-01-28 11:45:42
回答 1查看 1.2K关注 0票数 0

所以我用谷歌搜索了几个不同的搜索,我看了这个视频https://www.youtube.com/watch?v=pKkrCHnun0M,关于为我的机器人制作一个关卡系统。基本上,机器人(在PYTHON中)就像一个冒险坦克游戏;游戏给你一辆坦克开始,允许你选择一张地图,移动到地图的不同部分,并将使用rng来决定是否有敌人的坦克。每辆被摧毁的敌人坦克会给你10XP点。现在,在前面提到的视频中,为了添加xp,他使用了消息,并在玩家进入服务器时开始了他们的统计资料。

现在,我希望我的用户在输入命令'&stats‘时开始他的配置文件。在视频中,他使用了json。我以前从来没有使用过json,所以我很自然地感到困惑,但我遵循了视频的指导。

我得到了这个错误:

代码语言:javascript
复制
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添加到玩家的个人资料(以及杀伤量,但这并不重要)。我也需要关卡。目前,我的所有这些东西的代码是

代码语言:javascript
复制
@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.')

在底部,

代码语言:javascript
复制
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

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

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

任何帮助都是非常感谢的。如果你想看更多的代码,尽管问。

EN

回答 1

Stack Overflow用户

发布于 2020-12-06 13:08:28

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

代码语言:javascript
复制
@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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59941851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档