这个问题可能很复杂,我的大脑无法真正很好地解释这个问题,所以请对此做出bare脚的解释,我的问题是,例如,当您触发命令时,启动它就可以说是一个基于文本的游戏。您将拥有能够实际玩游戏的命令,但是我担心的是,人们仍然可以触发游戏中的命令而无需启动游戏。例如
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
我的意思是,有一种方法只有在激活游戏本身时才能够使用游戏中的命令吗? 附加问题:您将如何像基本保存游戏一样存储用户的信息(您实际上不需要回答这个,因为我想自己学习,但是任何提示都很棒!)
答案 0 :(得分:0)
首先,我们需要一些对象来存储特定会话的状态。我们可以仅将此对象称为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
和CommandError
来避免重复检查会话的代码;确保Game
是pickleable,并编写代码以使用pickle保存游戏;编写比收集岩石更有趣的游戏。