Глава 18 из 27

Бесплатно

5: Творческие проекты

⏱️ 60-75 минут
📊 intermediate

Глава 18: "Наша история с выбором пути"

После насыщенного дня в технопарке Алиса и Профессор Бит решили отдохнуть в уютном кафе неподалёку. Байт с удовольствием занял место у розетки, чтобы подзарядить батареи, а Логик устроилась прямо на спинке стула Алисы.

— Знаешь, Алиса, — начал Профессор, задумчиво помешивая чай, — всё, что мы узнали о программировании и работе мозга, можно отлично применить в творчестве. И сегодня я хочу предложить тебе создать кое-что особенное — интерактивную историю с разветвлённым сюжетом.

— Как в книгах-играх? — оживилась Алиса. — Я читала такую! Там на каждой странице нужно было выбирать, что делать дальше, и перелистывать на разные главы в зависимости от выбора.

— Именно! — кивнул Профессор. — Только мы создадим свою собственную цифровую версию такой истории с помощью кода.

Он отложил ложечку, посмотрел в окно на спешащих прохожих и негромко произнёс:

Вся наша жизнь — невидимый маршрут,
Где каждый шаг рождает новый вектор.
Куда твои решения ведут?
В какой из неразведанных проектов?

Налево шаг — и встретишь чудеса,
Направо шаг — и ждут тебя загадки.
Твой выбор направляет паруса,
Меняя мир в заложенном порядке.

И, словно ветви мощного ствола,
Растут сюжеты, множа варианты.
Твоя игра сегодня ожила,
Раскрыв в тебе незримые таланты!

Профессор достал планшет и открыл редактор кода:

Интерактивная история: блок-схема — лес, река или хижина

— Интерактивная история — это идеальный способ на практике применить условные конструкции, которые мы изучали. Помнишь, как работают условия if-else?

— Да! — кивнула Алиса. — Если условие выполняется, то происходит одно действие, а если нет — другое.

— Верно, — улыбнулся Профессор. — А в историях с выбором пути эти условия определяют, по какой ветке пойдёт сюжет. Давай начнём с самого простого примера:

python
print("Ты стоишь на развилке в тёмном лесу. Тропинка расходится влево и вправо.")
выбор = input("Куда ты пойдёшь? (влево/вправо): ")

if выбор.lower() == "влево":
print("Ты пошёл влево и вышел к тихой речке.")
# Здесь будет продолжение истории для левого пути

elif выбор.lower() == "вправо":
print("Ты пошёл вправо и обнаружил старую хижину.")
# Здесь будет продолжение истории для правого пути

else:
print("Ты замешкался, не зная, куда идти. Внезапно поднялся ветер...")
# Здесь будет продолжение, если игрок ввёл что-то непонятное

— Видишь, как здесь работают условия? — спросил Профессор. — В зависимости от ответа пользователя история пойдёт по одному из трёх путей.

— А что делает команда .lower()? — спросила Алиса, внимательно изучая код.

— Очень хороший вопрос! — похвалил Профессор. — Это метод, который превращает любой текст в маленькие буквы (нижний регистр). Благодаря ему программа правильно поймёт игрока, даже если он напишет "Влево" с большой буквы или нажмёт Caps Lock и введёт "ВЛЕВО".

— А как сделать историю длиннее? — поинтересовалась Алиса. — Ведь после каждого шага должны появляться всё новые и новые варианты.

— Для этого мы будем использовать функции, — объяснил Профессор. — Каждая функция def будет представлять отдельную "сцену" нашей истории:

python
def начало():
print("Ты стоишь на развилке в тёмном лесу. Тропинка расходится влево и вправо.")
выбор = input("Куда ты пойдёшь? (влево/вправо): ")

if выбор.lower() == "влево":
река()
elif выбор.lower() == "вправо":
хижина()
else:
ветер()

def река():
print("Ты пошёл влево и вышел к тихой речке. Ты видишь лодку и хлипкий мост.")
выбор = input("Что ты выберешь? (лодка/мост): ")

if выбор.lower() == "лодка":
лодка()
elif выбор.lower() == "мост":
мост()
else:
берег()

И так далее для каждой новой сцены...


— А, теперь понятно! — воскликнула Алиса. — Каждая функция — это как отдельная страница в книге-игре. И в зависимости от выбора мы переходим к разным функциям, как к разным страницам.

— В точку! — подтвердил Профессор. — И наша история может иметь десятки разветвлений и концовок. Смотри, вот схема простой истории:

text
начало
├── река
│ ├── лодка
│ │ ├── остров
│ │ └── водопад
│ └── мост
│ ├── деревня
│ └── тролль
└── хижина
├── войти
│ ├── добрая_ведьма
│ └── злая_ведьма
└── мимо
├── гора
└── поляна

— Похоже на дерево! — заметила Алиса. — Каждый выбор — это узел, а варианты ответа — это ветви.

— Отличное сравнение, — кивнул Профессор. — И, что интересно, эта структура очень похожа на то, как работает наш собственный мозг при принятии решений. Мы анализируем возможные варианты и их последствия на несколько шагов вперёд.

Байт мигнул экраном и вывел на него новый фрагмент кода:
— А вот как можно добавить в историю крутые игровые элементы! Например, рюкзак (инвентарь) и проверку того, есть ли у игрока нужный предмет:

python
инвентарь = [] # Пустой список для предметов игрока

def хижина():
print("Ты подходишь к старой хижине. Дверь слегка приоткрыта.")

if "факел" in инвентарь:
print("У тебя есть факел, с которым не так страшно заходить в тёмные места.")
else:
print("Внутри кромешная тьма, и тебе немного страшно.")

выбор = input("Войти в хижину или пройти мимо? (войти/мимо): ")

if выбор.lower() == "войти":
if "факел" in инвентарь:
print("Ты уверенно освещаешь путь факелом.")
добрая_ведьма()
else:
print("В темноте ты спотыкаешься о ведро и сильно шумишь.")
злая_ведьма()

elif выбор.lower() == "мимо":
print("Ты решаешь не рисковать и идёшь дальше.")
развилкаухижины()

else:
print("Пока ты колеблешься, дверь хижины резко открывается...")
встречасведьмой()

— Видишь, — пояснил Профессор, — теперь развитие сюжета зависит не только от того, что игрок выбрал прямо сейчас, но и от его прошлых действий. Если он нашёл факел в самом начале игры, встреча с ведьмой пройдёт совершенно иначе.

— Это как причинно-следственные связи в реальной жизни! — заметила Алиса. — Наши прошлые решения влияют на будущие события.

— Очень тонкое наблюдение, — одобрительно чирикнула Логик. — Такие игры учат анализировать последствия своих выборов и принимать ответственные решения.

— А можно добавить в историю какую-нибудь случайность? — глаза Алисы загорелись азартом. — Чтобы не абсолютно всё зависело от игрока, а была доля везения?

— Конечно! — улыбнулся Профессор. — Для этого в Python есть специальный модуль random. Давай напишем функцию настоящей битвы с монстром:

python
import random

def битва():
здоровье_игрока = 100
здоровье_монстра = 80

print("Из кустов выпрыгнул страшный монстр! Началась битва!")

# Бой продолжается, пока оба живы
while здоровьеигрока > 0 and здоровьемонстра > 0:
выбор = input("Что ты сделаешь? (атака/защита/побег): ")

if выбор.lower() == "атака":
урон_игрока = random.randint(10, 25) # Случайный урон от 10 до 25
здоровьемонстра -= уронигрока
print(f"Ты бьёшь мечом и наносишь монстру {урон_игрока} урона!")

if здоровье_монстра > 0:
урон_монстра = random.randint(5, 15) # Ответный удар
здоровьеигрока -= уронмонстра
print(f"Монстр атакует в ответ и наносит {урон_монстра} урона!")

elif выбор.lower() == "защита":
урон_монстра = random.randint(1, 10) # Урон снижен благодаря защите
здоровьеигрока -= уронмонстра
print(f"Ты ставишь блок! Монстр наносит всего {урон_монстра} урона.")

elif выбор.lower() == "побег":
шанс_побега = random.random() # Случайное число от 0.0 до 1.0

if шанс_побега > 0.7: # 30% шанс на успешный побег
print("Тебе удалось ловко сбежать!")
лес()
return # Завершаем функцию битвы
else:
print("Побег не удался! Монстр хватает тебя за плащ!")
урон_монстра = random.randint(10, 20)
здоровьеигрока -= уронмонстра
print(f"Монстр наносит тебе {урон_монстра} урона!")

print(f"Твоё здоровье: {здоровьеигрока} | Здоровье монстра: {здоровьемонстра}\n")

if здоровье_игрока <= 0:
поражение()
else:
победа()

— Здесь мы используем случайные числа random.randint, чтобы определять силу удара и шанс на побег, — объяснил Профессор. — Это делает каждое новое прохождение истории уникальным и непредсказуемым.

— А ещё можно добавить скрытые счётчики, — подхватил Байт. — Например, уровень "дружелюбности" других персонажей к игроку. Если ты всем хамишь, они перестанут тебе помогать!

— Или очки опыта, чтобы повышать уровни, как в настоящих RPG-играх! — добавила Алиса.

— Потрясающие идеи! — похвалил Профессор, допивая свой чай. — Такие механики делают игру по-настоящему глубокой, и в неё хочется играть снова и снова. Ну что ж, инструменты у тебя есть. Давай придумывать сюжет для твоей первой собственной игры!


Задание

Придумай свою интерактивную историю с выбором пути. Нарисуй схему истории, где каждый узел — это сцена, а ветви — возможные выборы. Напиши краткое описание начала истории и первых вариантов выбора. Подумай, какие элементы ты хотел(а) бы добавить: инвентарь, случайные события, счётчики. История может быть о чём угодно: приключении в фантастическом мире, детективном расследовании, путешествии во времени или просто о школьной жизни.