Ваша непосредственная проблема в цикле while
, когда вы звоните playerAtk()
, вы возвращаете из него monsterhp
, но фактически не используете его в этом цикле, и поэтому вы видите, что очки здоровья монстра возвращаются вверхк первоначальному значению.Строка 28 должна выглядеть следующим образом:
monsterhp = playerAtk(monsterhp)
вместо:
playerAtk(monsterhp)
Однако, как было предложено в комментарии, стоит взглянуть на определение ваших пользовательских классов.Я собрал следующий пример, основанный на вашем коде, чтобы подогреть аппетит:
from random import randint
from time import sleep
PLAYERNAME = "Player1"
PLAYERHP = 15
PMINATK = 0
PMAXATK = 4
class CharacterDied(Exception):
def __init__(self, msg):
self.msg = msg
class Character:
def __init__(self, name, initial_hp, minatk, maxatk):
self.name = name
self.hp = initial_hp
self.minatk = minatk
self.maxatk = maxatk
def take_damage(self, damage_hp):
self.hp -= damage_hp
msg = "{} takes {:d}HP damage and has {:d} left."
print(msg.format(self.name, damage_hp, self.hp))
if self.hp < 0:
msg = "{} died."
raise CharacterDied(msg.format(self.name))
def attack(self, other):
dmg = randint(self.minatk, self.maxatk)
sleep(1)
other.take_damage(dmg)
def fight(char1, char2):
try:
while True:
char1.attack(char2)
char2.attack(char1)
except CharacterDied as death_exception:
print(death_exception.msg)
if __name__ == "__main__":
player = Character(PLAYERNAME, PLAYERHP, PMINATK, PMAXATK)
fight(player, Character("Monster1", 5, 1, 2))
if player.hp > 0:
fight(player, Character("Monster2", 6, 0, 2))
Есть много способов сделать это.Для простоты я написал только один общий класс Character
, который мы можем использовать для игроков и монстров, но даже если мы начали настраивать их с помощью подклассов, например, бой теперь стал немного более общим, и мы также можем провести атаку монстров.игрок в том виде, в котором он только что стал функцией двух сражающихся персонажей.
К вашему первоначальному вопросу, хотя искомая выгода здесь заключается в том, что атрибуты сохраняются и сохраняются вместе с объектами их экземпляров, за которыми, как правило, гораздо проще следить, чем пытатьсяиметь дело и отслеживать глобальные переменные.