#python #discord.py
#python #discord.py
Вопрос:
Я пытаюсь сделать discord.py бот, который играет в игру. До сих пор я получал возможность создавать один файл для всей системы, хотя я хочу разные для каждого пользователя. Я использую pickle, и я нигде не видел способа сделать это. Мне было трудно создавать материалы, специфичные для пользователя, так что это тоже проблема. Если нет никакого способа сделать это, дайте мне знать. Вот мой код до сих пор:
async def SwordGame(ctx, arg):
playerlevel = 1
playerxp = 0
playerxpneeded = 100
enemy = ("Goblin", "Gladiator", "Vampire",
"Zombie", "Clone of Yourself")
chosenenemy = random.choice(enemy)
enemyhp = 50
swordtype = ("Gladiator", "Katana", "Scimitar", "Rapier",
"LongSword", "Broadsword", "Cutlass", "ShortSword")
chosensword = random.choice(swordtype)
swordmodifier = ("Speed", "Power")
chosenmodifier = random.choice(swordmodifier)
swordmagic = ("Fire", "Ice", "Lightning", "Wind", "Dark", "Toxic")
chosenmagic = random.choice(swordmagic)
magicpower = 100
swordlevel = 1
swordxp = 0
swordxpneeded = 100
playerhp = 100
validgameanswers=["1", "2", "3", "4", "5", "6"]
if arg not in validgameanswers or arg == "":
embed = discord.Embed(
title='Sword Simulator Game',
Description="The Sword Simulator game by MrPenguin280",
color=discord.Color.dark_red()
)
choiceslist = '''
1 = Battle
2 = Check Sword Stats
3 = Check Player Stats
4 = Heal
5 = Power up Magic
6 = XP farm
'''
embed.add_field(name='Choices:n', value=choiceslist)
embed.add_field(name='What do you choose?', value="Do amp;sg **numberchosen** to choose")
await ctx.send(embed=embed)
with open('savefilesword.dat', 'rb') as f:
chosensword, swordmodifier, chosenmodifier, chosenmagic, magicpower, swordlevel, swordxp, swordxpneeded, playerhp, playerlevel, playerxp, playerxpneeded, chosenenemy, enemyhp = pickle.load(f)
if arg in validgameanswers:
if arg == "1":
if playerlevel >= 2:
playerhp = 50
if playerlevel >= 3:
playerhp = 50
if playerlevel >= 4:
playerhp = 50
if playerlevel >= 5:
playerhp = 50
def check(message):
return message.content in ['1', '2'] and message.author != client.user
await ctx.send("You chose to battle")
await ctx.send(f"A {chosenenemy} Walks into the stadium. You ready your sword")
while enemyhp > 0:
await ctx.send("Type 1 to do a normal battle or 2 to use your magic power")
aora = await client.wait_for('message', check=check, timeout=20)
attackorability = aora.content
if attackorability == "1":
enemyhitordodged=random.randint(1,3)
if enemyhitordodged == 1 or enemyhitordodged == 3:
damage=random.randint(10,20)
if swordlevel == 2:
damage = 10
elif swordlevel == 3:
damage = 20
elif swordlevel == 4:
damage = 30
elif swordlevel == 5:
damage = 40
await ctx.send(f"You hit! You did {damage} to the {chosenenemy}")
enemyhp-=damage
elif enemyhitordodged == 2:
await ctx.send(f"The {chosenenemy} Dodged the attack!")
playerhitordodged = random.randint(1,3)
if playerhitordodged == 1 or playerhitordodged == 3:
await ctx.send("You Dodged! You lost 0 hp")
elif playerhitordodged == 2:
damagetoplayer = random.randint(5,10)
playerhp -= damagetoplayer
await ctx.send(f"The {chosenenemy} did {damagetoplayer} to you!")
elif attackorability == "2":
if magicpower == 0:
await ctx.send("You Do Not Have Enough MPP!")
else:
await ctx.send("You Used up 50 MPP to do 30 damage to the enemy and stunned them so they could not attack")
enemyhp -= 30
magicpower -= 50
if magicpower < 0:
magicpower = 0
await ctx.send(f"You Have {magicpower} MPP left")
if enemyhp <= 0:
await ctx.send(f"You Killed the {chosenenemy}!")
swordxp = 30
playerxp = 20
if swordxp >= 100 and swordlevel != 5:
await ctx.send("Sword Level Up!")
swordlevel = 1
if playerxp >= 100 and playerlevel != 5:
await ctx.send("Player Level Up!")
with open('savefilesword.dat', 'wb') as f:
pickle.dump([chosensword, swordmodifier, chosenmodifier, chosenmagic, magicpower, swordlevel, swordxp, swordxpneeded, playerhp, playerlevel, playerxp, playerxpneeded, chosenenemy, enemyhp], f, protocol=2)
if arg == "2":
await ctx.send("Here are your sword statsn")
swordstats="tttt____________________n"
swordstats ="tttt|Player Sword Stats|n"
swordstats =f"Your Sword is: {chosensword}n"
swordstats =f"Your Sword Modifier is: {chosenmodifier}n"
swordstats =f"Your Sword Magic is: {chosenmagic}n"
swordstats =f"Your Sword Skill Level is: {swordlevel}n"
swordstats =f"Your Sword XP amount is: {swordxp}/{swordxpneeded}"
await ctx.send(swordstats)
with open('savefile.dat', 'wb') as f:
pickle.dump([chosensword, swordmodifier, chosenmodifier, chosenmagic, magicpower, swordlevel, swordxp, swordxpneeded, playerhp, playerlevel, playerxp, playerxpneeded, chosenenemy, enemyhp], f, protocol=2)
if arg == "3":
await ctx.send("Here are your player statsn")
playerstats = "tttt______________n"
playerstats = "tttt|Player stats|n"
playerstats = f"Player HP left is: {playerhp}n"
playerstats = f"Player MPP left is: {magicpower}n"
playerstats = f"Player Level is: {playerlevel}n"
playerstats = f"Player XP amount is : {playerxp}/{playerxpneeded}"
await ctx.send(playerstats)
with open('savefile.dat', 'wb') as f:
pickle.dump([chosensword, swordmodifier, chosenmodifier, chosenmagic, magicpower, swordlevel, swordxp, swordxpneeded, playerhp, playerlevel, playerxp, playerxpneeded, chosenenemy, enemyhp], f, protocol=2)
if arg == "4":
if playerhp <= 99:
await ctx.send("You Healed by 40 HP")
playerhp = 40
if playerhp >= 100:
playerhp = 100
else:
await ctx.send("You are at max HP")
with open('savefile.dat', 'wb') as f:
pickle.dump([chosensword, swordmodifier, chosenmodifier, chosenmagic, magicpower, swordlevel, swordxp, swordxpneeded, playerhp, playerlevel, playerxp, playerxpneeded, chosenenemy, enemyhp], f, protocol=2)
if arg == "5":
if magicpower <=199:
await ctx.send("You Powered up your magic by 50 points")
magicpower = 50
if magicpower >= 200:
magicpower = 200
else:
await ctx.send("You are at max Magic Power")
with open('savefile.dat', 'wb') as f:
pickle.dump([chosensword, swordmodifier, chosenmodifier, chosenmagic, magicpower, swordlevel, swordxp, swordxpneeded, playerhp, playerlevel, playerxp, playerxpneeded, chosenenemy, enemyhp], f, protocol=2)
if arg == "6":
ctx.send("You chose to wait to gain XP for 1 minute")
time.sleep(60)
playerxp = playerxpneeded
swordxp = swordxpneeded
ctx.send("You Leveled up after waiting!")
playerlevel = 1
playerxp = 0
swordlevel = 1
swordxp = 0
with open('savefile.dat', 'wb') as f:
pickle.dump([chosensword, swordmodifier, chosenmodifier, chosenmagic, magicpower, swordlevel, swordxp, swordxpneeded, playerhp, playerlevel, playerxp, playerxpneeded, chosenenemy, enemyhp], f, protocol=2)```
Ответ №1:
Я также создаю игру для своего бота discord. Для этого я использую словари, хранящиеся в файлах, названных в честь идентификаторов пользователей, поскольку к ним действительно легко получить доступ ctx.author.id
, и они никогда не изменятся. Когда пользователь активирует команду, я разархивирую файл с именем f"{ctx.author.id}.dat"
и присваиваю переменной словарь, который был сохранен внутри. Затем я могу изменить значения словаря, обратившись к ним через их ключи, и могу снова открыть словарь после того, как закончу.
Используя этот метод, я также могу легко проверить, нет ли у пользователя назначенного файла сохранения os.path.isfile(f"{ctx.author.id}.dat")
, и могу вставить словарь шаблонов в их файл.
Кроме того, time.sleep()
не следует использовать вместе с асинхронным кодом.
Комментарии:
1. итак, если бы я должен был это сделать, нужно ли мне делать операторы if с запросом, был ли файл уже создан, или есть другой способ сделать это edit: Wait nvm я понял