Discord.py 1.7轮盘赌命令随机选择逻辑异常问题求助
轮盘赌命令逻辑错误的修复方案
嘿,我一眼就瞅出你代码里的问题啦!导致选偶数碰奇数还显示获胜的根源,是你判断奇偶性的条件写法完全错了~
为啥会出问题?
你写的这个判断偶数的条件:
if e == 0 or 2 or 4 or 6 or ... or 36:
在Python里这么写根本不对!or是用来连接布尔表达式的,你这里相当于把e == 0和一堆数字放一起,而所有非零数字在布尔判断里都是True,所以这个条件不管e是啥,结果永远为True!
这就导致:只要用户选了even,不管生成的数字是奇是偶,都会跑进获胜的分支;而选odd的时候,只有当数字真的是奇数时,才会覆盖成获胜消息,偶数的话就显示失败——这正好和你遇到的bug对上了。
修复后的完整代码
我帮你把逻辑改对了,还顺手优化了代码结构,看起来更清爽:
import random import asyncio # 假设你的slash对象已经正确初始化 choices = ['odd','even'] @slash.slash(description='A staple of gambling') async def roulette(ctx, bet: int, choice): # 先筛掉无效选择,直接返回避免嵌套 if choice not in choices: await ctx.send(f'sorry {ctx.author.mention}, that is not a valid choice. Valid choices: {choices}') return # 处理数字投注(原逻辑的写法有误,这里修正了类型判断) if isinstance(choice, int): await ctx.send('Sorry, you cannot bet on singular numbers yet. This will be added soon') return # 倒计时环节 q = await ctx.send('Bets are in place!\nResults revealed in: 3 seconds') await asyncio.sleep(1) await q.edit(content='Bets are in place!\nResults revealed in: 2 seconds') await asyncio.sleep(1) await q.edit(content='Bets are in place!\nResults revealed in: 1 second') await asyncio.sleep(1) # 生成0-36的随机数 e = random.randint(0, 36) # 正确判断奇偶性 if e % 2 == 0: # 偶数(包括轮盘里的0) if choice == 'even': win = bet * 2 await q.edit(content=f'Number:{e}\nYou win {ctx.author.mention}!!!\n\nYou bet {bet}, and win double your money!!!\n{win}') else: await q.edit(content=f'Number:{e}\nSorry {ctx.author.mention}, you lost your bet!') else: # 奇数 if choice == 'odd': win = bet * 2 await q.edit(content=f'Number:{e}\nYou win {ctx.author.mention}!!!\n\nYou bet {bet}, and win double your money!!!\n{win}') else: await q.edit(content=f'Number:{e}\nSorry {ctx.author.mention}, you lost your bet!')
额外的小优化
- 把无效选择的判断提前了,避免代码嵌套太深,可读性更好
- 修正了原代码里的类型判断错误——原来的
choice == int是在比较变量是否等于int类,应该用isinstance(choice, int)来判断类型 - 用取模运算
e%2来判断奇偶,比枚举所有数字简洁一万倍,还不会出错 - 统一用
\n来换行,代码里的硬换行容易出问题
现在你再测试一下,胜负判断就完全符合预期啦!
内容的提问来源于stack exchange,提问作者hydna1
相关产品推荐
相关产品推荐

