不和谐机器人 - Python 3 - 将用户变量传递给其他函数

我正在制作一个掷骰子不和谐机器人qith Python 3。骰子编号在字典中查找短语并输出它。我使用六面骰子时做得很好,但我希望用户能够将其设置为10面骰子。


要掷骰子,将其设置为10面骰子是“!y1”,它是“!y d10”。默认情况下,我将其设置为d6,但是当我现在尝试滚动时,它会给我一个变量未定义的错误。有人可以帮我指出我错过了什么吗?



import os

from random import randint


import discord

from dotenv import load_dotenv


load_dotenv()

TOKEN = os.getenv('DISCORD_TOKEN')


client = discord.Client()


def ybna6_faces(x):

    return{

        1: 'Yes, And...',

        2: 'Yes...',

        3: 'Yes, But...',

        4: 'No, But...',

        5: 'No...',

        6: 'No, And...'

        }[x]


def danger6_faces(x):

        return{

                1: 'Blank',

                2: 'Blank',

                3: 'Blank',

                4: 'Blank',

                5: 'Skull!',

                6: 'Two Skull!!'

                }[x]


def ybna10_faces(x):

    return{

        1: 'Yes, And...',

        2: 'Yes...',

        3: 'Yes, But...',

        4: 'No, But...',

        5: 'No...',

        6: 'No, And...',

        7: '',

        8: '',

        9: '',

        10: ''

        }[x]


def danger10_faces(x):

        return{

                1: 'Blank',

                2: 'Blank',

                3: 'Blank',

                4: 'Blank',

                5: 'Skull!',

                6: 'Two Skull!!',

                7: '',

                8: '',

                9: '',

                10: ''

                }[x]



sides = 6

#active_ybna = 6

#active_danger = 6


w=""


#Successful server connection message

@client.event

async def on_ready():

        print(f'{client.user.name} has connected to Discord!')



冉冉说
浏览 131回答 2
2回答

喵喵时光机

您有两个语句的计算结果都可以为 ,这意味着变量可能永远不会被创建。ifFalsesides这是因为您创建的 在函数之外,使其超出范围。您需要将其移动到函数内部或声明为全局(不建议)。sidessides...#active_ybna = 6#active_danger = 6w=""#Successful server connection message@client.eventasync def on_ready():    print(f'{client.user.name} has connected to Discord!')#Makes sure bot doesn't respond to itself@client.eventasync def on_message(message):    sides = 6    if message.author == client.user:        return    #Choose die (6 or 10)    if message.content.startswith('!y d6'):        sides = 6    if message.content.startswith('!y d10'):        sides = 10    #Evaluate rolls    if message.content.startswith('!y'):        if int(message.content[2])>int(0):            z = int(message.content[2])            for x in range(z):                    y = randint(1,int(sides))                 active_ybna = 'ybna'+ sides + '_faces()'                 response = 'Roll ' + str(x+1) + ': ' + active_ybna(y)                 await message.channel.send(response)         if len(message.content)>=4:             if int(message.content[4])>int(0):                 z = int(message.content[4])                 for x in range(z):                     y=randint(1,int(sides))                     active_danger = 'danger'+ sides + '_faces()'                     response = 'Danger ' + str(x+1) + ': ' + active_danger(y)                     await message.channel.send(response)client.run(TOKEN)您有两个语句的计算结果都可以为 ,这意味着变量可能永远不会被创建。ifFalsesides这是因为您创建的 在函数之外,使其超出范围。您需要将其移动到函数内部或声明为全局(不建议)。sidessides...#active_ybna = 6#active_danger = 6w=""#Successful server connection message@client.eventasync def on_ready():    print(f'{client.user.name} has connected to Discord!')#Makes sure bot doesn't respond to itself@client.eventasync def on_message(message):    sides = 6    if message.author == client.user:        return    #Choose die (6 or 10)    if message.content.startswith('!y d6'):        sides = 6    if message.content.startswith('!y d10'):        sides = 10    #Evaluate rolls    if message.content.startswith('!y'):        if int(message.content[2])>int(0):            z = int(message.content[2])            for x in range(z):                    y = randint(1,int(sides))                 active_ybna = 'ybna'+ sides + '_faces()'                 response = 'Roll ' + str(x+1) + ': ' + active_ybna(y)                 await message.channel.send(response)         if len(message.content)>=4:             if int(message.content[4])>int(0):                 z = int(message.content[4])                 for x in range(z):                     y=randint(1,int(sides))                     active_danger = 'danger'+ sides + '_faces()'                     response = 'Danger ' + str(x+1) + ': ' + active_danger(y)                     await message.channel.send(response)client.run(TOKEN)

斯蒂芬大帝

我认为我发布的变量未声明为全局变量。我稍微简化了这一切,并将其塞进一个具有多个IF的事件中。还添加了一些其他代码...# ybnabot.py#d6 functionalityimport osfrom random import randintimport discordfrom dotenv import load_dotenvload_dotenv()TOKEN = os.getenv('DISCORD_TOKEN')client = discord.Client()def ybna6_faces(x):    return{        1: 'No, And...',        2: 'No...',        3: 'No, But...',        4: 'Yes, But...',        5: 'Yes...',        6: 'Yes, And...'        }[x]def danger6_faces(x):        return{        1: 'Blank',        2: 'Blank',        3: 'Blank',        4: 'Blank',        5: ':skull:',        6: ':skull: :skull:'        }[x]def ybna10_faces(x):    return{        1: 'No, And...',        2: 'No, And, But...',        3: 'No...',        4: 'Not, But...',        5: 'No, But, And...',        6: 'Yes, But, And...',        7: 'Yes, But...',        8: 'Yes...',        9: 'Yes, And, But...',        10: 'Yes, And...'        }[x]def danger10_faces(x):        return{                1: 'Blank',                2: 'Blank',                3: 'Blank',                4: 'Blank',                5: ':skull',                6: ':skull: :skull',                7: 'Blank',                8: 'Blank',                9: ':skull:',                10: ':skull: :skull:'                }[x]@client.eventasync def on_ready():    global sides    sides = 6    print(f'{client.user.name} has connected to Discord!')@client.eventasync def on_message(message):    global sides    if message.author == client.user:        return#Send Help DM    if message.content.startswith('!y help'):        await message.author.send('YBNA Bot Help!')        await message.author.send('Commands:')        await message.author.send('!y X Z - Roll X number of YBNA dice and Z Danger dice (Danger die can be omitted)')        await message.author.send('!y d6 - Choose six sided dice')        await message.author.send('!y d10 - Choose 10 sided dice')        await message.author.send('!y dice - Displays which dice are selected (d6 or d10)')        await message.author.send('!y help - This message!')        await message.author.send('txutfz73 credits here')        await message.author.send('github link here')        return#Check die used    if message.content.startswith('!y dice'):        response = 'Using ' + str(sides) + ' sided dice!'        await message.channel.send(response)        return#Choose d6 or d10    if message.content.startswith('!y d6'):        sides = 6        await message.channel.send('Now using d6!')        return    if message.content.startswith('!y d10'):        sides = 10        response = 'Now using d10!'        await message.channel.send(response)        return#Roll d6    if sides == 6:        if message.content.startswith('!y'):            if int(message.content[2])>int(0):                z = int(message.content[2])                for x in range(z):                    y = randint(1,6)                    response = 'Roll ' + str(x+1) + ': ' + ybna6_faces(y) + str(sides)                    await message.channel.send(response)        if len(message.content)>=4:            if int(message.content[4])>int(0):                z = int(message.content[4])                for x in range(z):                    y=randint(1,6)                    response = 'Danger ' + str(x+1) + ': ' + danger6_faces(y)                    await message.channel.send(response)#Roll d10    else:        if message.content.startswith('!y'):            if int(message.content[2])>int(0):                z = int(message.content[2])                for x in range(z):                    y = randint(1,10)                    response = 'Roll ' + str(x+1) + ': ' + ybna10_faces(y) + str(sides)                    await message.channel.send(response)        if len(message.content)>=4:            if int(message.content[4])>int(0):                z = int(message.content[4])                for x in range(z):                    y=randint(1,10)                    response = 'Danger ' + str(x+1) + ': ' + danger10_faces(y)                    await message.channel.send(response)client.run(TOKEN)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python