Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Як писати інтерактивну літературу?

leave a comment »

Взагалі, то тут не буде ніяких порад про побудову сюжету, світу, чи персонажів. Для цього можете прочитати наприклад “Як писати фантастику?“. Зараз я хочу розказати про загальні принципи конструювання таких ігор, з висоти мого трьохденного (ну, насправді трохи більше, бо я цим цікавлюсь давно) досвіду. І звісно, на прикладі мови Python, бо TADS і Inform мене не цікавлять через неуніверсальність.

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

9882724_970b0d660d

Ввід

Крім того способів текстового вводу є два – меню, і набір команд. Опишу переваги і недоліки кожного:

Команди

Текстові ігри розробляють так, щоб вони розуміли людську мову. Наприклад:

>Взяти камінь і кинути його в охоронця

За розуміння подібних фраз відповідає штуковина, що називається парсером, або синтаксичним аналізатором. Вона перетворює текст в набір змін які відбуваються з середовищем гри. Таких аналізаторів вже існують тисячі, але вони на жаль, придумані для мов програмування. Людські мови складніші для розуміння, особливо українська. Розробкою нормального аналізатора для неї займається наука про штучний інтелект.

Тому зазвичай синтаксис команд обмежують. Наприклад спочатку має бути дія, потім її обєкт. Наприклад:

>взяти камінь
>йти вперед

Важливим є знання гравцем словника гри, тобто всіх слів які він може використати для побудови команди. Хоча автор “Старовинного храму” зі мною не погоджується. Якщо ми наприклад оголошуємо що в програмі є слово “розбити”, то коли гравець побачить дзеркало, він здогадається що його можна розбити, що зробить гру більш схожою на менюшну (див нижче). Але зате гравець не має думати яке ще дієслово вибрати для того, що він хоче зробити.

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

Меню

Менюшні ігри просто дають гравцеві вибір з кількох варіантів. Наприклад:

- Взяти камінь
- Йти вперед

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

Програмувати таку гру простіше, можна навіть звичайним гіпертекстом. Тільки дослідження світу стає вже не таким захоплюючим. Бо в пункти меню не додають команду “оглянути”, для кожного предмету, який присутній в сцені.

А взагалі, між обома варіантами завжди можна знайти компроміс. Наприклад динамічно генерувати набір варіантів.

Види команд

Команди грі можна поділити за функціональністю:

  • Дослідження світу – команди, які тільки виводять інформацію про середовище. Зазвичай обходяться тільки візуальним каналом, але вітаються команди типу “слухати”, “прислухатись”, “нюхати”, чи навіть “доторкнутись”. Але можна не додавати спеціальні команди, для таких видів інформації, а виводити її через дивитись. Наприклад:
    Ліс>дивитись
    
    Ти стоїш в красивому зеленому лісі. Сонячне проміння ледь пробивається крізь листя дерев. Десь високо в гіллі щебечуть пташки. Повітря свіже і чисте. Тільки куди йти далі? Всюди, як не кинь оком непролазні хащі.
    
  • Навігації Тут все залежить від розмірності світу. Можна наприклад додати команди для чотирьох виходів. Можна додати ще один вимір, і писати вверх та вниз. А можна просто брати до уваги тільки топологію простору, і команди будуть залежати від того, де знаходиться персонаж.
  • Взаємодії з світом – ці команди програмувати найскладніше, бо вони вимагають не просто вибору інформації з структури даних, чи зміни координат персонажа. Сюди входить всякі переміщення предметів, дії над ними, чи взаємодія з іншими персонажами. Це трохи складніші операції, і можуть для кожного предмету писатись по іншому.

Світобудова

Знову ж таки, в комп’ютерах все дискретно. Можна створити якийсь неперервний світ, але більшість інтерактивної літератури, відбувається в скінченному дискретному світі. Позицію в такому світі називають локацією. (Варто зауважити, що класична література теж дискретна, хоча це маскується плавністю розповіді. Візьміть наприклад Володаря Кілець. Хоча маємо доволі щільну карту, але основна дія відбувається в конкретних місцях, таких як таверни, ельфійські ліси, річкові переправи, фортеці чи вежі. )

Між локаціями існують переходи, по яких рухається гравець. Часом в такому переході ставлять додатковий сценарій (або англійською скрипт, що для Пайтона має додатковий зміст 😉 ) Наприклад гравець не пройде, якщо не має якогось предмету, чи не піднято прапор.

Прапор – це елемент світу, який не видно в самій грі. Зазвичай він опущений чи піднятий (має булевий тип), але може містити і числа та текст. Наприклад, якщо гравець поговорив з якимось персонажем, наступного разу персонаж його впізнає. Прапор “гравець поговорив з персонажем” піднято. Те ж саме з дверми (чи якимись іншими переходами між локаціями).

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

Порившись в кишенях ти знаходиш:
рюкзак - Вмістимий, зручний наплічник, що дозволяє носити багато речей


Сценарії
– це послідовності дій, які виконуються за певних умов. Наприклад гравець входить в локацію, і функція змінює якийсь прапор. Чи функції які приєднуються до предметів, щоб їх використовувати. Наприклад використання пістолета зменшує кількість патронів, і кількість живих персонажів в локації. 🙂

Як це зробити на Пайтоні

Як я недавно виявив на Python це все робити дуже просто. Кожен предмет чи локацію
можна представити словником (записом), в якому є такі ключі (поля):

Поле Лок Об Опис
view + + Опис.
name + Назва предмету,обов’язкова для його ідентифікації. Локації зберігаються в словнику, тому, замість цього поля виступає ключ.
items + + Список предметів які містяться всередині.
use + Посилання на функцію, яка виконується коли предметом користуються.
script + Функція яка виконується при вході в локацію. Вона відповідає за те чи гравець в неї попаде

Між клавіатурним вводом, і виконанням має стояти синтаксичний аналізатор, але я обійшовся простіше.

commands=	{
		"кін":GameFinish,
		"вих":GameFinish,

		"доп":GameHelp,
		'дов':GameHelp,

		'див':View,
		'киш':Inventory,

		'йди':GoTo,
		'йти':GoTo,
		
		'взя':GetItem,
		'бра':GetItem,
		'віз':GetItem,

		'вик':DropItem,
		'зал':DropItem,
		'пок':DropItem,

		'зас':UseItem
		}

І взагалі, якщо хтось має ще якісь питання про написання такого роду речей, можете звертатись. Якщо напишете якийсь шедевр, дайте почитати.

Advertisements

Written by bunyk

Листопад 6, 2009 at 00:06

Оприлюднено в Кодерство

Tagged with ,

Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: