为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

冉冉说 2022-09-27 10:43:26
我正在制作一个掷骰子不和谐机器人qith Python 3。骰子编号在字典中查找短语并输出它。我使用六面骰子时做得很好,但我希望用户能够将其设置为10面骰子。要掷骰子,将其设置为10面骰子是“!y1”,它是“!y d10”。默认情况下,我将其设置为d6,但是当我现在尝试滚动时,它会给我一个变量未定义的错误。有人可以帮我指出我错过了什么吗?import osfrom random import randintimport discordfrom dotenv import load_dotenvload_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 = 6w=""#Successful server connection message@client.eventasync def on_ready():        print(f'{client.user.name} has connected to Discord!')
查看完整描述

2 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

您有两个语句的计算结果都可以为 ,这意味着变量可能永远不会被创建。ifFalsesides


这是因为您创建的 在函数之外,使其超出范围。您需要将其移动到函数内部或声明为全局(不建议)。sidessides


...


#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!')


#Makes sure bot doesn't respond to itself

@client.event

async 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 = 6


w=""


#Successful server connection message

@client.event

async def on_ready():

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


#Makes sure bot doesn't respond to itself

@client.event

async 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)


查看完整回答
反对 回复 2022-09-27
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

我认为我发布的变量未声明为全局变量。我稍微简化了这一切,并将其塞进一个具有多个IF的事件中。


还添加了一些其他代码...


# ybnabot.py

#d6 functionality


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: '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.event

async def on_ready():

    global sides

    sides = 6

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



@client.event

async 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)



查看完整回答
反对 回复 2022-09-27
  • 2 回答
  • 0 关注
  • 76 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信