Глава 18 з 27

Безкоштовно

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

⏱️ 60-75 хвилин
📊 intermediate

Розділ 18: "Наша історія з вибором шляху"

Після насиченого дня в технопарку Аліса і Професор Біт вирішили відпочити в затишній кав'ярні неподалік. Байт зайняв місце біля зарядної станції, а Логік влаштувалась на спинці стільця.

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

— Як книги-ігри? — пожвавилась Аліса. — Я читала таку! Там потрібно було вибирати, що робити далі, і переходити на різні сторінки залежно від вибору.

— Саме так! — кивнув Професор. — Тільки ми створимо цифрову версію такої історії за допомогою програмування.

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

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

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

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

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

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

— Так! — кивнула Аліса. — Якщо умова виконується, то відбувається одна дія, а якщо ні — інша.

— Правильно, — посміхнувся Професор. — А в історіях з вибором шляху ці умови визначають, як буде розвиватись сюжет. Давай почнемо з простого прикладу:

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

if вибір.lower() == "вліво":
print("Ти пішов вліво і вийшов до тихої річечки.")
# Тут продовження історії для лівого шляху
elif вибір.lower() == "вправо":
print("Ти пішов вправо і виявив стару хатину.")
# Тут продовження історії для правого шляху
else:
print("Ти завагався, не знаючи, куди йти. Раптом піднявся вітер...")
# Тут продовження історії для невизначеного вибору

— Бачиш, як тут працюють умови? — запитав Професор. — Залежно від введення користувача історія піде одним з трьох шляхів.

— А що таке .lower()? — запитала Аліса.

— Добре питання! — похвалив Професор. — Це метод, який перетворює текст у нижній регістр. Так ми можемо правильно обробити відповідь, навіть якщо користувач напише "Вліво" або "ВЛІВО" замість "вліво".

— А як зробити історію довшою? — зацікавилась Аліса. — Адже після кожного вибору мають бути нові варіанти.

— Для цього ми можемо використовувати функції, — пояснив Професор. — Кожна функція буде представляти окрему "сцену" історії:

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

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

def річка():
print("Ти пішов вліво і вийшов до тихої річечки. Ти бачиш човен і міст.")
вибір = input("Що ти вибереш? (човен/міст): ")

if вибір.lower() == "човен":
човен()
elif вибір.lower() == "міст":
міст()
else:
берег()

І так далі для кожної сцени...

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

— Саме так! — підтвердив Професор. — І наша історія може мати безліч розгалужень і кінцівок. Ось схема простої історії:


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

— Як дерево! — помітила Аліса. — Кожен вузол — це вибір, а гілки — можливі шляхи.

— Відмінне порівняння, — кивнув Професор. — І що цікаво, така структура схожа на те, як працює наш мозок при прийнятті рішень. Ми аналізуємо можливі варіанти і їх наслідки, перш ніж зробити вибір.

Байт підкотився до столу і показав на своєму екрані код:
— А ось як можна додати в історію додаткові елементи — наприклад, інвентар гравця і перевірку наявності предметів:

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

def хатина():
print("Ти підходиш до старої хатини. Двері трохи відчинені.")

if "смолоскип" in інвентар:
print("У тебе є смолоскип, з яким не так страшно входити в темні місця.")
else:
print("Всередині темно, і тобі трохи страшно.")

вибір = input("Увійти в хатину чи пройти повз? (увійти/повз): ")

if вибір.lower() == "увійти":
if "смолоскип" in інвентар:
print("Ти освітлюєш шлях смолоскипом.")
відьма_дружня()
else:
print("У темряві ти спіткнувся і зробив шум.")
відьма_зла()
elif вибір.lower() == "повз":
print("Ти вирішуєш не ризикувати і йдеш далі.")
роздоріжжябіляхатини()
else:
print("Поки ти вагаєшся, двері хатини різко відкриваються...")
зустрічзвідьмою()

— Бачиш, — пояснив Професор, — тепер історія залежить не тільки від поточного вибору гравця, але й від попередніх дій. Якщо гравець знайшов смолоскип раніше, його зустріч з відьмою буде зовсім іншою.

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

— Дуже точне спостереження, — схвалила Логік. — Такі історії вчать аналізувати наслідки виборів і приймати відповідальні рішення.

— А чи можна додати випадковість в історію? — запитала Аліса. — Щоб не все залежало тільки від вибору гравця?

— Звичайно! — кивнув Професор. — Для цього ми можемо використовувати модуль 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 до 1
if шанс_втечі > 0.7: # 30% шанс на втечу
print("Тобі вдалося втекти!")
ліс()
return # Вихід з функції битви
else:
print("Втеча не вдалась! Монстр атакує!")
урон_монстра = random.randint(10, 20)
здоров'ягравця -= уронмонстра
print(f"Монстр наносить тобі {урон_монстра} урону!")

print(f"Твоє здоров'я: {здоров'ягравця}, Здоров'я монстра: {здоров'ямонстра}")

if здоров'я_гравця <= 0:
поразка()
else:
перемога()

— Тут ми використовуємо випадкові числа для визначення урону в бою і шансу на успішну втечу, — пояснив Професор. — Це робить кожне проходження історії унікальним.

— А ще можна додати лічильники, — запропонував Байт. — Наприклад, рівень дружелюбності персонажів до гравця, який буде впливати на їхню поведінку.

— Або очки досвіду і рівні, як у рольових іграх, — додала Аліса.

— Відмінні ідеї! — похвалив Професор. — Такі механіки роблять історію глибшою і знову можливою для гри. А тепер давай подумаємо про структуру нашої власної історії.

Завдання

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