#python #discord #discord.py
Вопрос:
В настоящее время я пытаюсь закодировать бота-викторину в discord, и прямо сейчас я хочу найти способ, чтобы мой бот извлекал случайный вопрос из определенных параметров. Я не уверен, что это был правильный способ сформулировать это, но вот мой код:
@client.command()
async def ask1(ctx , q):
quiz_data = {
'question1' : (["1" , "one"] , "one") ,
'question2' : (["2" , "two"] , "two") ,
}
questionp1 = random.choice(list(quiz_data.keys()))
answersp1 , hintp1 = quiz_data[questionp1]
quiz_data1 = {
'question3' : (["3" , "three"] , "three") ,
'question4' : (["4" , "four"] , "four")
}
questionp2 = random.choice(list(quiz_data1.keys()))
answersp2 , hintp2 = quiz_data1[questionp2]
global var
if var == 0:
var = 1
if q == "1":
await ctx.send("What is the answer to this question?")
await asyncio.sleep(1)
await ctx.send(questionp1)
def check_sender(msg):
return msg.channel == ctx.channel
def check_answer(msg):
return any(answer in msg.content.lower() for answer in answersp1)
try:
async with timeout(10):
while var == 1:
msg = await client.wait_for('message', check=check_sender)
if check_answer(msg):
await ctx.send("Well done.")
var = 0
break
else:
print(msg.content)
except asyncio.TimeoutError:
if var != 1:
var = 0
else:
await ctx.send(f"What is the answer to this question? hint: {hintp1}")
await ctx.send(questionp1)
try:
async with timeout(5):
while var == 1:
msg = await client.wait_for('message', check=check_sender)
if check_answer(msg):
await ctx.send("Well done.")
var = 0
break
else:
print(msg.content)
except asyncio.TimeoutError:
await ctx.send("No one got it right.")
var = 0
elif q == "2":
await ctx.send("What is the answer to this question?")
await asyncio.sleep(1)
await ctx.send(questionp2)
def check_sender(msg):
return msg.channel == ctx.channel
def check_answer(msg):
return any(answer in msg.content.lower() for answer in answersp2)
try:
async with timeout(10):
while var == 1:
msg = await client.wait_for('message', check=check_sender)
if check_answer(msg):
await ctx.send("Well done.")
var = 0
break
else:
print(msg.content)
except asyncio.TimeoutError:
if var != 1:
var = 0
else:
await ctx.send(f"What is the answer to this question? hint: {hintp2}")
await ctx.send(questionp2)
try:
async with timeout(5):
while var == 1:
msg = await client.wait_for('message', check=check_sender)
if check_answer(msg):
await ctx.send("Well done.")
var = 0
break
else:
print(msg.content)
except asyncio.TimeoutError:
await ctx.send("No one got it right.")
var = 0
else:
await ctx.send("A round has already begun.")
Это концепция, которую я сейчас использую. Команда $ask1 1
и $ask1 2
работает нормально, но я хочу, чтобы у пользователя был выбор поставить $ask1 q:1,2
или что-то в этом роде, после чего бот вытаскивает вопрос либо из первого набора quizdata, либо из второго. Обратите внимание, что весь этот код работает хорошо и выполняется без каких-либо ошибок. Я ломал голову в течение нескольких дней, и я думаю, что для этого мне следует использовать ключевые слова вместо позиционных аргументов, но я не совсем уверен и не знаю, как правильно применять концепцию кваргов в этой ситуации. То var
s необходимы для другой команды, кстати, команды «стоп», поэтому вам не нужно обращать на это внимание.
Извините, если это трудно понять, я буду готов ответить на любые вопросы, чтобы сделать это более понятным. Любой ответ будет оценен по достоинству, спасибо!
Ответ №1:
Вы можете просто использовать произвольную библиотеку,вот документация https://docs.python.org/3/library/random.html. То, о чем я думал, вы могли бы сначала сгенерировать случайное число от 1 до 2, если случайное число равно 1, вы бы перешли к данным викторины, если 2-к данным викторины2, а затем сгенерировали другое случайное число от 1 до, и это указывало бы, какой вопрос из этих данных викторины будет использоваться
Комментарии:
1. Спасибо @SimonTheAnt, но я не уверен, что мы здесь на одной странице. Я думаю, что понимаю, о чем вы говорите, но я не вижу, как пользователь сможет использовать
$ask1 q:1,2
или что-то подобное, поскольку ваш ответ касается только части случайных вариантов в данных. Я не уверен, что я тот, кто ошибается, но я думаю, что у меня уже есть эта концепция в моем коде. Спасибо за ваш ответ, хотя я ценю это~