点数没有变化...请修复

The Number Of Points Isnt Changing... Please Fix

我想做一个快速射击类型的问题,基本上“j”是点的变量,我希望它每 0.5 秒 change/decrease(并检查消息)...问题是无论我尝试多晚,我都会得到 1000 分。我也是新人。 (顺便说一句,英语不好)

代码:

    def check(m):
        return m.author == message.author and m.channel
    mn = randint(5, 15)
    mn1 = randint(5, 10)
    mz = mn * mn1
    membed = discord.Embed(
        title="Here's The Question", 
        description=str(mn) + " * " + str(mn1) + ''' Type Your Answer Below.. ''',
        url=None,
        color=discord.Color.blue())
    mzz = await message.send(embed=membed)
    j = 1100
    for i in range(0, 5):
        sleep(0.5)
        j = j - 100
        gt = await bot.wait_for('message', check=check)
        if int(gt.content) == int(mz):
            await message.send(f'Its Right.. You Got **{j}** Points')
        else:
            await message.send(f'Its Wrong.. The Answer Is **{j}**')

请帮忙...

问题是因为您误解了 await 的工作原理。

await foo() 使您的程序休眠 直到 foo() returns 一个值。

当您键入 await bot.wait_for() 时,您说的是:

  1. 睡到 bot.wait_for() returns 一个值
  2. bot.wait_for()只有returns一个值它收到一条消息时。

您的程序的完整流程是:

  1. 您进入第一个循环i = 0j 设置为 1000。
  2. 你会一直睡到收到一条消息。因为你可以在未来的任何时间(比如十秒或十分钟或十五小时等)收到消息,所以你永远不会进入第二个循环i = 1。基本上,您的程序此时已冻结,直到有人向您发送消息。

这里的解决方案是让你的机器人 超时 等待消息,这样它就可以继续 i 的下一个值。超时告诉你的机器人在继续你的程序之前只休眠一段指定的时间。方便的是,wait_for命令提供了一个timeout参数:

j = 1100
for i in range(0, 5):
    j = j - 100
    try: # A try/except block is needed because this throws an error if bot times out
        gt = await bot.wait_for('message', check=check, timeout=0.5)
        if int(gt.content) == int(mz):
            await message.send(f'Its Right.. You Got **{j}** Points')
            break
        else:
            await message.send(f'Its Wrong.. The Answer Is **{j}**')
    except:
        continue
else:
    await message.send("Whoops, you're out of time! You got zero points.")