Постановка задачи: текстовый квест
В большинстве уроков мы будем создавать небольшой проект, который можно будет использовать на практике. И первое, чем мы займемся — это создание собственного текстового квеста. В процессе такой игры вам рассказывают про события, которые происходят с вашим героем, и вы периодически должны делать выбор, как ваш герой поступит. В зависимости от этого сюжет игры меняется. Игра в текстовый квест похожа на чтение книги, в которой вы сами можете влиять на сюжет.
Также, как и в настольной ролевой игре (а такие тоже бывают), в текстовом квесте вам нужно принимать решения в различных ситуациях, только играете вы в одиночку, а вместо ведущего — компьютер или мобильное устройство.
Текстовый квест может быть как интерактивным рассказом, так и полноценной бродилкой или рпг с подбором предметов, квестами и сражениями, просто вместо 3д графики — текст и картинки, записанные символами. Если чуть позже добавить графику, то получится уже интерактивная новелла (комикс с возможностью выбора, например, бесконечное лето) или интерактивный сериал (как, например, игры от Telltale Games или эпизод Bandersnatch черного зеркала от Netflix).
Вот несколько примеров (и еще примеров) таких игр, в которые вы можете попробовать поиграть на досуге. Очень советую попробовать поиграть перед тем, как придумывать свой.
Как спроектировать квест?
Если мы хотим придумать собственный тестовый квест, нам понадобится какая-то схема, чтобы описать его сценарий.
Если бы мы писали книгу, все было бы просто — ее сюжет был бы линеен и события разворачивались последовательно. А вот в случае с текстовыми квестами все сложнее — сюжет зависит от выбора пользователя, и надо как то фиксировать, какие события случаются при каких условиях.
Если задуматься, то окажется, что в этом плане текстовые квесты очень похожи на обычные настольные бродилки.

Любой текстовый квест состоит из частей информации, которую программа сообщает пользователю между которыми игрок должен сделать выбор, или иными словами, что-то ввести.
В зависимости от выбора, случайности (а в настолках — от кубиков), наличия предметов в инвентаре или предыдущих действий игроку выводится следующая информация.
Если нарисовать рисунок, в котором точками будут части текста, а переходы между ними стрелочками, то у нас получится схема, которую математики называют ориентированным графом. Давайте так и назовем его — граф игры.
Варианты квестов
Если пробовать рисовать графы квестов от совсем простых к более сложным, то у нас получиться три разных варианта.
1. Самый простой: линейный квест (квест-линия).
В линейном квест программа игра просит пользователя что-то ввести, но в конечном итоге это никак не влияет на сюжет. Например, программа может запоминать имя персонажа, название его фермы, кличку любимый собаки, но в игре с любом случае будет ферма и собака, и собака будет жить на ферме, и игрок в любом случае ее покормит, просто имена у героев меняются. С одной стороны ничего особенного, а с другой — приятно.

2. Квест с ветвлением (квест-дерево).
В этом варианте у пользователя появляется возможность сделать выбор, и от этого выбора правда зависит сюжет. Вместо выбора может использоваться генерация случайного числа, но есть один нюанс — мы никогда не возвращаемся обратно, т.е. у нас нет возможности ходить по кругу и что-то собирать — движение только вперед.

Кстати, почему дерево? Деревом в дискретной математике называется граф без циклов, т.е. тот, в котормо нельзя ходить кругами (как раз наш случай). Визуально он правда похож на перевернутое дерево.
3. Произвольный квест с инвентарем (квест-граф).
Самый крутой вариант — у нас нет никаких ограничений на перемещение по нашей «карте», а еще мы можем подбирать предметы, от которых зависит сюжет (возможность перемещения или текст в некоторых точках).

План действий
План действий следующий.
- Придумать название и сюжет для квеста.
- Нарисовать его граф, чтобы примерно представить сюжет.
- Запрограммировать квест на питоне.
- Протестировать и исправить все баги.
- Провести бета-тест среди друзей и собрать обратную связь.
Кажется, что все более менее реализуемо, кроме, пока что, среднего пункта — «запрограммировать». Но это ненадолго, уже в следующем уроке ты научишься описывать на питоне произвольные текстовые квесты, для чего понадобится:
- установить питон на компьютер и использовать IDLE для вычислений (уже сделали!);
- научиться выводить текст на экран и просить пользователя вводить ответы (уже можно будет сделать линейный квест);
- разобраться с условным оператором, чтобы создавать квесты с ветвлением;
- научится создавать свои функции, использовать глобальные переменные и рекурсию для созданий сложных квестов с возвратами и инвентарем;
- объединить все это, использовать ascii графику, добавить звуки и разбить на несколько модулей, чтобы создать итоговую версию квеста.
Выглядит план, скорее всего страшно, но ты точно справишься!
Программируя историю, или путешествие блудного IFa!
Всем привет! Меня зовут Никита, и я обожаю игры. Причем мне доставляет удовольствие играть в игры самых разных жанров, от тактических игр вроде XCom, до ураганных шутеров вроде Doom. Об одном из моих любимых жанров, частички которого сейчас содержит в себе большинство современных игр, мы сегодня и поговорим.
Дамы и господа! Встречайте, его величество, ТЕКСТОООВЫЫЫЙ КВЕЕЕСТ! Под катом — история жанра и работы ребят с курса «Питон для начинающих».
А большинства современных геймеров возникнет закономерный вопрос: «Что это за зверь такой?»
> Текстовый квест — это довольно старый жанр компьютерных игр, суть которого состоит в том, чтобы взаимодействовать с игроком посредством текстового ввода. > > В английском данный жанр получил название Interactive fiction (интерактивная литература), так что представителей этого жанра частенько называют IF-ами.
В текстовых квестах выделяют два в вида взаимодействия с игроком:
- интерфейс с вводом текста с клавиатуры;
- интрефейс в виде меню, где игрок выбирает действие из нескольких предложденных
Первый вид квестов подразумевал ввод простых команд для перемещения (например, enter (войти), take( * ) (поднять что-то) и т.д.), которые позволяют персонажу перемещаться по миру игры и взаимодействовать с ним.
Такие квесты в свое время завоевали широкую популярность. Ведь только представьте, раньше были просто книжки, а теперь вдруг ты получаешь свободу выбора. Больше не нужно мысленно проклинать персонажей за глупое поведение, ведь это ты его ведешь (ну, можно разве что себя). Тогда и правда, казалось чем-то новым и захватывающим.
Первым общеизвестным представителем является Colossal Cave Adventure. Впервые эта игра запущена в 1975 году Уиллом Кроутером и Доном Вудсом. Это дядьки определенного знают свое дело, что они являются выпускниками известных технических вузов США.

Первая версия игры была написана языке FORTRAN, для платформы. как бы сказать. для серверов PDP-10. М-да. Даже такая не слишком объемная, по современным меркам игра требовала целого сервера для запуска! Тем не менее позже она была расширена и выпущена на кучи остальных платформ, от древнего DOS, до современных Windows.
CCA как раз относилась к первому типу квестов, вводя команды в консоль, вы продвигались по сюжету игры. Сначала мы стоим у дороги, а вот мы уже у леса, и вот мы уже исследуем мистическую пещеру, к которой и отсылает нас название игры. В нее можно по играть и сейчас. Во-первых, яндекс воплотила ее в Алисе, во-вторых, на мобильных устройствах, в частности на android, в-третьих, есть версия для Python и даже в браузера.
Да, даже сейчас вариативность старых квестов просто поражает даже на фоне современных игр. Хотя почему даже? Сейчас каждый лишний выбор означает дополнительный объем работы для разработчиков связанный и с анимациями, и новыми персонажами, локациями и многим другим. С другой стороны, это и делает жанр настолько уникальным!
Популярность квестов не прошла бесследно. Популярность CCA привело в будещем к появлению полноценных коммерческих проектов, таких как Zork, Trinity, Planetefall и десяткам прочих.
Позже, конечно, рынок текстовых квестов ослаб на волне роста компьютерных мощностей. Стали появляться квесты в том, числе и с графической оболочкой, например, поинт-энд-клик адвенчуры, и прочие расширения исходной концепции текстовых квестов. Кто-то может заявить, что теперь-то жанр точно пал смертью храбрых, однако нет и еще раз нет! Текствые квесты отомрут только, если отбросит коньки вся игровая индустрия. Загадочные уши текстовых квестов сейчас можно встретить практически в любой игре, от РПГ до стратегий, вы и сами, наверняка, вспомните пару игр типа Mass Effect, Fallout, Planescape Torment, DreamFall, которые позволяют нам, игрокам, делать выбор и решать судьбу игрового мира. Про работы Quantic dream или TellTales я вообще молчу.

Мало того, сейчас разработчики не брезгуют разработкой и современных текстовых квестов. Некоторые современные представители запускаются прямо в браузере n еще а браузере, другие осваивают мобильные просторы, а особо продвинутые разработчики поместили квест в телегерам-бота. У нас даже есть статья, как сделать такой квест!
Пройдясь по такой куче представителей жанра, уверен у многих возник в голове порыв, который звучит, как: «Я тоже хочу. «. И сейчас целая куча способов воплотить свой квест в реальность.
Например, мы на курсе предлагаем создавать ученикам текстовый квест на python. Для нас он является важным образовательным иструментом, поскольку с одной стороны текстовые квесты достаточно просты, но в тоже время их объем позволяет наработать практические навыки программирования.
На прошлой неделе ребята с курса «Питон для начинающих» завершили свои работы, так что я решил ими поделиться. Начнем по порядку.
1. Самосбор (работа Александра Ерченкова).
Мы попадаем в мир суровой антиутопии. Все окружение отдает чем-то советским, так что при игре кажется, что читаешь роман Стругатских или Замятина.
Самосбор — загадочное явление в мире игры, которое несет смерть каждому, кто не найдет герметичного укрытия. Мы играем. а впрочем это серьезный спойлер, если я скажу, за кого мы играем, так что поиграйте сами и узнаете. Ваш ждут и погони и прятки, а иногда гибель, так что будьте внимательны к своим выборам.
Если хотите поиграть в полноценную версию у себя на Python, то вы скачать полноценный проект Самосбор с [github] (https://github.com/teqnot/waffles). Если вы пока не владете Python, но вам все равно интересно ознакомиться с проектом, то велком на repl, где вы можете запустить проект прямо в браузере только без звука.
2. Ночное пробуждение (работа Никиты Тищенко).
От суровой антиутомии мы переходим к кровавому триллеру! Мы просыпаемся в странном доме, где творится не весть что. Наша задача очевидна — покинуть дом на своих двоих. Мы будем исследовать коридоры и комнаты на предмет вспомогательных принадлежностей, которые помогут нам сбежать. Кто же вас похитил? И как вам теперь дествовать? Ответом на эти вопросы и придется заниматься игрокам.
Полная версия игры для запуска на Python доступна в github, а онлайн версия без звука в repl. Удачно выбратся живым! Или нет. МУХАХАХАХА
3. Невинное утро (работы Софии Болотовой).
От прочих работы Софии отличается теплой и уютной атмосферой. Здесь нет головокружительных погонь или перестрелок, да и триллиру, который часто присущ современным текстовым квестам, здесь места нет. Взамен мы погружаемся в жизнь юного героя утренней истории. Нас встречает мальчик шести лет с полной цветовой слепотой, мы следуем за его утренним пробуждением и наивными похождениями.
Если вы устали от слишком остросюжетных историй, то квест Сони вам подходит идеально. Ознакомиться с полной версией квеста на Python можно на github, а с онлайн версией без звука на repl.
Вот такие проекты получились у наших ребят. Надеюсь, и вы оцените их по достоинству.
Спасибо за прочтение и до следующей статьи! Пока!
P.S. Название статьи является двойной отсылкой: одна из них очевидна, попробуйте найти вторую!
Как создать квест-игру на Python в Minecraft — обучение Python для детей и начинающих
Рассказываем, как запрограммировать игру с уровнями в Minecraft с помощью языка Python.
437 показов
903 открытия
Игровая вселенная Minecraft уже несколько лет используется в образовательных целях — а все благодаря элементам геймификации. Детям проще обучаться в виртуальном мире, в окружении любимых персонажей и в знакомой среде. Такие игровые детали позволяют удерживать внимание ребят и мотивируют их продолжать обучение. За какой бы предмет они ни взялись, будь то покорение иностранного языка, математики или физики, в «Майнкрафте» они будут ассоциироваться с чем-то увлекательным, а, главное, актуальным, ведь все теории можно будет рассмотреть на примере.
Помимо классических школьных предметов, в «Майнкрафте» дети могут также изучать программирование. Если подключить к платформе популярный язык программирования Python, то можно создавать различные объекты, используя текстовый код. Это отличная возможность познакомить детей с логикой программирования, не отрывая их от любимой игры.
В Minecraft можно не только проектировать постройки, но и разрабатывать собственные мини-игры. Онлайн-школа программирования для детей «Пиксель» делится бесплатным уроком по созданию игры-квеста в Minecraft с помощью языка Python.
В данной игре пользователю предстоит искать спрятавшиеся алмазные блоки, получая при этом очки опыта. Очки опыта нужны для повышения уровня. Повышать уровни можно бесконечно, при этом каждая ступень будет становится все сложнее и сложнее.
В конце материала мы добавим видеоинструкцию — если вам удобнее воспринимать информацию в таком формате, можете сразу переходить к ролику. А также прикрепим полный скрипт для разработки игры.
Установка необходимых программ
У нас есть подробные инструкции по установке Minecraft и IDLE (редактор для Python) на ПК:
Если вы еще не знакомы с программированием в Minecraft, мы рекомендуем начать с коротких пошаговых уроков. Этот плейлист знакомит детей с основами кодинга и учит создавать базовые постройки с помощью Python: от простых стен и зданий до целой улицы с домами.
Создание скрипта на Python с нуля
Создадим python-файл под названием quest. Импортируем четыре модуля: minecraft, block, time, random. В переменную mc поместим команду для проведений операций в игре.
Очки опыта будут храниться в переменной exp. Название переменной идет от английского слова experience, что означает опыт. Значение уровня поместим в переменную level. В качестве значения будет единица. Для повышения уровня требуется какой-то ориентир, на который программа будет опираться. Этим ориентиром послужит переменная up со значением 1000. Когда персонаж достигнет этого значения, уровень повысится.
Блок будет появляться рядом с персонажем. Радиус поиска будет составлять пять блоков — именно это число мы поместим в переменную radius. Игроку необходимо знать, сколько времени прошло от начала игры. Для этого мы создадим переменную allTime.
В чат выведем приветствие и правила игры: заработать как можно больше опыта, выделение минуты на поиск каждого блока, получение пятисот очков за каждый блок, задача — набрать 1000 очков для перехода на второй уровень. Если игрок не успел найти блок, то игра заканчивается.
Останавливаем программу на 10 секунд благодаря команде time.sleep(10). Этого должно хватить для прочтения правил. Если считаете, что нужно оставить больше времени на ожидание, то просто увеличьте число в скобках.
Логика игры
Определим функцию под названием quest. Здесь будем хранить основную логику игры. Командой global обозначим переменные level, exp, radius, allTime. Данная команда нужна для вызова переменных, которые находятся за пределами функции. Особенно важно помечать переменные командой global, когда мы хотим их изменить. Ниже определим позицию персонажа в переменную pos. В r1 и r2 поместим команды, которые делают генерацию случайных чисел в определенном промежутке. В нашем случае этим промежутком является радиус от отрицательного значения до положительного, то есть от -5 до 5.
В x и z поместим координаты персонажа, прибавленные к случайным числам. Таким образом мы получим случайное место на карте недалеко от персонажа. А в y поместим функцию mc.getHeight. С ее помощью блок будет создаваться на поверхности ландшафта: например, на траве, воде, дереве и на других элементах окружающей среды. В скобки поместим x и z, чтобы объяснить программе, на каком именно участке создавать блок.
Команда mc.setBlock создаст алмазный блок. Поместим в скобки x, y, z и команду алмазного блока. В timer поместим число 60. Как вы уже догадались, здесь будет храниться время, за которое персонаж должен найти блок. Переменная found отвечает за отчетность о нахождении блока. Пока поставим false, потому что блок изначально не найден.
Циклом while обозначим, что пока очков меньше предела для повышения и пока блок не найден (команда not играет роль отрицания), будет исполняться следующий код: запускаем функцию info (она у нас еще не написана, поэтому расскажем о ней позже), к общему времени allTime прибавляется единица, переменная hits хранит в себе команду для распознавания касаний по блоку, циклом for считываем эту переменную, далее в bp поместим позицию, где произошло это событие, добавляем условие: если клик произошел на месте созданного блока, то блок считается подобранным, в копилку опыта зачисляется 500 очков, в чат выводится информация об этом, переменная found сообщает наличием значения True, что блок найден, затем следует прекращение цикла посредством команды break.
Цикл while все это время делал паузу в одну секунду, чтобы работа таймера была корректной. Если время на поиск блока истекло, то об этом пишется в чат, блок исчезает, выводится статистика игры, уровень падает на значение 0 и команда break прекращает работу цикла.
Настало время написать функцию info. В ней тоже объявляем целый ряд глобальных переменных. Команду для считывания чата помещаем в переменную chat. Считываем ее циклом for. Для хранения сообщения из чата создадим переменную m. Добавим условие: если в чат пропишется команда info, то игрок увидит статистику своей игры на данный момент.
Объявим цикл while, работающий, пока уровень не будет равен нулю. А он равен нулю только тогда, когда игрок не успел найти блок за отведенное ему время. В цикл помещаем функцию quest для ее запуска. Без этого функция работать не будет. Добавим условие: если опыта будет больше, либо он будет равен нужному порогу, то повышается уровень, порог для следующего уровня и радиус поиска удваиваются и происходит вывод этой информации в чат.
Настало время проверить игру на деле.
Если вы хотите создать другую квестовую игру или получить навыки для усложнения квест-игры из этого урока, заглядывайте к нам на YouTube-канал. Мы регулярно публикуем ролики по разработке проектов внутри Майнкрафта: от построения небоскребов, космических ракет и лесов до программирования полноценных игр.
Текстовый квест на языке python
Я собирался сделать текстовый квест на языке python, ранее не занимаясь этим (опыта в использовании python у меня нет) по заранее сделанному учеником 11 класса текстовому квесту.
Моей задачей было сделать такую же программу на ту же тему, но изменить сюжет и структуру программы.
Я подумал, что это будет легко — просто посмотрю, как кто-то сделал это так, перемещу эту часть вон туда, а ту вот сюда и совмещу с третей.
Тут то как раз таки и начались проблемы с не знанием операторов, значений символов и уровневых-логических зависимостей.
Вот код текстовой игры про подземелье ученика 11 класса:
print ("Dungeon quest") print ("*********************************************************") print ("Вы просыпаетесь ,в незнакомой комнате ,с похмелья у вас сильно болит голова ") print ("нажмите ,|1| чтобы осмотреться") a =int(input()) while a!=1 : a=int(input()) print ("*********************************************************") print ("*Вы осматриваете комнату*") print ("Вокруг темная , сырая комната , состоящая из заплесневелых холодных камней , в конце комнаты находится дверь , рядом с ней стоит единственный источник света - факел , он стоит на металлической подставке , закрепленной на стене.") print ("В комнате , неподалеку от вас ,есть небольшой старинный столик , на нем стоит потухшая свеча и лежит пистолет") print ("*********************************************************") print ("нажмите ,|1| чтобы продолжить") a =int(input()) while a!=1 : a =int(input()) print ("*********************************************************") print ("О НЕТ . КАК ЖЕ Я СРАЗУ НЕ ЗАМЕТИЛ-подумали про себя вы") print ("на вашу ногу в кандалы , от них идет цепь к стене") print ("Ну нет уж , так не пойдет , нужно выбираться отсюда!- подумали вы") print ("*********************************************************") print ("нажмите ,|1| чтобы продолжить") a =int(input()) while a!=1 : a =int(input()) print ("*********************************************************") print ("Варианты действий") print ("*********************************************************") print ("попробовать выдернуть цепь из стены - для действия нажмите |1|") print ("позвать на помощь - для действия нажмите |2|") print ("осмотреться вокруг и поискать что-нибудь в карманах - для действия нажмите |3|") print ("цепь не такая и толстая , может попробовать прокусить. - для действия нажмите |4|") print ("*********************************************************") b=int(input()) r=0 while b!=3 : while b>4 or b3 or b2 or a2 or a2 or b
А вот мое начало кода, на котором все в принципе-то и застопорилось:
print ("Dungeon raid") print ("*************************************************") print ("Вы - матерый воин Гатс, жаждущий славы и богатства") print ("Недавно вами было взято задание - отправиться в жуткое подземелье ради спасения похищенной злым некромантом дочери графа Паулето") print ("Вам предстоит подготовить свое снаряжение и собрать рюкзак перед дорогой, взяв то, что поможет вам в борьбе со зловещим некромантом") print ("Нажмите |1| чтобы начать выбор экипировки") a =int(input()) while a!=1 : a=int(input()) print ("*************************************************") print ("Варианты действий") print ("*********************************************************") print ("Взять с собой тяжелый серебрянный двуручный меч - для действия нажмите |1|") print ("Надеть на себя волшебный мифриловый доспех - для действия нажмите |2|") print ("Положить в рюкзак лечебную эссенцию регерации жизни - для действия нажмите |3|") print ("Взять с собой связку отмычек - для действия нажмите |4|") print ("Засунуть в рюкзак лом - для действия нажмите |5|") print ("Положить в голенища своих сапог два легких стальных ножа - для действия нажмите |6|") print ("*********************************************************") b=int(input()) if b>6 or b6 or с6 or с
Вот мой план создания игры:

Я предположил, если я обозначу каждый вариант из 6 за новую переменную b-c-a-d-f-g-e и напишу в условиях к каждому новому выбору что-то типа:
с не равно b - > далее d не равно b и c и тд., то получится далее запомнить выборы игрока и составить на их основе условие прохождения дальше или конца игры по типу:
Если игрок выбрал числа в такой то ситуации, что это числа 3-4-5 в любом порядке - > то он проходит, если нет - > проигрышь.
Но даже тогда остается проблема того, что каждый раз к выбору представлены 6 вариантов, а не 6 - уже выбранные.
К тому же, проблема еще в том, когда я пытаюсь ввести 3-ю переменную c (а отвечает за шаги, а b - первая переменная из 6 выборов) - > мне компилятор выдает ошибку такого рода, что я как-будто не могу ввести c и ее значения нет в программе, хотя я вроде бы указал ввод данных для c.
a =int(input()) if a==1 : c =int(input()) c!=b if с>6 or с
Короче говоря, если кто-то дочитал до этого момента и хоть что-то понял + хочет и может помочь - > пожалуйста, помогите.
А то я с часу до 8 думу думаю и пытаюсь как-то с операторами что-то придумать: while, if, else - хоть как-то что-то понятно, но с операторами While True,Elif, continue и break - вообще мрак полный.
Благо разобрался, что != значит не равно, а == равно.
Я читал информацию в интернете, но ее так много и примеры совсем другие, что полезной инфы для себя я нашел очень мало.
Основные проблемы это:
1) Как сделать так, чтобы программа не предлагала к выбору уже ранее выбранный из 6 возможных вариантов выбор;
2) Как сделать так, чтобы программа запомнила все "цифры выбора" игрока и использовала дальше в программе как условие прохождения-не прохождения игры дальше;
3) Как ввести эту клятую третью переменную "С", в ситуации, когда нужно ввести сперва "A" -> а потом, если "А" == 1, то нужно ввести "С" и проверить ее на условия, а если "А" == 2, то просто продолжить чтение текста программы.
- Python
- Текстовая игра
- Логическая игра
- Запоминание переменных
- Ввод данных
- Python
- Логические игры
