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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:52:28