我正在对我的不和谐机器人执行命令,它会根据用户对命令的响应发回响应。我有一个 while 循环,在那里我遍历所有可能的答案,如果它们都不正确,则转到 else 语句。但是,每次循环运行时,它都会根据第一个语句返回答案(如果答案为高)并且实际上似乎并不关心其他 elif 语句。这是否与 message.content 部分有关,因为它们似乎根本不起作用?这是循环:
编辑:添加了整个事件
@commands.Cog.listener()
async def on_message(self, message):
if '.highlow' in message.content:
randomnumber = random.randint(0,100)
hintnumber = random.randint(0,100)
channel = message.channel
await channel.send('Satunnainen luku on valittu väliltä ``0-100``.\n'
f'Vihjeesi on ``{hintnumber}``.\n'
'Vastaa kirjoittamalla ``high``, ``low`` tai ``vihje``.')
def check(message):
return message.content == 'high' or 'low' or 'vihje' and message.channel == channel
msg = await self.client.wait_for('message', check=check)
while True:
if message.author != self.client.user:
if 'high' in message.content:
if randomnumber > hintnumber:
await channel.send(f'Satunnainen luku oli ``{randomnumber}``, joten voitit pelin!'.format(msg))
break
elif randomnumber < hintnumber:
await channel.send(f'Satunnainen luku oli ``{randomnumber}``, joten hävisit pelin!'.format(msg))
break
elif 'low' in message.content:
if randomnumber < hintnumber:
await channel.send(f'Satunnainen luku oli ``{randomnumber}``, joten voitit pelin!'.format(msg))
break
elif randomnumber > hintnumber:
await channel.send(f'Satunnainen luku oli ``{randomnumber}``, joten hävisit pelin!'.format(msg))
break
elif 'vihje' in message.content:
if randomnumber == hintnumber:
await channel.send(f'Satunnainen luku oli ``{randomnumber}``, joten voitit pelin!'.format(msg))
break
elif randomnumber != hintnumber:
await channel.send(f'Satunnainen luku oli ``{randomnumber}``, joten hävisit pelin!'.format(msg))
break
else:
await channel.send('Tuo ei ole oikea vaihtoehto!')
break
命令在一个齿轮中。
答案 0 :(得分:1)
问题出在check()
。您的条件看起来不正确。
message.content == 'high' or 'low' or 'vihje' and message.channel == channel
将始终为 True
在我看来,当 check()
是高、低或 vihje 之一,并且当 True
是 message.content
时,您希望 message.channel
返回 channel
.不幸的是,您的第一个条件的语法不正确,由于 Python True
S 的 truthiness,它总是计算为 str
。这样做的结果是,即使 check()
是“粉红色”甚至是 True
,message.content
也可以返回 None
。将 check()
重写为:
def check(message):
return message.content in {'high', 'low', 'vihje'} and message.channel == channel
您的条件实际上被评估为:
(message.content == 'high') or ('low') or ('vihje') and (message.channel == channel)
由于非空 str
S 评估为 True
,因此您的条件是:
(message.content == 'high') or (True) or (True) and (message.channel == channel)
# Which reduces to
True
如果您想亲自查看 Python 字符串的真实性,请运行以下代码段:
if '':
print('empty string is True')
else:
print('empty string is False')
if 'foo':
print('non-empty string is True')
else:
print('non-empty string is False')
if 'false':
print('"false" is True')
else:
print('"false" is False')