Использование ООП при создании текстового приключения

Называй меня тупым или как тебе угодно. Мой университет никогда не учил меня должным образом ООП, и из-за этого я предпочитаю программировать на C. ОДНАКО, в интересах расширения и обучения некоторым новым навыкам, я решил попробовать и научить себя чему-то еще объектному. ориентированные навыки, а также заняться одним из моих других увлечений/хобби, текстовыми приключениями. Я попытаюсь сделать это на C++, так как это язык, который я использовал для большей части своего старшекурсника, поэтому я знаю его лучше всего. Я зациклился на том, что написал общий файл .h для базовых атрибутов и методов, которые должно иметь «местоположение». Это все хорошо, если все, что я хочу сделать, это создать кучу комнат и иметь возможность перейти на С/Ю/В/З в другую общую комнату и распечатать описание комнаты. Чего я не знаю, так это сделать более конкретную реализацию этого заголовочного файла. Боюсь, я не очень хорошо объяснил свою проблему, поэтому позвольте мне проиллюстрировать это примером:

У меня есть комната, назовем ее "Гостиная". К северу от него находится «Кухня». К югу от него находится «Логово». Между «Гостиной» и «Логом» есть дверь. Пользователь может сказать «N», и будет вызвана функция goNorth(), и все будет замечательно. Однако, если пользователь говорит «S», я хочу, чтобы это дало им что-то вроде «вы не можете идти туда», пока они не откроют дверь. Это потребует от меня либо 1) полностью отказаться от моей идеи ООП и просто написать каждую комнату как собственный набор функций и переменных (как я бы сделал это в прошлом), либо 2) сделать конкретную реализацию файла заголовка, который у меня есть, содержащий все эти функции и переменные для каждой комнаты (как я теоретически хотел бы это сделать), однако я просто не знаю, возможно ли это технически и как это сделать. Если бы кто-то мог указать мне правильное направление, сводя к минимуму имена, я был бы очень признателен.

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


person Nick    schedule 26.04.2016    source источник
comment
1) Нет правильного пути. 2) Пункт 1 касается всего, не только этой программы.   -  person user253751    schedule 27.04.2016
comment
Обычно для одного и того же .h не может быть нескольких файлов .cpp. Вы можете создать абстрактный базовый класс class Room с виртуальными функциями, такими как virtual void printDescription() = 0;, и производными классами (class Kichen : public Room), реализующими методы, и иметь элементы данных для состояния этой комнаты (bool drawerOpen).   -  person tmlen    schedule 27.04.2016
comment
@tmlen Абсолютно нет причин, по которым у вас не может быть больше файлов cpp, чем заголовков. На самом деле, почти в каждом проекте будет как минимум ещё один, main.cpp.   -  person    schedule 27.04.2016
comment
Не может быть нескольких определений функций (в .cpp) для одних и тех же объявлений функций (в .h), что, похоже, и пытался сделать OP. В остальном количество .cpp или .h файлов не имеет значения.   -  person tmlen    schedule 27.04.2016


Ответы (1)


Это, вероятно, будет закрыто как слишком широкое, так как есть много способов его решить. Вот примерно то, что я сделал в похожей ситуации:

Room имеет метод GetConnection(direction) и возвращает указатель на объект Connection (или нулевой указатель, если нет другого пути).

Объект Connection имеет виртуальный метод Traverse(). Базовый Connection имеет элемент, указывающий на место назначения, а метод Traverse() просто обновляет местоположение игрока до места назначения.

Для Connection с дополнительными ограничениями производный класс, скажем, ConnectionThroughDoor, имеет переопределенный метод Traverse(), который проверяет, открыта ли дверь (или любые другие ограничения), прежде чем вызывать базовый класс Traverse() для фактического перемещения игрока.

Обобщая, подумайте об интерфейсах программирования и подумайте, нужны ли вам дополнительные классы для представления других концепций (например, Connection между Rooms).

person Adrian McCarthy    schedule 26.04.2016
comment
Я подумал, что он может быть слишком широким, но я не знал, что еще с ним делать. Я никогда даже не думал о том, чтобы сделать соединение отдельным объектом, это очень интересная (если не сказать запутанная) идея. Я еще не понял, почему людям так нравится ООП, для меня это всегда звучит надуманно. Спасибо за вашу помощь! - person Nick; 27.04.2016