Сегодня мы порешаем несколько популярных задач, которые встречаются в курсах по Питону
Часто при изучении функций предлагается решить такую задачку:
Давайте опишем пару сущностей player и enemy через словарь, который будет иметь ключи и значения:
name — строка, полученная от пользователя,
health = 100,
damage = 50.
Поэкспериментируйте с значениями урона и жизней по желанию.
Теперь надо создать функцию attack(person1, person2).
Примечание: имена аргументов можете указать свои.
Описание ниже решение достаточно примитивное. Можно сделать лучше и интересней, но для начального уровня и для решения задачи — подойдет
Рассмотрим по шагам. Для начала нужно импортировать библиотеку random, чтобы использовать её в своей функции. Для начала напишем саму функцию атаки
[code]def attack(person1, person2): #функция атаки с двумя параметрами
nice_shot = random.randint(1, 7) # рандом создает случайное целое число
if nice_shot >= 3: #условие рандома. В зависимости от созданного числа выполняем…
person2[‘health’] -= person1[‘damage’] #у второго параметра отнимаем значение damage,
return person1, person2[‘health’] #возвращаем результат
else:
person1[‘health’] -= person2[‘damage’] #и наоборот
return person1[‘health’], person2
Дальше пишем основной код, где будем её применять:
[code]#первый словарь — наш робот
my_wanzer = {
‘health’: 100, ‘damage’: 30, ‘name’:input(‘Введите имя Ванзера:’)
}
#второй словарь — робот соперника
OCU = {
‘health’: 140, ‘damage’: 20, ‘name’:input(‘Введите противника Объединённого Океанического Союза:’)
}
turn = 1 # указываем переменную, в которой хранится периодичность хода
while my_wanzer[‘health’] <= 0 and OCU[‘health’] <= 0: # цикл: условие ниже выполняется, пока жизнь игрока или жизнь противника не равна или больше нуля
if turn % 2 != 0: # если ход четный, то ходит игрок (у нас он уже начинается с единицы, так что начинает игрок)
my_wanzer,OCU = attack(my_wanzer,OCU) #применяем функцию attack (указав два параметра — на my_wanzer применяется person1, на OCU применяется person2)
else:
OCU,my_wanzer = attack(OCU,my_wanzer) #иначе наоборот
turn += 1 # добавляем счетчик хода
else: #если у кого-то кончились жизни, то
if my_wanzer[‘health’] > 0: #сравниваем ключ health из словаря player с нулём.
print(f»{my_wanzer[‘name’]} побелил. Поздравляем») #выводим результат, взяв ключ name из словаря игрока
else:
print(f»{OCU[‘name’]} победил. Попробуй еще раз») #иначе победил противник
Наша задача выполнена. Но иногда её дополняют еще одним условием
Давайте усложним предыдущее задание. Измените сущности, добавив новый параметр — armor = 1.2 (величина брони персонажа)
Теперь надо добавить новую функцию, которая будет вычислять и возвращать полученный урон по формуле damage / armor
Следовательно, у вас должно быть 2 функции:
1. Наносит урон. Это улучшенная версия функции из задачи 3.
2. Вычисляет урон по отношению к броне.
Примечание. Функция номер 2 используется внутри функции номер 1 для вычисления урона и вычитания его из здоровья персонажа случае
Это немного меняет нашу функцию атаки. Так же, по условиям, задачи создадим новую функцию, которая считает урон с учетом нового параметра armor
[code]def new_damage (damage, armor): # новая функция для вычисления урона, для вызова нужно передать два параметра
return damage / armor #функция возвращает результат деления параметра damage на armor
Теперь из второго параметра функции attack мы вычитаем не конкретное значение (person1[‘damage’]), а результат функции new_damage, не забывая при этом указывать и её оба параметра (мы задавали её с двумя параметрами — damage и amor)
[code]def attack(person1, person2):
nice_shot = random.randint(1, 7)
if nice_shot >= 3:
person2[‘health’] -= new_damage(person1[‘damage’], person2[‘armor’])
return person1, person2[‘health’]
else:
person1[‘health’] -= new_damage(person2[‘damage’], person1[‘armor’])
return person1[‘health’], person2
Вот и всё. Самое сложное в этой задаче правильно сопоставить параметры функции и применить их к ключам словаря.
[adace-ad id=»3475″]
