C++ Помогите
571
29
Вообщем, начал изучать C и С++. На данный момент делаю текстовую игру.
У меня есть 2 класса: Room и GameObject. У меня не получается сделать так что - бы когда игрок выбирал войти в какую - либо комнату ему печатались все предметы в этой комнате. У меня есть лист куда я добавляю все предметы соответственно каждая комната печает все предметы. Какие идеи?
есть массив предметов. каждый предмет-отдельный объект. в каждом предмете внутри есть массив со списком комнат, в которых он будет доступен
Aloe Armor сказал(а):↑Я так и делаю, но не получается разделить предметы на комнаты ибо лист общий
Нажмите, чтобы раскрыть...или внутри каждой комнаты есть массив со списком индексов, нужных предметов
Mr.Paige сказал(а):↑
есть массив предметов. каждый предмет-отдельный объект. в каждом предмете внутри есть массив со списком комнат, в которых он будет доступен
Нажмите, чтобы раскрыть...В предмете есть массив комнат
Ты РСУБД с бизнес-логикой не попутал?
ТС делай как я тебе прислал, либо храни карту (itemId, roomId) отдельно и с ней работай
Aloe Armor сказал(а):↑Я так и делаю, но не получается разделить предметы на комнаты ибо лист общий
Нажмите, чтобы раскрыть...
Ну допустим в листе у тебя 10 объектов, а вывести в комнате нужно первых 5.
Пишешь: пока индекс массива <=4 цикл.
и у тебя выведется 5 первых предметов.
или как скинули выше. Тут много как можно описать
urusai88 сказал(а):↑В предмете есть массив комнат
Ты РСУБД с бизнес-логикой не попутал?
ТС делай как я тебе прислал, либо храни карту (itemId, roomId) отдельно и с ней работай
Нажмите, чтобы раскрыть...так тс написал, что проблема в том, что лист предметов общий для всех комнат.
а ты предложил в своём коде, в каждой комнате хранить отдельный список предметов?
Пукан сказал(а):↑создать для каждый комнаты свой лист, выводить содержимое общей функцией
Нажмите, чтобы раскрыть...Как создать свой лист для каждой инстанции класса (Комнаты)?
В мейн классе у меня что - то вроде:
комната1 = новая комната.
комната2 = новая комната.
объект1 = новый объект.
комнтата1.добавитьОбъект(объект1)
Метод добавитьОбъект добавляет предмет еще и в лист. Но он общий для всех комнат. Нужно сделать что - бы для каждой комнаты был свой лист.
Сделать отдельный класс с предметами. Создать метод, который будет добавлять по определённому полю объекта данный объект ( в твоём случае предмет) в массив, после чего массив уже передавать в комнату и с ним работать. Пример - создаёшь поле type и в нем пишешь какие угодно типы. В одной комнате могут падать только доспехи или шлема. Додумать можешь сам так как при наличии фантазии тут можно все что угодно сделать.
Mr.Paige сказал(а):↑а ты предложил в своём коде, в каждой комнате хранить отдельный список предметов?
Нажмите, чтобы раскрыть...Да. Не находишь это логичным? Предметы находятся в комнате
Aloe Armor сказал(а):↑Нужно сделать что - бы для каждой комнаты был свой лист.
Нажмите, чтобы раскрыть...В чём проблема? Ты же уже сделал общий лист, сделай в каждой комнате ещё отдельный
urusai88 сказал(а):↑Да. Не находишь это логичным? Предметы находятся в комнате
Нажмите, чтобы раскрыть...нет, не нахожу это логичным.
тебе придётся затем добавлять свойства и описания предметов. у тебя будет предметы: кекс, он съедобный, он портится, такие-то и такие-то параметры.и ты предлагаешь в итоге хранить описание кекса два раза, если кекс будет в двух комнатах одновременно.я же предложил хранить в комнате лишь индексы нужных предметов. а по индексу предмет будет браться из общего массива предметов
urusai88 сказал(а):↑Да. Не находишь это логичным? Предметы находятся в комнате
В чём проблема? Ты же уже сделал общий лист, сделай в каждой комнате ещё отдельный
Нажмите, чтобы раскрыть...
Пукан сказал(а):↑добавить лист в поле переменных класса Комнаты
Нажмите, чтобы раскрыть...Я хз что я делаю не так, после джавы это все слишком геморно.
Вот есть Room.h где я создаю лист -
class Room{
public:
static std::list gameObjects;
}
Вот есть Room.cpp где указание к этому листу.
std::list Room::gameObjects;
Там же есть метод который добавляет мой объект в лист.
GameObject* Room::addGameObject(GameObject* gameObject) {
Room::gameObjects.push_back(gameObject);}
Mr.Paige сказал(а):↑кекс будет в двух комнатах одновременно.
Нажмите, чтобы раскрыть...Mr.Paige сказал(а):↑я же предложил хранить в комнате лишь индексы нужных предметов. а по индексу предмет будет браться из общего массива предметовНажмите, чтобы раскрыть...Ты предложил хранить в предметах индексы комнат, в которых они находятся
В любом случае, хранить индексы для доступа к объектам из массива в ООП - бред. Суть ООП как раз таки в том, что бы этого не делать
Aloe Armor сказал(а):↑
Я хз что я делаю не так, после джавы это все слишком геморно.
Вот есть Room.h где я создаю лист -
class Room{
public:
static std::list gameObjects;
}
Вот есть Room.cpp где указание к этому листу.
std::list Room::gameObjects;
Там же есть метод который добавляет мой объект в лист.
GameObject* Room::addGameObject(GameObject* gameObject) {
Room::gameObjects.push_back(gameObject);}
Нажмите, чтобы раскрыть...Всё верно. В чём проблема? Добавь в комнате ещё static std::list items и храни предметы там
Пукан сказал(а):↑добавить лист в поле переменных класса Комнаты
Нажмите, чтобы раскрыть...Где именно декларировать лист в .cpp и в .h файлах?
urusai88 сказал(а):↑Ты предложил хранить в предметах индексы комнат, в которых они находятся
В любом случае, хранить индексы для доступа к объектам из массива в ООП - бред. Суть ООП как раз таки в том, что бы этого не делать
Всё верно. В чём проблема? Добавь в комнате ещё static std::list items и храни предметы там
Нажмите, чтобы раскрыть...Проблема в том что этот лист общий на все комнаты. Если печатать через for loop то в каждой комнате будут все предметы а не только предметы добавленные в эту комнату.
urusai88 сказал(а):↑
Ты предложил хранить в предметах индексы комнат, в которых они находятся
Нажмите, чтобы раскрыть...так же, в том же самом сообщении, я предложил хранить в комнате индексы массива нужных предметов.
но ещё сейчас вспомнил, что в твоём случае, в переменных предметов будут храниться не объекты, а ссылки на эти объекты. так как объекты ссылочного типа. поэтому может и пойдёт.я просто с js был и сейчас ООП ток учу на java
Aloe Armor сказал(а):↑Где именно декларировать лист в .cpp и в .h файлах?
Проблема в том что этот лист общий на все комнаты. Если печатать через for loop то в каждой комнате будут все предметы а не только предметы добавленные в эту комнату.
Нажмите, чтобы раскрыть...Делай свойство НЕ статическим, тогда оно будет привязано к конкретному объекту
В этом то и прикол ООП. МагияMr.Paige сказал(а):↑но ещё сейчас вспомнил, что в твоём случае, в переменных предметов будут храниться не объекты, а ссылки на эти объекты. так как объекты ссылочного типа.
Нажмите, чтобы раскрыть...
Какие то глупости понаписывали вы тут парни. И так, с начала.
1. Есть предметы
2. Есть комнаты
3. Комнаты могут владеть предметами.
4. Игрок может видеть предметы в комнатах.
5. Игрок может менять комнаты.
классы:
Items - хранит все существующие вещи как кей-вэлью map.
AbsRoom - абстрактный класс комнат, реализует методы по работе с комнатами, список вещей, имя комнаты
FirstRoom, SecondRoom - производные классы от AbsRoom, реализуют "настоящие комнаты" с вещами, и именем комнаты
Player - непосредственно плеер, умеет ходить по комнатам, и рассматривать там вещи.
Вот тут то и наступает время ООП:
Имея указатель на базовый класс комнаты (AbsRoom), мы может полиморфно использовать комнаты одним и тем же игроком, переопределяя в конструкторе каждой комнаты ее атрибуты - имя и количество вещей.
Более того, каждая комната не хранит объекты типа вещь (в данном случае это пока std pair@ int, string@), и сама не работает с ними, перекладывая эту работу на класс, который непосредственно ответственный за это - Items, оперируя лишь индексами (ключами) для каждой вещи.
UPD. Для тех у кого нет компилятора, или впадлу распаковывать - https://repl.it/repls/UntrueSereneMedian
urusai88 сказал(а):↑В любом случае, хранить индексы для доступа к объектам из массива в ООП - бред. Суть ООП как раз таки в том, что бы этого не делать
Нажмите, чтобы раскрыть...Можно подробно пояснить, почему хранение ссылок на объекты - это бред, и как внезапно ООП решает эту проблему?
saw_tooth сказал(а):↑Какие то глупости понаписывали вы тут парни. И так, с начала.
1. Есть предметы
2. Есть комнаты
3. Комнаты могут владеть предметами.
4. Игрок может видеть предметы в комнатах.
5. Игрок может менять комнаты.
классы:
Items - хранит все существующие вещи к кей-вэлью map.
AbsRoom - абстрактный класс комнат, реализует методы по работе с комнатами, список вещей, имя комнаты
FirstRoom, SecondRoom - производные классы от AbsRoom, реализуют "настоящие комнаты" с вещами, и именем комнаты
Player - непосредственно плеер, умеет ходить по комнатам, и рассматривать там вещи.
Вот тут то и наступает время ООП:
Имея указатель на базовый класс комнаты (AbsRoom), мы может полиморфно использовать комнаты одним и тем же игроком, переопределяя в конструкторе каждой комнаты ее атрибуты - имя и количество вещей.
Более того, каждая комната не хранит объекты типа вещь (в данном случае это пока std pair@ int, string@), и сама не работает с ними, перекладывая эту работу на класс, который непосредственно ответственный за это - Items, оперируя лишь индексами (ключами) для каждой вещи.
UPD. Для тех у кого нет компилятора, или впадлу распаковывать - https://repl.it/repls/UntrueSereneMedian
Можно подробно пояснить, почему хранение ссылок на объекты - это бред, и как внезапно ООП решает эту проблему?
Нажмите, чтобы раскрыть...Я просто делаю не совсем игру а скорее движок для игры так что передавать каждый предмет параметром в комнату не особо хотелось. Но все равно спасибо, разобрался
Тема закрыта
-
ЗаголовокОтветов ПросмотровПоследнее сообщение
-
limezs96 25 Apr 2024 в 14:24Сообщений: 5 25 Apr 2024 в 14:24
Сообщений:5
Просмотров:5
-
Сообщений:9
Просмотров:9
-
Сообщений:7
Просмотров:7
-
Wonder of U 25 Apr 2024 в 14:01Сообщений: 6 25 Apr 2024 в 14:01
Сообщений:6
Просмотров:8
-
Сообщений:23
Просмотров:29