如何在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}.")
修正点说明
- 绑定问题与答案:直接用元组把问题和对应答案配对,随机选中后直接拿到正确答案,不用再通过位置判断,逻辑更简单。
- 消息合法性检查:新增的
valid_response函数确保只有发起命令的用户在同一频道的消息才会被处理,避免其他用户乱输入干扰测验。 - 处理用户输入:用
strip()去掉用户输入前后的空格,防止手滑输入空格导致判断失误。 - 简化代码结构:去掉了没用的
answer()函数,直接用变量存储正确答案,代码更易读。
内容的提问来源于stack exchange,提问作者Mario Arquette
相关产品推荐
相关产品推荐

