Изменение атрибута класса другим классом - PullRequest
0 голосов
/ 08 июля 2020

Я делал небольшую игру, просто чтобы попробовать использовать классы и функции, но когда я изменяю атрибут класса с помощью другого класса, он возвращает только исходный неизмененный атрибут. Как я могу решить эту проблему? Ниже мой код. Я обнаружил, что назначение нового hp переменной работает, но я хочу напрямую изменить атрибут класса другим классом. Спасибо

import random

class Player:
    """Describes the main player."""
    def __init__(self,level,health,will):
        """Initializes stats"""
        self.level = level
        self.health = health
        self.full_health = health
        self.will = will

    def default_attack(self, enemy_hp):
        """Normal attack that damages enemy target."""
        damage = 0
        if random.randint(1,100) <= 95:
            damage = (self.level * 2)
            critical_hit = random.randint(1,10)
            if critical_hit == 1:
                damage += int(self.level * 0.5)
                print("Critical hit!")
        enemy_hp -= damage
        print("The enemy took " + str(damage) + " damage.")

    def heal(self):
        """Heals self by 10%."""
        recovered = int(self.full_health * 0.10)
        self.health += recovered
        if self.health > self.full_health:
            self.health = self.full_health
        print("Recovered " + str(recovered) + " HP.")


class enemy:
    """Describes common easy enemy."""
    def __init__(self,level,health,magic):
        """Initializes stats"""
        self.level = level
        self.health = health
        self.magic = magic

    def default_attack(self, protag_hp):
        """Normal attack that damages protagonist target."""
        chance_to_hit = random.randint(1,100)
        damage = 0
        if chance_to_hit <= 90:
            damage = (self.level * 2)
            if chance_to_hit <= 10:
                damage += int(self.level * 0.5)
        protag_hp -= damage
        print("You took " + str(damage) + " damage.")

# Spawn enemies
def spawn_enemy(level):
    if level == "easy":
        level = random.randint(1,5)
        health = int(level * 5)
        magic = int(level * 2)
        enemy = {"level": level,"health": health,"magic": magic}
        return enemy
    elif level == "medium":
        level = random.randint(6, 10)
        health = int(level * 5)
        magic = int(level * 2)
        enemy = {"level": level, "health": health, "magic": magic}
        return enemy
    elif level == "hard":
        level = random.randint(11, 15)
        health = int(level * 5)
        magic = int(level * 2)
        enemy = {"level": level, "health": health, "magic": magic}
        return enemy

# Start
enemy_minion = enemy(**spawn_enemy("easy"))
print("The enemy's level is " + str(enemy_minion.level) + ".")
Rachel = Player(1,100,10)
Rachel.default_attack(enemy_minion.health)
enemy_minion.default_attack(Rachel.health)
print(Rachel.health)
Rachel.heal()
print(Rachel.health)

Мои результаты и я помещаем комментарий рядом с тем, что меня беспокоит.

The enemy's level is 3.
The enemy took 2 damage.
You took 7 damage.
100                   # here I want it to say 93
Recovered 10 HP.
100

1 Ответ

1 голос
/ 08 июля 2020

Здесь, когда вы передаете атрибут здоровья в функцию атаки противника по умолчанию, вы не передаете эту переменную, вы просто передаете ее значение. Итак, когда вы редактируете его внутри функции, это не влияет на переменную.

To go вместо того, чтобы передавать здоровье, передайте класс персонажа:

enemy_minion.default_attack(Rachel)

и отредактируйте здоровье персонажа в функциях атаки:

def default_attack(self, player):
        """Normal attack that damages protagonist target."""
        ...
        player.health -= damage  # Here is the change
        ...

Вы также должны сделать то же самое для функции атаки игрока:

def default_attack(self, enemy):
        """Normal attack that damages enemy target."""
        ...
        enemy.health -= damage
        print("The enemy took " + str(damage) + " damage.")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...