discord.py如何获取用户输入?黑杰克游戏Stand功能无法触发求助
问题排查
client.wait_for("message")返回的是discord.Message对象,不是用户输入的字符串,直接和"Stand"做相等判断永远为假,需要取消息的content属性做判断。- 未设置
check校验规则,会导致任意用户在任意频道发的消息都会触发后续逻辑,应该限制仅触发命令的用户在当前频道发送的消息才生效。 - 所有
ctx.send()调用前都缺少await关键字,discord.py中消息发送是异步协程方法,不加await不会实际执行发送操作。 - 庄家抽牌的循环逻辑存在错误:没有更新变量
S的数值,同时循环条件逻辑错误,应该是庄家点数同时小于玩家点数且小于等于21时才需要继续抽牌。 - 直接用
random.choice(deck)抽牌会出现重复抽同一张牌的问题,建议抽牌后将对应数值从牌组中移除,或者提前打乱牌组按顺序抽牌。
修复后的代码
import random # 请确保你提前定义的deck是符合规则的数值集合,比如标准黑杰克牌组可定义为 deck = [2,3,4,5,6,7,8,9,10,10,10,10,11]*4 @client.command() async def blackjack(ctx): # 初始化玩家和庄家手牌 player_cards = [random.choice(deck), random.choice(deck)] dealer_cards = [random.choice(deck), random.choice(deck)] player_total = sum(player_cards) dealer_total = sum(dealer_cards) # 发送初始手牌 await ctx.send(f"你的手牌:{player_cards},总点数:{player_total}") await ctx.send(f"庄家明牌:{dealer_cards[0]}") # 定义校验规则:仅当前命令发起者在当前频道发的消息生效 def check(m): return m.author == ctx.author and m.channel == ctx.channel # 等待用户输入 m = await client.wait_for("message", check=check) if m.content.strip() == "Stand": # 庄家抽牌逻辑:点数小于玩家且小于等于21就继续抽 while dealer_total < player_total and dealer_total <= 21: new_card = random.choice(deck) dealer_cards.append(new_card) dealer_total += new_card await ctx.send(f"庄家最终手牌:{dealer_cards},总点数:{dealer_total}") # 判断输赢 if dealer_total > 21: await ctx.send("你赢了!") elif player_total > dealer_total: await ctx.send("你赢了!") elif player_total == dealer_total: await ctx.send("平局!") else: await ctx.send("你输了!") # 此处可继续添加Hit选项的判断,实现玩家抽牌功能
补充优化建议
你可以后续完善A牌(默认点数11)的动态调整逻辑,当总点数超过21时可以将A的点数改为1,符合标准黑杰克的官方规则。
内容的提问来源于stack exchange,提问作者vazzza
相关产品推荐
相关产品推荐

