Моя первая текстовая игра на Ruby

Дневник разработчика

Как я решился на написание текстовой игры

На момент написания игры я проходил курс по программированию на Ruby и мне нужна была практика на закрепление теоретических знаний.

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

В итоге моей работы на свет появилась эта небольшая но функциональная игра.

Сценарий мини-игры

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

Для начала нам нужно добавить RPG-составляющую в игру — поэтому добавлю возможность ввода имени при создании персонажа.

Так же при создании персонажа добавлю возможность выбора способностей, ну или специализацию.

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

Как только персонаж попадёт в лес, он встретит монстра. При встрече с монстром у него будет ТРИ варианта: бить, бежать или попытаться подружиться с монстром.

Все принятые ранее решения влияют на исход игры.

Прототипирвоание мини-игры

И так, погнали. Для начала разделим сюжет, описанный выше на ветки. Для этой задачи я буду использовать карту ума.

Это изображение имеет пустой атрибут alt; его имя файла - image-10.png
Схема опций игры и вариантов развития событий в зависимости от выбранных игроком вариантов.

Программирование условий и опций мини-игры

Посматривая на карту ума мне не сложно было прописать все условия и опции для игрового персонажа. Удивительно как всё таки захватывает подобная работа. Я ТРИ дня ковырялся с сюжетом, продумывал варианты развития событий. Ха ходу сочинял сюжетные описания последствий. было круто. В итоге я конечно многое из игры убрал и сократил игру до одной сцены, потому что даже эта небольшая работа занимает довольно много времени.

Как ни крути, но цель у меня не игра, а практика в применении условных операторов и маркеров с этой долбанной интерполяцией значений переменных в стоки. Но в целом мне очень понравилось. Давайте расскажу что я запрограммировал в игре.

Игра состоит из двух отдельных но взаимосвязанных между собой этапов: Подготовка и основное действие.

Подготовительный этап игры

Приглашение игры

На этом этапе игра приглашает вас сыграть. Я оформил этот блок кода красивой рамкой, в меру своих возможностей.

Моя первая текстовая игра на Ruby
Начальный блок текстовой игры «Forest Walk»

Ввод имени персонажа

Под обрамлённым заголовком с названием игры выводится текст, с предложением ввести имя для вашего персонажа.

После того как вы вводите имя — входные данные сохраняются в переменную name.

Моя первая текстовая игра на Ruby
Настройка ввода имени персонажа с последующим сохранением данных в переменной name.

Выбор специализации персонажа

Следующий шаг — выбор специализации для вашего персонажа. Я по началу сильно заморочился, потмоу что хотел что бы в моей игре были и воин и лучник и маг и бомж какой нить, но это было слишком затратно по времени. Решил упростить, оставив лишь два варианта: Силач и Ловкач.

Моя первая текстовая игра на Ruby
Программирование выбора специализации персонажа с последующим сохранением выбора в переменную skill.

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

Теперь в конструкции условий у меня было не только if, else и end но и elsif. При этом реализована возможность ожидаемого результата в случае, если игрок ничего не выберет.

Моя первая текстовая игра на Ruby
Логика выбора специализации для персонажа с учетом того что игрок ничего не выберет — он будет распиздяем 😉

Выбор оружия для персонажа

По оружию я писал варианты по классике RGP-жанра. На выбор игрока предлагаются нож, лук, волшебный посох, а так же есть возможность ничего с собой не брать.

Моя первая текстовая игра на Ruby
Программирование опции выбора оружия для персонажа.

Выбор вспомогательного предмета

Для большего разнообразия игры я добавил в опцию дополнительных предметов. игрок может выбрать любой предмет, которые возьмёт с собой в путешествие. Но можно взять только один предмет, поэтому важно выбирать с умом, как если бы вы реально собирались пойти в лес.

Вывод на экран итогового профиля созданного персонажа

тут было интересно. Я захотел что бы моя игра была еще более похожей на RPG игры и решил вывести на экран итоговый профиль созданного персонажа. В профиле я бы расписал все характеристики, что бы было наглядей.

Моя первая текстовая игра на Ruby
Карточка созданного персонажа в текстовой игре выглядит вот так.

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

Я пока не знаю как программировать перескоки не несколько шагов назад, поэтому при выборе второго варианта я просто останавливаю игру, и игрок может по новой задать имя и так далее.

Моя первая текстовая игра на Ruby
Задаю игроку вопрос, правильно ли создан персонаж. Если есть ошибки — персонажа можно пересоздать.

Основная часть — бой с монстром в лесу

После того как игрок создал персонажа и проверил его характеристики начинается основная часть — встреча в лесу с монстром. Под этот ивент я запрограммировал три варианта действий: Бой, бегство и дружба.

Моя первая текстовая игра на Ruby
Варианты действий для игрока, который повстречал в лесу монстра.

В зависимости от того какое оружие у персонажа, а так же учитывая его способности (силач, ловкач или распиздяй), варианты одно и того же действия будет разный.

Моя первая текстовая игра на Ruby
Варианты развития событий при выборе действия игроком.

Если персонаж — силач, то у него низкая скорость бега и умрёт если попытается убежать от монстра.

Если у персонажа нет свиной рульки, то он не сможет подружиться с монстром, потому что зверюга очень голодная.

Если у персонажа нет никакого оружия — он не сможет выиграть бой с монстром.

Ну в целом я думаю вы поняли логику.

Полную версию игры можно посмотреть на моём Github.

Какой опыт я обрёл в ходе работы над игрой

Работу над игрой я начал с описания истории, в которую я поместил кучу переменных и вариантов развития событий. А после того как написал, сразу же сел за написание самой программы. В программе я делал все за один заход — и логику программировал и тексты вставлял. Очень быстро моя программа игры превратилась в полотно неразборчивого бреда, в котором было собрано всё худшее — опечатки, ошибки синтаксиса языка Ruby, непоследовательные повествования и прочий АД.

  1. Большую программу очень тяжело редактировать, даже не смотря на то, что писал её я сам.
  2. Не нужно вставлять длинные реплики и подводки с описанием места, времени и прочих непрограммных частей.
  3. Прежде чем садиться за написание программы нужно составить блок-схему, как я сделал в Карте ума.
  4. Потом проанализировать блок-схему и разметить вилки — прописать в программе варианты выбора, условия и альтернативы, а так же протестировать что все работает как задумано.
  5. И только потом, с самом конце вставлять длинные строковые объекты и оформлять игру.

так и только так, Карл! Иначе ты запарился рыскать по коду в поисках опечаток. С ошибками синтаксиса по проще будет, а вот с очепятками в тексте будет беда 😉

Вот таки вот дела, ребята. Писать текстовые игры не так уж и сложно. Теперь, когда я попробовал на вкус и расширеш своё сознание, возник вопрос, как перенести эту игру в браузет, что бы можно было добавлять красивую вёрстку и анимацию на страичку игры, что бы не в консоли играть, а прям на сайте или в видеприложения.

Мне кажется я логично, органично и крайне волнующе двигаюсь по методичному потоку языка программирования Ruby. Посмотрим куда это меня приведёт. Интересно, сделаю ли я свою игру в Steam? ))))

Видео с разбором логики игры и некоторых нюансов работы сценария

Юрий Ронин