Aloe Armor

Пользователь

Регистрация: 14.05.2017

Сообщения: 748

Рейтинг: 382

Aloe Armor

Регистрация: 14.05.2017

Сообщения: 748

Рейтинг: 382

Вообщем, начал изучать C и С++. На данный момент делаю текстовую игру.

 

У меня есть 2 класса: Room и GameObject. У меня не получается сделать так что - бы когда игрок выбирал войти в какую - либо комнату ему печатались все предметы в этой комнате. У меня есть лист куда я добавляю все предметы соответственно каждая комната печает все предметы. Какие идеи?

 

urusai88

Пользователь

Регистрация: 01.11.2018

Сообщения: 3351

Рейтинг: 1105

urusai88

Регистрация: 01.11.2018

Сообщения: 3351

Рейтинг: 1105

MoonMeUnder

Пользователь

Регистрация: 23.12.2017

Сообщения: 9822

Рейтинг: 5053

Нарушения: 60

MoonMeUnder

Регистрация: 23.12.2017

Сообщения: 9822

Рейтинг: 5053

Нарушения: 60

Ну запиши предметы в виде массива. А вывод в каждой комнате сделай через цикл(индекс массива)

Aloe Armor

Пользователь

Регистрация: 14.05.2017

Сообщения: 748

Рейтинг: 382

Aloe Armor

Регистрация: 14.05.2017

Сообщения: 748

Рейтинг: 382

MoonMeUnder сказал(а):

Ну запиши предметы в виде массива. А вывод в каждой комнате сделай через цикл(индекс массива)

Нажмите, чтобы раскрыть...

Я так и делаю, но не получается разделить предметы на комнаты ибо лист общий

Mr.Paige

Пользователь

Регистрация: 09.06.2015

Сообщения: 174

Рейтинг: 66

Mr.Paige

Регистрация: 09.06.2015

Сообщения: 174

Рейтинг: 66

 

есть массив предметов. каждый предмет-отдельный объект. в каждом предмете внутри есть массив со списком комнат, в которых он будет доступен

Aloe Armor сказал(а):

Я так и делаю, но не получается разделить предметы на комнаты ибо лист общий

Нажмите, чтобы раскрыть...

или внутри каждой комнаты есть массив со списком индексов, нужных предметов

urusai88

Пользователь

Регистрация: 01.11.2018

Сообщения: 3351

Рейтинг: 1105

urusai88

Регистрация: 01.11.2018

Сообщения: 3351

Рейтинг: 1105

Mr.Paige сказал(а):

 

есть массив предметов. каждый предмет-отдельный объект. в каждом предмете внутри есть массив со списком комнат, в которых он будет доступен

Нажмите, чтобы раскрыть...

В предмете есть массив комнат 

Ты РСУБД с бизнес-логикой не попутал?

 

ТС делай как я тебе прислал, либо храни карту (itemId, roomId) отдельно и с ней работай

MoonMeUnder

Пользователь

Регистрация: 23.12.2017

Сообщения: 9822

Рейтинг: 5053

Нарушения: 60

MoonMeUnder

Регистрация: 23.12.2017

Сообщения: 9822

Рейтинг: 5053

Нарушения: 60

Aloe Armor сказал(а):

Я так и делаю, но не получается разделить предметы на комнаты ибо лист общий

Нажмите, чтобы раскрыть...

 

Ну допустим в листе у тебя 10 объектов, а вывести  в комнате нужно первых 5.

 

Пишешь: пока индекс массива <=4 цикл.

 

и у тебя выведется 5 первых предметов.

 

или как скинули выше. Тут много как можно описать

dJozy

Пользователь

Регистрация: 23.03.2013

Сообщения: 2684

Рейтинг: 2894

dJozy

Регистрация: 23.03.2013

Сообщения: 2684

Рейтинг: 2894

создать для каждый комнаты свой лист, выводить содержимое общей функциейhmmm.png?

Aloe Armor

Пользователь

Регистрация: 14.05.2017

Сообщения: 748

Рейтинг: 382

Aloe Armor

Регистрация: 14.05.2017

Сообщения: 748

Рейтинг: 382

MoonMeUnder сказал(а):

 

Ну допустим в листе у тебя 10 объектов, а вывести  в комнате нужно первых 5.

 

Пишешь: пока индекс массива <=4 цикл.

 

и у тебя выведется 5 первых предметов.

 

Нажмите, чтобы раскрыть...

Это сверх глупо

Mr.Paige

Пользователь

Регистрация: 09.06.2015

Сообщения: 174

Рейтинг: 66

Mr.Paige

Регистрация: 09.06.2015

Сообщения: 174

Рейтинг: 66

urusai88 сказал(а):

В предмете есть массив комнат 

Ты РСУБД с бизнес-логикой не попутал?

 

ТС делай как я тебе прислал, либо храни карту (itemId, roomId) отдельно и с ней работай

Нажмите, чтобы раскрыть...

так тс написал, что проблема в том, что лист предметов общий для всех комнат.

а ты предложил в своём коде, в каждой комнате хранить отдельный список предметов?

Aloe Armor

Пользователь

Регистрация: 14.05.2017

Сообщения: 748

Рейтинг: 382

Aloe Armor

Регистрация: 14.05.2017

Сообщения: 748

Рейтинг: 382

Пукан сказал(а):

создать для каждый комнаты свой лист, выводить содержимое общей функциейhmmm.png?

Нажмите, чтобы раскрыть...

Как создать свой лист для каждой инстанции класса (Комнаты)?

 

В мейн классе у меня что - то вроде:

комната1 = новая комната.

комната2 = новая комната.

объект1 = новый объект.

 

комнтата1.добавитьОбъект(объект1)

 

Метод добавитьОбъект добавляет предмет еще и в лист. Но он общий для всех комнат. Нужно сделать что - бы для каждой комнаты был свой лист.

Aliquam

Пользователь

Регистрация: 05.10.2014

Сообщения: 551

Рейтинг: 335

Aliquam

Регистрация: 05.10.2014

Сообщения: 551

Рейтинг: 335

img

Сделать отдельный класс с предметами. Создать метод, который будет добавлять по определённому полю объекта данный объект ( в твоём случае предмет) в массив, после чего массив уже передавать в комнату и с ним работать. Пример - создаёшь поле type  и в нем пишешь какие угодно типы. В одной комнате могут падать только доспехи  или шлема. Додумать можешь сам так как при наличии фантазии тут можно все что угодно сделать.

urusai88

Пользователь

Регистрация: 01.11.2018

Сообщения: 3351

Рейтинг: 1105

urusai88

Регистрация: 01.11.2018

Сообщения: 3351

Рейтинг: 1105

Mr.Paige сказал(а):

а ты предложил в своём коде, в каждой комнате хранить отдельный список предметов?

Нажмите, чтобы раскрыть...

Да. Не находишь это логичным? Предметы находятся в комнате

 

Aloe Armor сказал(а):

Нужно сделать что - бы для каждой комнаты был свой лист.

Нажмите, чтобы раскрыть...

В чём проблема? Ты же уже сделал общий лист, сделай в каждой комнате ещё отдельный

dJozy

Пользователь

Регистрация: 23.03.2013

Сообщения: 2684

Рейтинг: 2894

dJozy

Регистрация: 23.03.2013

Сообщения: 2684

Рейтинг: 2894

Aloe Armor сказал(а):

Как создать свой лист для каждой инстанции класса (Комнаты)?

Нажмите, чтобы раскрыть...

добавить лист в поле переменных класса Комнаты

Mr.Paige

Пользователь

Регистрация: 09.06.2015

Сообщения: 174

Рейтинг: 66

Mr.Paige

Регистрация: 09.06.2015

Сообщения: 174

Рейтинг: 66

urusai88 сказал(а):

Да. Не находишь это логичным? Предметы находятся в комнате

Нажмите, чтобы раскрыть...

нет, не нахожу это логичным.

тебе придётся затем добавлять свойства и описания предметов. у тебя будет предметы: кекс, он съедобный, он портится, такие-то и такие-то параметры.

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

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

Aloe Armor

Пользователь

Регистрация: 14.05.2017

Сообщения: 748

Рейтинг: 382

Aloe Armor

Регистрация: 14.05.2017

Сообщения: 748

Рейтинг: 382

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);

}

 

urusai88

Пользователь

Регистрация: 01.11.2018

Сообщения: 3351

Рейтинг: 1105

urusai88

Регистрация: 01.11.2018

Сообщения: 3351

Рейтинг: 1105

Mr.Paige сказал(а):

кекс  будет в двух комнатах одновременно.

Нажмите, чтобы раскрыть...

PepeOK.png?

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 и храни предметы там

Aloe Armor

Пользователь

Регистрация: 14.05.2017

Сообщения: 748

Рейтинг: 382

Aloe Armor

Регистрация: 14.05.2017

Сообщения: 748

Рейтинг: 382

Пукан сказал(а):

добавить лист в поле переменных класса Комнаты

Нажмите, чтобы раскрыть...

Где именно декларировать лист в .cpp и в .h файлах?

urusai88 сказал(а):

PepeOK.png?

Ты предложил хранить в предметах индексы комнат, в которых они находятся

 

В любом случае, хранить индексы для доступа к объектам из массива в ООП - бред. Суть ООП как раз таки в том, что бы этого не делать

 

Всё верно. В чём проблема? Добавь в комнате ещё static std::list items и храни предметы там

Нажмите, чтобы раскрыть...

Проблема в том что этот лист общий на все комнаты. Если печатать через for loop то в каждой комнате будут все предметы а не только предметы добавленные в эту комнату. 

Just_a_fire

Пользователь

Регистрация: 09.03.2016

Сообщения: 3597

Рейтинг: 3090

Just_a_fire

Регистрация: 09.03.2016

Сообщения: 3597

Рейтинг: 3090

Лучше подключи к программе модуль базы данных (тут можно обойтись и SQLite). Создай в ней таблицы:

1)предметы

2)комнаты

3)пары room_id, object_id

Mr.Paige

Пользователь

Регистрация: 09.06.2015

Сообщения: 174

Рейтинг: 66

Mr.Paige

Регистрация: 09.06.2015

Сообщения: 174

Рейтинг: 66

urusai88 сказал(а):

 

Ты предложил хранить в предметах индексы комнат, в которых они находятся

 

Нажмите, чтобы раскрыть...

так же, в том же самом сообщении, я предложил хранить в комнате индексы массива нужных предметов.

но ещё сейчас вспомнил, что в твоём случае, в переменных предметов будут храниться не объекты, а ссылки на эти объекты. так как объекты ссылочного типа. поэтому может и пойдёт.

я просто с js былPepeLove.png? и сейчас ООП ток учу на java

urusai88

Пользователь

Регистрация: 01.11.2018

Сообщения: 3351

Рейтинг: 1105

urusai88

Регистрация: 01.11.2018

Сообщения: 3351

Рейтинг: 1105

Aloe Armor сказал(а):

Где именно декларировать лист в .cpp и в .h файлах?

 

Проблема в том что этот лист общий на все комнаты. Если печатать через for loop то в каждой комнате будут все предметы а не только предметы добавленные в эту комнату. 

Нажмите, чтобы раскрыть...

Делай свойство НЕ статическим, тогда оно будет привязано к конкретному объекту

 

Mr.Paige сказал(а):

но ещё сейчас вспомнил, что в твоём случае, в переменных предметов будут храниться не объекты, а ссылки на эти объекты. так как объекты ссылочного типа. 

Нажмите, чтобы раскрыть...

В этом то и прикол ООП. МагияPepeDance.gif?

dJozy

Пользователь

Регистрация: 23.03.2013

Сообщения: 2684

Рейтинг: 2894

dJozy

Регистрация: 23.03.2013

Сообщения: 2684

Рейтинг: 2894

Aloe Armor сказал(а):

Где именно декларировать лист в .cpp и в .h файлах?

Нажмите, чтобы раскрыть...

декларируешь в h(getter setter тоже сюда), функции в cpp

Aloe Armor

Пользователь

Регистрация: 14.05.2017

Сообщения: 748

Рейтинг: 382

Aloe Armor

Регистрация: 14.05.2017

Сообщения: 748

Рейтинг: 382

urusai88 сказал(а):

Делай свойство НЕ статическим, тогда оно будет привязано к конкретному объекту

Нажмите, чтобы раскрыть...

Не помогло

Фух, разобрался:

1) Декларировал лист объектов в .h без static

2) Добавил этот лист в констрактор в .cpp 

saw_tooth

Пользователь

Регистрация: 20.08.2013

Сообщения: 5550

Рейтинг: 3286

saw_tooth

Регистрация: 20.08.2013

Сообщения: 5550

Рейтинг: 3286

Какие то глупости понаписывали вы тут парни. И так, с начала.

1. Есть предметы

2. Есть комнаты

3. Комнаты могут владеть предметами.

4. Игрок может видеть предметы в комнатах.

5. Игрок может менять комнаты.

 

https://godbolt.org/z/AUQGM8

 

классы:

Items - хранит все существующие вещи как кей-вэлью map.

AbsRoom - абстрактный класс комнат, реализует методы по работе с комнатами, список вещей, имя комнаты

FirstRoom, SecondRoom - производные классы от AbsRoom, реализуют "настоящие комнаты" с вещами, и именем комнаты

Player - непосредственно плеер, умеет ходить по комнатам, и рассматривать там вещи.

 

Вот тут то и наступает время ООП:

Имея указатель на базовый класс комнаты (AbsRoom), мы может полиморфно использовать комнаты одним и тем же игроком, переопределяя в конструкторе каждой комнаты ее атрибуты - имя и количество вещей.

Более того, каждая комната не хранит объекты типа вещь (в данном случае это пока std pair@ int, string@), и сама не работает с ними, перекладывая эту работу на класс, который непосредственно ответственный за это - Items, оперируя лишь индексами (ключами) для каждой вещи.

 

UPD. Для тех у кого нет компилятора, или впадлу распаковывать - https://repl.it/repls/UntrueSereneMedian

 

urusai88 сказал(а):

В любом случае, хранить индексы для доступа к объектам из массива в ООП - бред. Суть ООП как раз таки в том, что бы этого не делать

Нажмите, чтобы раскрыть...

Можно подробно пояснить, почему хранение ссылок на объекты - это бред, и как внезапно ООП решает эту проблему?

Aloe Armor

Пользователь

Регистрация: 14.05.2017

Сообщения: 748

Рейтинг: 382

Aloe Armor

Регистрация: 14.05.2017

Сообщения: 748

Рейтинг: 382

saw_tooth сказал(а):

Какие то глупости понаписывали вы тут парни. И так, с начала.

1. Есть предметы

2. Есть комнаты

3. Комнаты могут владеть предметами.

4. Игрок может видеть предметы в комнатах.

5. Игрок может менять комнаты.

 

https://godbolt.org/z/AUQGM8

 

классы:

Items - хранит все существующие вещи к кей-вэлью map.

AbsRoom - абстрактный класс комнат, реализует методы по работе с комнатами, список вещей, имя комнаты

FirstRoom, SecondRoom - производные классы от AbsRoom, реализуют "настоящие комнаты" с вещами, и именем комнаты

Player - непосредственно плеер, умеет ходить по комнатам, и рассматривать там вещи.

 

Вот тут то и наступает время ООП:

Имея указатель на базовый класс комнаты (AbsRoom), мы может полиморфно использовать комнаты одним и тем же игроком, переопределяя в конструкторе каждой комнаты ее атрибуты - имя и количество вещей.

Более того, каждая комната не хранит объекты типа вещь (в данном случае это пока std pair@ int, string@), и сама не работает с ними, перекладывая эту работу на класс, который непосредственно ответственный за это - Items, оперируя лишь индексами (ключами) для каждой вещи.

 

UPD. Для тех у кого нет компилятора, или впадлу распаковывать - https://repl.it/repls/UntrueSereneMedian

 

Можно подробно пояснить, почему хранение ссылок на объекты - это бред, и как внезапно ООП решает эту проблему?

Нажмите, чтобы раскрыть...

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