January 5, 2020

Очередная консольная RPG (не круто)

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

В-нулевых, нужно подключить заголовочные файлы iostream для ввода-вывода, string для работы со строками, Windows.h, чтобы сделать адекватную кириллицу в консоли.

Теперь нужно прописать следующие команды в основной функции. В самом начале, это должны быть первые команды, ЭТО ОЧЕНЬ ВАЖНО. Они переключают кодировку, чтобы кириллица нормально отображалась.

Во-первых, нужен игрок. Это будет структура с названием (player), которая будет в себе хранить имя (name), очки здоровья (hp), опыт (exp), силу, которая будет определять урон (sila), защита, от которой будет зависеть, сколько урона наш герой будет получать (def), деньги (den), и массив с инвентарем (inv[100]). В инвентаре пока пусть будет 100 ячеек.

Во-вторых, нужно оружие. Также, как и с игроком, я делаю структуру. Назову ее weapon. id в ней отвечает за уникальный идентификатор предмета, чтобы было проще с инвентарем, name для названия, stoim для стоимости, uron для урона, думаю, здесь все понятно.

Та же самая история с броней. Структура dospeh, в ней то же есть id, name для названия, stoim для стоимости, def отвечает за бонус к защите.

Еще чуть-чуть. Осталась одна структура для всяких бесполезных штук, вроде слизи, камней, останков, всего такого. Структура stuff, id, name и stoim, ничего особенного.

Поехали дальше.

Уууу, пиздец. Что это? Это я объявляю разные функции перед основной main. Не запаривайся сейчас, я их потом все объясню, сейчас это не нужно.

Дальше - хуже. Я тупой, поэтому мне нужно переменных, чтобы что-то сделать.

tvyb нужна для выбора действия в таверне (a. k. a. главное меню), i используется в разнообразных циклах, как счетчик, я думаю, ты это уже знаешь. Переменная pl - наш игрок. Структура показала нам, что можно игроку задать, а переменная это уже уникальный игрок. ar[3] - массив с тремя оружиями. Это сейчас три оружия, дальше я что-нибудь придумаю еще. d[3] - массив с тремя доспехами. st[2] - массив с двумя бесполезными штуковинами (нужен же будет какой-то лут с монстров). Дальше чуть-чуть интереснее. name, stoim, def и uron отдельно нужно указывать, потому что при написании я столкнулся со следующей проблемой: есть id предмета, который нужно вывести, но через id нельзя напрямую получить другие элементы структуры, более того, я даже не знаю, в какой структуре искать! Поэтому по id я определяю, что это (броня, оружие или лут), и там уже перебираю все предметы в поисках того самого с нужным id, после этого кладу остальную информацию в эти переменные (название, урон, если оружие, защита, если броня, и стоимость), и уже эти переменные вывожу.

Фух, вроде с этим разобрался. Вперед! Теперь нужно, чтобы игра добавила в себя оружие, доспехи и другие предметы, а-то структуры задали, чтобы было, как их описывать, а самих предметов в игре. Так. Вначале оружие, тут пригодится функция or.

Тут все просто: в id кладется идентификатор, который для оружия лежит в первом десятке (объясню позже, почему), в name кладем название, в stoim - стоимость, а в uron - урон. Кстати, отсчет начинается с нуля. Первый элемент массива для человека является нулевым для машины. Из-за этого иногда появляются ошибки, когда забываешь об этом.

Теперь доспехи.

Функция dos добавляет доспехи (вау). Здесь все то же самое, что и с оружием, за исключением того, что вместо uron здесь def, который, если помнишь, отвечает за бонус к защите, и id, который для доспехов лежит в промежутке 30-39.

Финальный этап возни с созданием предметов! Функция stuf.

Тут все даже проще. Название, ид и стоимость. Ид лежит в первом десятке.

ОООГООО, приехали, пишем саму игру! Функция privetst приветствует игрока и просит его представиться.

Я не написал cin >> pl.name; , потому что, хоть убей, читается только до первого пробела. А с getline все работает нормально. Выглядит getline примерно так: getline(откуда, куда), то есть из cin, потока ввода данных, мы кладем всю строку, которую туда ввели, в pl.name. Хз, почему сам cin так не умеет, с такими сложными вопросами не ко мне.

Далее в основную функцию вписываем по очереди все написанные функции, и, ого, игра работает! Я, кстати, только сейчас заметил, что у меня основная функция не main, а _tmain, помогите, пожалуйста, что это, чем оно страшно, и надо ли с этим что-то делать.

Отлично! По крайней мере, я собой доволен))

Рано расслабляться, даже половина еще не готова. После приветствия нужен цикл, который будет самой игрой, грубо говоря.

Здесь уже используется switch - оператор множественного выбора. Он работает не как просто if, который либо да, либо нет, а как настоящий человек (почти). На каждое наше действие switch знает, что должен делать в ответ, вот так я его опишу.

switch(tavern()) означает, что мы выполним функцию tavern, она вернет какое-то значение, и уже из него игра будет выбирать, что ей делать. Сейчас все объясню подробнее.

Это функция tavern. system("cls") очищает консоль, потом вылезает куча букв с выбором варианта. То есть, если ты хочешь к торговцу оружием, нужно ввести 1, если отдохнуть, то нужно ввести 3, и так далее. return tvyb возвращает введенное значение. То есть мы введем 1, то вернется 1. Это означает, что, когда мы введем единицу и функция ее вернет, switch(tavern()) превратится в switch(1), и уже будет работать от единицы. "case 1: бла бла бла" говорит, что делать, если вернулась единица. "case 2: бла бла бла" делает то же самое, если вернулась двойка, и так далее. break нужен, чтобы прекратить работу switch. если этого не сделать, то он просто делать все подряд. Все, что идет после case 1, будет выполнено. И case 2, и case 3, и так далее. Он не умеет останавливаться, поэтому надо делать это самостоятельно. ВАУ, Я ВРОДЕ БЫ КАК СМОГ ЭТО ОБЪЯСНИТЬ.

Продолжение следует, не переключайтесь! Много функций объявлено, теперь надо их написать и проверить. Текста много очень, столько сразу нельзя, иначе и читать надоедает, и не запоминаешь ничего, так что по чуть-чуть.