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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:15:38