Основы программирования на языке Python. Практика
Вы любите компьютерные игры? А задумывались ли когда-нибудь о создании собственной? В этой статье мы сможем попробовать себя в роли разработчика игр, используя ранее полученные знания.
Создание собственной RPG
В предыдущих выпусках мы с вами изучили темы:
- переменные и типы данных;
- математические операции;
- условные конструкции;
- циклы.
Подробнее об этом при необходимости можно прочитать в статьях «Основы программирования. Часть 1» и «Основы программирования. Часть 2».
Этих знаний нам достаточно, чтобы написать код, который сможет создать нашего персонажа, его противника — гоблина и просчитать исход битвы между ними.
Надеемся, вы любите этот жанр.
Начнем с создания нашего персонажа. Пусть это будет прекрасный рыцарь со здоровенной лошадью, мощным запасом здоровья и несколькими зельями здоровья на всякий случай.

Нам нужно создать следующие параметры:
- Имя рыцаря. Мы сами его придумаем и введем с клавиатуры — понадобится команда input().
- Количество здоровья рыцаря.
- Урон от его меча.
- Количество зелий здоровья.
Для показателей здоровья, урона и количества зелий будем использовать целые числа.
hero_name = input("Введите имя рыцаря: ")
hero_health = 100
sword_damage = 13
potions = 2
print("Герой по имени", hero_name, "отправляется в приключение")
Чтоб рыцарю жизнь медом не казалась, создадим ему на пути препятствие в виде противника — гоблина. Он также обладает каким-то запасом здоровья и собственным уроном.

goblin_health = 55
goblin_damage = 9
print("По пути герою встретился гоблин. У него", goblin_health, "здоровья, и он наносит урон", goblin_damage)
Создадим саму битву между ними. И это хороший способ применить бесконечный цикл — такое условие, когда цикл while никогда не сможет закончить свою работу. Запустим его повторяться по кругу, а завершим изнутри, когда один из участников битвы погибнет.
Нам понадобятся:
- Бесконечный цикл.
- Команда удара по гоблину — уменьшение его здоровья на значение нашего урона.
- Проверка здоровья гоблина — если оно опустилось ниже 0, завершаем цикл.
- Команда удара гоблина по рыцарю.
- Проверка здоровья рыцаря.
Мы будем атаковать первыми, потому что наш рыцарь сильнее, умнее и красивее гоблина.
print("Герой вступает в схватку с гоблином")
while True:
goblin_health -= sword_damage
if goblin_health <= 0:
print("Гоблин пал")
break
hero_health -= goblin_damage
if hero_health <= 0:
print("Рыцарь пал")
break

После битвы стоит проверить состояние здоровья рыцаря. Это будет хорошим примером вложенного условия — условия, находящегося внутри цикла и срабатывающего при каждом запуске тела цикла. Здесь может быть несколько вариантов.

- Рыцарь пережил сражение:
- если у рыцаря осталось мало здоровья (например, меньше половины), мы выпьем зелье, которое восстановит 50 очков здоровья;
- если же здоровья достаточно, зелье пить не будем.
- Рыцарь не пережил сражение, следовательно, пить зелье поздно.
if hero_health > 0:
print("Герой пережил сражение, у него осталось здоровья", hero_health)
if hero_health < 50:
print("Герой использует зелье исцеления, дабы залечить свои раны")
hero_health += 50
print("Теперь здоровья стало: ", hero_health)
potions -= 1
print("Зелий исцеления осталось:", potions)
else:
print("Уровень здоровья достаточный, исцеляться не нужно")
else:
print("Трагическая судьба настигла героя, слишком поздно пить зелье")

Полный код игры
Итак, полный код нашей программы:
hero_name = input("Введите имя рыцаря: ")
hero_health = 100
sword_damage = 13
potions = 2
print("Герой по имени", hero_name, "отправляется в приключение")
goblin_health = 55
goblin_damage = 9
print("По пути герою встретился гоблин. У него", goblin_health, "здоровья, и он наносит урон", goblin_damage)
print("Герой вступает в схватку с гоблином")
while True:
goblin_health -= sword_damage
if goblin_health <= 0:
print("Гоблин пал")
break
hero_health -= goblin_damage
if hero_health <= 0:
print('Рыцарь пал')
break
if hero_health > 0:
print("Герой пережил сражение, у него осталось здоровья", hero_health)
if hero_health < 50:
print("Герой использует зелье исцеления, дабы залечить свои раны")
hero_health += 50
print('Теперь здоровья стало: ', hero_health)
potions -= 1
print("Зелий исцеления осталось:", potions)
else:
print("Уровень здоровья достаточный, исцеляться не нужно")
else:
print('Трагическая судьба настигла героя, слишком поздно пить зелье')
Вывод программы будет следующим:
Введите имя рыцаря: Джордж Питонист
Герой по имени Джордж Питонист отправляется в приключение
По пути герою встретился гоблин. У него 55 здоровья, и он наносит урон 9
Герой вступает в схватку с гоблином
Гоблин пал
Герой пережил сражение, у него осталось здоровья 64
Уровень здоровья достаточный, исцеляться не нужно
Вот так мы с вами научились превращать простые идеи в код и даже написали игру. Но не стоит останавливаться только на этом. В статье «Практика анализа алгоритмов» мы разбираемся в том, какая изначальная идея была заложена в готовый код. Это очень полезный навык. Вы сможете разобрать любой код, написанный, например, одноклассником или коллегой-программистом из соседнего отдела.
Проверь себя
Поиграйтесь с кодом, который мы написали:
- Попробуйте поменять исходные значения на другие и найдите ситуации, при которых герою все-таки потребуется выпить зелье или он не переживет схватку.
- Сделайте так, чтобы изначальное значение здоровья рыцаря, урон его меча и количество его зелий также можно было вводить с клавиатуры.
Подсказка: не забудьте, что, если ввести число через команду input, оно будет восприниматься как строка. Для перевода строки в число можно воспользоваться командой int.
Ответы:
- Можно уменьшать здоровье или урон рыцаря и запусками программы проверять, достаточно ли он ослаблен.
- Можно заменить строки 2, 3 и 4 программы на следующие:
hero_health = int(input(“Введите количество здоровья: ”))
sword_damage = int(input(“Введите урон меча: ”))
potions = int(input(“Введите количество зелий: ”))