#python #class
#python #класс
Вопрос:
В настоящее время я изучаю классы и применяю их по ходу дела, но я столкнулся с проблемой, которую я не уверен, как обойти:
Я не знаю, как мне определить персонажа, имеющего оружие.
Я изучал проблему в другом месте, но это всегда приводит к наследованию, которого я хочу избежать, поскольку это не имеет смысла. Есть ли какой-нибудь способ сделать это? Я покажу как соответствующий код проблемы, так и ниже, полный код для используемых классов.
Соответствующий код
Класс оружия
class weapon:
def __init__ (self):
<constructor>
def set_attack (self, attack):
self.attack = attack
def get_attack (self):
return self.attack
Символьный класс
class character:
def __init__ (self):
<constructor>
def set_attack (self, amount):
self.attack = amount
def get_attack (self):
return self.attack
Полный код
Класс оружия
class weapon:
def __init__ (self, name, attack, crit_chance, crit_bonus, rarity, type_bonus):
self.name = name
self.attack = attack
self.crit_chance = crit_chance
self.crit_bonus = crit_bonus
self.rarity = rarity
self.type_bonus = type_bonus
def set_name (self, name):
self.name = name
def set_attack (self, attack):
self.attack = attack
def set_crit_chance (self, crit_chance):
self.crit_chance = crit_chance
def set_crit_bonus (self, crit_bonus):
self.crit_bonus = crit_bonus
def set_rarity (self, rarity):
self.rarity = rarity
def set_type_bonus (self, type_bonus):
self.type_bonus = type_bonus
def get_name (self):
return self.name
def get_attack (self):
return self.attack
def get_crit_chance (self):
return self.crit_chance
def get_crit_bonus (self):
return self.crit_bonus
def get_rarity (self):
return self.rarity
def get_type_bonus (self):
return self.type_bonus
Символьный класс
class character:
def __init__ (self, name, max_health, current_health, attack):
self.name = name
self.max_health = max_health
self.current_health = current_health
self.attack = attack
def set_name (self, name):
self.name = name
def set_max_health (self, amount):
self.max_amount = amount
def set_current_health (self, amount):
self.current_health = amount
def set_attack (self, amount):
self.attack = amount
def get_name (self):
return self.name
def get_max_health (self):
return self.max_health
def get_current_health (self):
return self.current_health
def get_attack (self):
return self.attack
Класс Player, наследующий от класса Character
class player (character):
def __init__ (self, name, max_health, current_health, attack, money, level, xp):
super().__init__(name, max_health, current_health, attack)
self.money = money
self.level = level
self.xp = xp
def set_money (self, amount):
self.money = amount
def set_level (self, amount):
self.level = amount
def set_xp (self, amount):
self.xp = amount
def get_money (self):
return self.money
def get_level (self):
return self.level
def get_xp (self):
return self.xp
Я ожидаю, что игрок, который наследует от персонажа, сможет атаковать, используя значение объекта оружия, привязанного к этому персонажу.
Приветствуется любая информация. выделенный текст
Комментарии:
1. Добавьте
weapon
член в свойplayer
класс.2. К
weapon
вашемуplayer
классу не привязан. Вам нужно инициализировать один из них в вашемplayer
конструкторе и использовать егоget_attack
метод для получения значения атаки.3. Вы могли бы удалить атаку из персонажа и присвоить персонажу свойство оружия. Тогда вы бы обратились к someplayer.weapon.attack
4. Вам действительно не нужны все эти методы получения и установки.
5. Вы можете охватить оба сценария: атаку игрока или атаку игрока на кого-то. Проверьте мой ответ и посмотрите, имеет ли он смысл!
Ответ №1:
Для начала вы можете избавиться от всех этих геттеров и сеттеров и сделать свои классы как
class Weapon:
def __init__ (self, name, attack, crit_chance, crit_bonus, rarity, type_bonus):
self.name = name
self.attack = attack
self.crit_chance = crit_chance
self.crit_bonus = crit_bonus
self.rarity = rarity
self.type_bonus = type_bonus
class Character:
def __init__ (self, name, max_health, current_health, attack):
self.name = name
self.max_health = max_health
self.current_health = current_health
self.attack = attack
Затем передайте объект оружия вашему классу player и используйте его для атаки на игрока, здесь weapon
представлено оружие с игроком
class Player (character):
def __init__ (self, name, max_health, current_health, attack, money, level, xp, weapon):
super().__init__(name, max_health, current_health, attack)
self.money = money
self.level = level
self.xp = xp
self.weapon = weapon
#For e.g. A weapon attacks and reduces the current health of the player
def attack(self):
self.current_health -= self.weapon.attack
Или передать как объект класса оружия, так и объект класса персонажа вашему классу игрока, otherplayer
атакован ли игрок и weapon
находится ли оружие у игрока
class Player (character):
def __init__ (self, name, max_health, current_health, attack, money, level, xp, otherplayer, weapon):
super().__init__(name, max_health, current_health, attack)
self.money = money
self.level = level
self.xp = xp
self.otherplayer = otherplayer
self.weapon = weapon
def attack(self):
self.otherplayer.current_health -= self.weapon.attack
Комментарии:
1. Отлично, пожалуйста, поддержите / примите мой ответ, если он вам помог 🙂
2. Подойдет! Еще раз спасибо, хорошего дня
3. Спасибо, чувак! Не стесняйтесь спрашивать, если у вас есть дополнительные вопросы!
4. Хорошо, телефон вот-вот умрет, но позже я проверю его и спрошу, нужно ли
5. Я вижу, вы не приняли мой ответ! Чего-то не хватало?
Ответ №2:
Character
Класс будет иметь поле, являющееся экземпляром Weapon
класса, например:
class Character:
def __init__ (self, name, max_health, current_health, attack, weapon):
self.name = name
self.max_health = max_health
self.current_health = current_health
self.attack = attack
self.weapon = weapon # this line
def set_name(self, name):
self.name = name
def set_weapon(self, weapon):
self.weapon = weapon
Вы просто создаете Weapon
объект и передаете его Character
объекту при его создании (или с помощью метода setter):
weapon = Weapon()
character = Character('Char Name', 100, 100, 20, weapon)
Теперь, в качестве дополнительного примечания, пожалуйста, называйте свои классы, используя прописные буквы для начальной буквы, это соглашение PEP8. Это помогает отличать имена классов от экземпляров, иначе вы не смогли бы вызывать экземпляры weapon
и character
в моем примере выше.