Задача 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'
Очень прошу помогите! Я не понимаю как сделать правильно
Python

Import random не влез в скрин
Помогите пожалуйста с задачей по python!
Раз метод атаки только уменьшает значение, то придётся "логи" из него вынести.
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('Ошибка ввода')
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('Ошибка ввода')
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')
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}")
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


Похожие вопросы
- Помогите пожалуйста с задачей на Python.
- Помогите пожалуйста с задачей на Python.
- Помогите пожалуйста с задачей на python!
- Помогите пожалуйста решить задачу на python
- Помогите пожалуйста с задачей на Python
- Помогите пожалуйста с задачей по python!
- Помогите пожалуйста с задачей по python!
- Помогите, пожалуйста, решить задачу Python
- Помогите пожалуйста решить задачу "Ход конём" в Python.
- Помогите, пожалуйста, с задачей Python , Яндекс практикум.