Как использовать команды только при запуске текущей команды? - PullRequest
0 голосов
/ 30 июня 2018

Этот вопрос может быть сложным, и мой мозг не может действительно объяснить это хорошо, поэтому, пожалуйста, не обращайте внимания на это дерьмовое объяснение. Мой вопрос: когда вы запускаете команду, например .start, она начнет, скажем, текстовую игру, конечно у вас были бы команды, чтобы иметь возможность реально играть в игру, однако меня беспокоит то, что люди по-прежнему могут запускать игровые команды без необходимости запуска игры, например.

     if message.content.startswith("/play"):       #Here is the play command where you execute the game to start
         await client.send_message(message.channel, "Welcome to the game!")
     if message.content.startswith("/examine):
         await client.send_message(message.channel, "You examined the rock and well, got a rock!") #In-Game commands/movements

Что я имею в виду, есть ли возможность использовать внутриигровые команды только тогда, когда сама игра активирована? Дополнительный вопрос: как бы вы хранили информацию о пользователе, например, сохраняя игру (вам не нужно отвечать на этот вопрос, так как я хотел бы изучить это сам, но любые советы были бы хорошими!)

1 Ответ

0 голосов
/ 01 июля 2018

Во-первых, мы хотим некоторый объект, который хранит состояние определенного сеанса. Мы можем просто назвать этот объект Game. Мы будем поддерживать отображение от discord.User с до Game с. User, существующее в этом отображении, означает, что они играют в игру. Некоторые основы выглядят примерно так:

from discord.ext import commands

class Game:
    def __init__(self):
        self.points = 0
        self.inventory = []

bot = commands.Bot('/')

sessions = {}

@bot.command(pass_context=True)
async def play(ctx):
    if ctx.message.author.id in sessions:
        await bot.say("You're already playing")
        return
    sessions[ctx.message.author.id] = Game()
    await bot.say("Welcome to the game!")

@bot.command(pass_context=True)
async def quit(ctx):
    if ctx.message.author.id not in sessions:
        await bot.say("You're not playing the game")
        return
    del sessions[ctx.message.author.id]
    await bot.say("Game Over")

@bot.command(pass_context=True)
async def examine(ctx):
    session = sessions.get(ctx.message.author.id, None)
    if session is None:
        await bot.say("You're not playing the game")
        return
    session.inventory.append("A rock")
    await bot.say("You examined the rock and well, got a rock!")

bot.run("TOKEN")

Некоторые вещи, которые вы могли бы сделать, чтобы расширить это: используйте check s и CommandError s, чтобы избежать необходимости повторять код для проверки сеансов; убедитесь, что Game s pickleable , и напишите код для сохранения игр с использованием pickle; написать игру, которая веселее, чем собирать камни.

...