Discord.py开发赌场机器人输出随机选项到频道引发崩溃如何解决
问题原因排查
你的代码存在3个直接导致崩溃/逻辑错误的问题:
- 类型错误:
choice和value都是整数类型,不能直接和字符串用+拼接,Python会直接抛出类型错误导致进程崩溃 - 随机数重复生成:你已经提前生成了机器人掷出的结果
value,但判断是否中奖时又重新调用了一次random.choice,导致判断用的结果和最后发给用户的结果完全不一致 - 语法错误:发送消息的语句里错误给
value套了一层{},会把它转为集合类型,也会导致拼接时报错 - 缺少边界处理:没有处理用户输入的choice不在1-6范围、用户赌输的分支逻辑,可能触发未定义行为
修正后代码
async def roll( self, ctx: commands.Context, choice: int, bet: int=DEFAULT_BET ): self.check_bet(ctx, bet) choices = range(1,7) # 可选范围1-6 bot_roll = random.choice(choices) # 仅生成一次机器人的掷骰结果,保证前后逻辑一致 if choice not in choices: await ctx.send(f"你输入的选项不合法,请选择1-6之间的数字") return # 直接用已生成的结果判断是否中奖 if bot_roll == choice: self.economy.add_money(ctx.author.id, bet*6) await ctx.send(f"你选择了: {choice}, 我掷出了 {bot_roll},恭喜你中奖!") else: # 此处替换为你自己实现的扣减余额逻辑即可 self.economy.subtract_money(ctx.author.id, bet) await ctx.send(f"你选择了: {choice}, 我掷出了 {bot_roll},很遗憾你输掉了本轮赌局")
修改说明
- 用Python的f-string格式化输出字符串,不需要手动做类型转换,也不会出现拼接错误
- 全程只生成一次机器人的掷骰结果,保证判断逻辑和发送给用户的结果一致
- 补全了非法输入、赌输的分支处理,避免出现无返回的异常情况
- 调整了变量命名可读性更高,避免逻辑混淆
内容的提问来源于stack exchange,提问作者Garrett
相关产品推荐
相关产品推荐

