如何在discord.py斜杠命令中添加下拉菜单制作石头剪刀布游戏?
解决discord.py斜杠命令中添加石头剪刀布选项菜单的问题
你提到的布尔类型参数只能生成二元选择菜单,但石头剪刀布需要三个选项,官方稳定版discord.py可以通过discord.app_commands.Choice实现自定义选项的斜杠命令,同时也能实现你最初想做的消息内选择菜单,具体方案如下:
1. 斜杠命令内置选项菜单实现
直接在斜杠命令参数中预设可选选项,用户调用命令时会看到下拉选择菜单,无需手动输入字符串:
import random import discord from discord import app_commands # 假设bot和tree已正确初始化 @tree.command(name="rps", description="石头剪刀布游戏") @app_commands.describe(choice="选择你的出拳") @app_commands.choices( choice=[ app_commands.Choice(name="石头", value="rock"), app_commands.Choice(name="剪刀", value="scissors"), app_commands.Choice(name="布", value="paper") ] ) async def rps(command: discord.Interaction, choice: str): # 生成机器人的随机选择 bot_choice = random.choice(["rock", "scissors", "paper"]) # 胜负判断逻辑 if choice == bot_choice: result = "平局!" elif (choice == "rock" and bot_choice == "scissors") or (choice == "scissors" and bot_choice == "paper") or (choice == "paper" and bot_choice == "rock"): result = "你赢了!" else: result = "你输了!" # 转换为中文显示 choice_cn = "石头" if choice == "rock" else "剪刀" if choice == "scissors" else "布" bot_choice_cn = "石头" if bot_choice == "rock" else "剪刀" if bot_choice == "scissors" else "布" await command.response.send_message(f"你出了{choice_cn},机器人出了{bot_choice_cn}。{result}")
2. 消息内选择菜单实现(补充你最初的需求)
如果想在消息中添加下拉选择菜单,可通过discord.ui.Select和discord.ui.View实现:
class RPSSelect(discord.ui.Select): def __init__(self): options = [ discord.SelectOption(label="石头", value="rock"), discord.SelectOption(label="剪刀", value="scissors"), discord.SelectOption(label="布", value="paper") ] super().__init__(placeholder="选择你的出拳...", min_values=1, max_values=1, options=options) async def callback(self, interaction: discord.Interaction): choice = self.values[0] bot_choice = random.choice(["rock", "scissors", "paper"]) # 胜负判断逻辑同上方 result = "" if choice == bot_choice: result = "平局!" elif (choice == "rock" and bot_choice == "scissors") or (choice == "scissors" and bot_choice == "paper") or (choice == "paper" and bot_choice == "rock"): result = "你赢了!" else: result = "你输了!" choice_cn = "石头" if choice == "rock" else "剪刀" if choice == "scissors" else "布" bot_choice_cn = "石头" if bot_choice == "rock" else "剪刀" if bot_choice == "scissors" else "布" await interaction.response.send_message(f"你出了{choice_cn},机器人出了{bot_choice_cn}。{result}", ephemeral=True) class RPSView(discord.ui.View): def __init__(self): super().__init__(timeout=60) self.add_item(RPSSelect()) # 用斜杠命令触发消息菜单 @tree.command(name="rps_menu", description="石头剪刀布(消息菜单版)") async def rps_menu(command: discord.Interaction): await command.response.send_message("请选择你的出拳:", view=RPSView())
3. 关键注意事项
- 确保使用discord.py 2.0+官方稳定版,组件和斜杠命令在该版本后才完善
- 斜杠命令需要同步到服务器,可在机器人启动时执行服务器同步(无需等待全局同步的1小时):
@bot.event async def on_ready(): # 替换为你的服务器ID await tree.sync(guild=discord.Object(id=1234567890)) print(f"已登录为 {bot.user}")
内容的提问来源于stack exchange,提问作者user20295456
相关产品推荐
相关产品推荐

