提问者:小点点

服务器之间混合的全局变量,python不协调


我有一个游戏,基本上是两个命令,测试和测试2。
测试让你生成一个单词,你必须在测试2中猜测,如果你错过了这个单词6次,你就输了。

from collections import defaultdict

word = ""
guessesLeft = 6
blanks = []
guessedLetters = []
lettersFound = 0

bot = commands.Bot(command_prefix=("!"))

bot.gamex = defaultdict(bool)

@bot.command()
async def test(ctx, *, message):

    await ctx.message.delete()

    global word, guessesLeft, blanks, lettersFound, guessedLetters
    if not bot.gamex[ctx.guild.id]:

        word = message.lower()

        blanks = []
        guessedLetters = []
        lettersFound = 0
        guessesLeft = 6

        bot.gamex[ctx.guild.id] = True

        for i in range(0, len(word)):
            blanks .append("-")
        print(i)

        await ctx.send(embed=discord.Embed(title="hangman:  " + " ".join(blanks)))

@bot.command()
async def test2(ctx, *, guess):

    global word, guessesLeft, blanks, lettersFound, guessedLetters

    if bot.gamex[ctx.guild.id]:
        if str.isalpha(guess) and len(guess) is 1 and str.lower(guess) not in guessedLetters:
            if str.lower(guess) in word:
                await ctx.send(guess + " is in the word.  Good job!")
                for i in range(0, len(word)):
                    if word[i] == str.lower(guess):
                        blanks[i] = str.lower(guess)
                        lettersFound += 1

            else:
                await ctx.send(guess + " is NOT in the word.")
                guessesLeft -= 1

            guessedLetters.append(str.lower(guess))
            await ctx.send(" ".join(blanks))
            await ctx.send("Guessed letters: " + " ".join(guessedLetters))
            await ctx.send("Guesses left: " + str(guessesLeft))

            if guessesLeft == 0:
                await ctx.send("No guesses left.  You lose!")
                bot.gamex[ctx.guild.id] = False
            if lettersFound == len(word)-1:
                await ctx.send("You've won!  The word was: " + word)
                bot.gamex[ctx.guild.id] = False

这是一个刽子手游戏,但游戏变量在机器人所在的每台服务器上都是混合的,如果我猜一个词出现在一台服务器上,它就会出现在另一台服务器上,我希望每台服务器都是独立的,并且有独立的命令
只有全球范围内的人才在混合
为了使变量不会在服务器之间混淆,命令会是什么样子?


共1个答案

匿名用户

创建一个表示游戏状态的类,并将您的gamex映射替换为帮会ID到游戏的映射:

games = {}

class Game:
    def __init__(self, word, guesses=6):
        self.word = word.lower()
        self.blanks = ["-"]*len(word)
        self.guessedLetters = []
        self.lettersFound = 0
        self.guessesLeft = guesses

然后在您的命令中,您将获得存储该公会状态的游戏。

@bot.command()
async def create_game(ctx, *, word):
    await ctx.message.delete()
    if ctx.guild.id in games:
        await ctx.send("Game already in progress")
    else:
        games[ctx.guild.id] = Game(word)
    await ctx.send(embed=discord.Embed(title="hangman:  " + " ".join(games[ctx.guild.id].blanks)))

当游戏完成时,您可以调用del Games[ctx.guild.id]来删除条目。

一个设计良好的游戏对象意味着关于游戏如何进行的逻辑将从您的命令中提取出来并进入游戏对象。理想情况下,您可以从这段代码中获取Game类,并使用它在浏览器或其他界面中实现相同的游戏,只需进行最小的更改。