Python

Помогите пожалуйста с задачей по python!

Задача 1. Драка
Вы работаете в команде разработчиков мобильной игры, и вам досталась вот такая часть от ТЗ заказчика:

Есть два юнита, каждый из них называется «Воин». Каждому устанавливается здоровье в 100 очков. Они бьют друг друга в случайном порядке. Тот, кто бьёт, здоровья не теряет. У того, кого бьют, оно уменьшается на 20 очков от одного удара. После каждого удара надо выводить сообщение, какой юнит атаковал и сколько у противника осталось здоровья. Как только у кого-то заканчивается ресурс здоровья, программа завершается сообщением о том, кто одержал победу.

Реализуйте такую программу.

вот код который я написал:
import random


class Warrior:
def __init__(self, health):
self.health = health

def hit(self, target, target1):
if target.health > 0:
target.health -= 20
if target1 == warrior1:
target1 = "Воин1"
if target1 == warrior2:
target1 = "Воин2"
print(target1, " Атаковал")
print(target.health, " здоровья осталось")
if target.health == 0:
print(target1, " Победил")


warrior1 = Warrior(100)
warrior2 = Warrior(100)


q = int(input("Введите 1 для того, чтобы какой-то воин атаковал. Для закрытия программы введите 2: "))

while q != 2:
if q == 1:
j = random.randint(1, 3)
if j % 2 == 0:
warrior1.hit(warrior2, warrior1)
q = int(input("Введите 1 для того, чтобы какой-то воин атаковал: "))
else:
warrior2.hit(warrior1, warrior2)
q = int(input("Введите 1 для того, чтобы какой-то воин атаковал: "))
else:
print("Ошибка ввода.")
break
но препод говорит:
Хорошо, но предлагаю немного изменить код, каждому войну для атаки можно немного метод для атаки.

Достаточно передавать только один аргумент — цель

warrior1.hit(warrior2)

Получилось: воин 1 атакует второго

Также, обратите внимание, что нам понадобится сделать проверку, что target это воин

Лучше сначала проверить, если это не воин, можно вывести исключение, как это делали в прошлом модуле или просто напечатать сообщение об ошибке.



То есть метод для атаки только уменьшает количество здоровья у цели и не более. Поэтому можем добавить проверку перед атакой, жив ли вони, если да, атакуем.

когда передаю один аргумент мне выдаёт ошибку:
Traceback (most recent call last):
File "Module24\01_fight\main.py", line 37, in <module>
warrior2.hit(warrior1)
File "Module24\01_fight\main.py", line 19, in hit
print(target.health, " здоровья осталось")
AttributeError: 'str' object has no attribute 'health'
Очень прошу помогите! Я не понимаю как сделать правильно
Раз метод атаки только уменьшает значение, то придётся "логи" из него вынести.
import random

class Warrior:
    def __init__(self, name, health=100):
        self.name = name
        self.health = health

    def hit(self, target):
        if type(self) == type(target):
            target.health -= 20
        else:
            raise TypeError

warriors = [Warrior('Воин1'), Warrior('Воин2')]
while True:
    q = input('Введите 1, чтобы какой-то воин атаковал. Для закрытия программы введите 2: ')
    if q == '1':
        i = random.randint(0, 1)
        attacker, victim = warriors[i], warriors[i - 1]
        attacker.hit(victim)
        print(attacker.name, 'атаковал', victim.name)
        print('У', victim.name, 'осталось здоровья', victim.health)
        if victim.health <= 0:
            print(attacker.name, 'победил!!!')
            break
    elif q == '2':
        break
    else:
        print('Ошибка ввода')
Matti Komil
Matti Komil
20 861
Лучший ответ
import random

class Warrior:
def __init__(self):
self.hp_warrior = 0

warrior_1 = Warrior()
warrior_2 = Warrior()
warrior_1.hp_warrior = 100
warrior_2.hp_warrior = 100

while True:
who_beats = random.randint(0, 10)
if warrior_1.hp_warrior == 0:
print('Победил Ваня')
break
elif warrior_2.hp_warrior == 0:
print('Победил Вася')
break
elif who_beats < 6:
warrior_2.hp_warrior -= 20
print('Вася дубасит Ваню')
print(f'У Вани осталось {warrior_2.hp_warrior} здоровья\n')
elif who_beats > 5:
warrior_1.hp_warrior -= 20
print('Ваня лупит Васю')
print(f'У Васи осталось {warrior_1.hp_warrior} здоровья\n')
я сделал так:

import random
class Voin:
def __init__(self, imya, zdorovie):
self.zdorovie = zdorovie
self.imya = imya

voin1 = Voin("Воин 1", 100)
voin2 = Voin("Воин 2", 100)

while voin1.zdorovie > 0 and voin2.zdorovie > 0:
udar = random.randint(1, 3)
if udar == 1:
voin1.zdorovie -= 20
print(f"{voin2.imya} (осталось здоровья = {voin2.zdorovie} ) атаковал {voin1.imya} (осталось здоровья = {voin1.zdorovie})")
else:
voin2.zdorovie -= 20
print(f"{voin1.imya} (осталось здоровья = {voin1.zdorovie} )атаковал {voin2.imya} (осталось здоровья = {voin2.zdorovie}) ")
if voin1.zdorovie > voin2.zdorovie:
print(f"Битва завершена, победил {voin1.imya}")
else:
print(f"Битва завершена, победил {voin2.imya}")
 """Решение задачи №1. Драка.""" 

import random


class Unit:
"""
Класс, описывающий воина.

Attributes
----------
name : str
Имя воина.
score : int
Очки здоровья воина (по умолчанию 100).

Methods
-------
strike(enemy):
Наносит удар объекту-противнику enemy.

"""

def __init__(self, name: str):
"""
Конструктор класса воина.

Parameters
----------
name : str
Имя воина.

"""

self.name = name
self.score = 100

def strike(self, enemy: object) -> None:
"""
Метод для нанесения удара противнику.

Parameters
----------
enemy : Unit
Объект врага, которому наносится удар.

Returns
-------
None

"""

enemy.score -= 20
print(f"Воин {self.name} нанес удар. У врага {enemy.name} осталось {enemy.score} очков")


if __name__ == "__main__":

# Список объектов-воинов.
units = [
Unit("Петров"),
Unit("Иванов"),
]

# Перебор списка воинов и поиск, у кого кончились очки.
while not False in [u.score > 0 for u in units]:

# Выбираем, кто наносит удар.
move = random.randint(0, len(units)-1)

# Формируем список врагов, кому можем нанести удар.
enemy_selection_list = units.copy()
enemy_selection_list.pop(move)

# Наносим удар случайно выбранному врагу.
units[move].strike(enemy_selection_list[
random.randint(0, len(enemy_selection_list)-1)
])

# Простой вариант решения.
#
# if move == 1:
# first_unit.strike(second_unit)
#
# elif move == 2:
# second_unit.strike(first_unit)
#
# else:
# raise ValueError("Неверный номер")

# Формируем список победителей.
winners = units.copy()
winners.remove([u for u in units if u.score
Import random не влез в скрин