You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在discord.py中实现问答命令?测验机器人始终返回‘no’的问题解决

解决你的Discord测验机器人问题

嘿,我帮你揪出了代码里的几个关键问题,这就是机器人一直返回“no”的根源:

问题1:answer()函数逻辑完全错误

你写的answer()函数里,判断条件if _list == list1[0]完全不符合需求——_list是整个问题列表,而list1[0]是选中问题的第一个字符(比如question_1的第一个字符是q),这俩永远不可能相等,所以这个条件根本不会触发。另外,你用了==来“赋值”正确答案,这是比较运算符,赋值应该用=才对!

问题2:answer()函数没被调用,也没返回值

就算函数逻辑对了,你也没调用answer()来获取正确答案,而且函数里没有return语句,所以answer其实是一个函数对象,不是你想要的字符串"1"或"2"。后面你用msg.content == answer,相当于拿用户输入的字符串和函数对象做比较,结果永远是False,机器人自然一直返回"no"。

问题3:问题列表的定义没必要加括号

你写的_list = [ ('question_1') , ('question_2')]里的括号完全没用,('question_1')就是普通字符串,不是元组。如果要把问题和答案绑定,更推荐直接把每组问题+答案做成元组,逻辑会清晰很多。


修正后的代码

我重新写了更简洁、逻辑更清晰的版本,还加了一些实用的细节:

import random
import asyncio
from discord.ext import commands

@client.command()
async def ask(ctx):
    # 把问题和对应答案绑定成元组,直观又不容易出错
    qna_pairs = [("question_1", "1"), ("question_2", "2")]
    # 随机抽取一组问题和答案
    selected_question, correct_answer = random.choice(qna_pairs)
    
    await ctx.send("What is the answer to this question?")
    await asyncio.sleep(1)
    await ctx.send(selected_question)
    
    # 新增检查:只接收命令发起者的消息,避免其他人干扰测验
    def valid_response(msg):
        return msg.author == ctx.author and msg.channel == ctx.channel
    
    # 等待用户的有效消息
    user_response = await client.wait_for('message', check=valid_response)
    
    # 用strip()处理输入,防止用户不小心输入空格导致判断错误
    if user_response.content.strip() == correct_answer:
        await ctx.send("Good job! 🎉")
    else:
        await ctx.send(f"Oops, wrong answer. The correct one is {correct_answer}.")

修正点说明

  1. 绑定问题与答案:直接用元组把问题和对应答案配对,随机选中后直接拿到正确答案,不用再通过位置判断,逻辑更简单。
  2. 消息合法性检查:新增的valid_response函数确保只有发起命令的用户在同一频道的消息才会被处理,避免其他用户乱输入干扰测验。
  3. 处理用户输入:用strip()去掉用户输入前后的空格,防止手滑输入空格导致判断失误。
  4. 简化代码结构:去掉了没用的answer()函数,直接用变量存储正确答案,代码更易读。

内容的提问来源于stack exchange,提问作者Mario Arquette

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 19:52:31