2 / 2 / 0
Регистрация: 11.05.2015
Сообщений: 45
|
|
1 | |
Как правильно составить логику приложения (игра)?12.10.2015, 03:08. Показов 2090. Ответов 11
Метки нет Все метки)
(
Народ, выручайте советом! Я снова застрял на очередной задаче...
Вот текст: Я застрял на этапе структурирования приложения. Изначально мои мысли были такие: Создаем класс Game, там создаем поле field типа Game (двумерный массив 10x10) - это игровое поле. От класс Game наследуются классы Враги, Бонусы и Препятствия, а от каждого из этих соответственно их классы (т.е. от Бонусов - Вишня, Яблоко). Затем заполняю двумерный массив field экземплярами каждого класса в произвольном порядке (ну, т.е. сначала ставлю туда к примеру Деревья и Камни, потом расставляю бонусы и т.д). Т.е. Использую в данном случае ссылочную совместимость при наследовании. Но на этом этапе уже то StackOverFlow Exeption ловлю, то зацикливание. Другими словами: при создании одного экземпляра Яблока, например, он вызывает конструктор по умолчанию родительского класса и так с созданием каждого объекта. Да, я пока плохо усвоил полиморфизм. Может кто-то подсказать, как в данном случае правильно организовать логику приложения, что от чего наследовать или где использовать агрегацию?
0
|
|
12.10.2015, 03:08 | |
Ответы с готовыми решениями:
11
Инкапсуляция или как правильно отделить логику Задача на логику из реального приложения Правильно ли это : выносить логику по возможности в данные ? Карты, игра на память. Как запрограммировать логику игры |
123 / 123 / 72
Регистрация: 11.05.2014
Сообщений: 331
|
|
12.10.2015, 03:28 | 2 |
Если задача состоит именно в решении задачи на "зачёт", то вам достаточно описать именно структуру без реализации ( как и написано в задании ), следовательно на этом этапе физически не может быть никаких исключений от компилятора, т.к. фактически пишется только каркас.
Если же у вас задача не "сдать зачёт и забыть", то тогда будет лучше, если вы приложите код.
0
|
2 / 2 / 0
Регистрация: 11.05.2015
Сообщений: 45
|
|
12.10.2015, 03:48 [ТС] | 3 |
Задача и сдать и понять! Код уже в третий раз с нуля переписываю. Мне просто понять хотелось бы, только иерархию классов, что от чего наследуется. Код я уже сам, думаю, что осилю написать.
0
|
978 / 873 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
|
|
12.10.2015, 04:23 | 4 |
Уже непонятно, как это... Поле какого типа-то? Того же типа, что и класс, в каком оно лежит? Совершенно бессмысленно, а если вы попробуете таки это сделать и в конструкторе/сразу при объявлении создавать там объект, то все зависнет, а потом влетит StackOverflow из-за бесконечной рекурсии, о чем вы собственно и пишите.
Наследование-это отношение, которое выражается словом "является". Враги, бонусы и препятствия являются игрой? Тут логично сделать базовый класс "Объект на поле", а от него наследовать все эти предметы, в том числе и игрока. Ну а от бонусов уже-определенные фрукты, а от монстров-определенных зверей и тд.
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,398
|
|
12.10.2015, 05:54 | 5 |
Напрашивается такая иерархия - класс карта, естественно карта хранящая все, которой можно задавать размер, и список игровых объектов. В одном из ее методов - главный цикл который вызывает пересчетет и отрисовку. класс статический объект - т.е. препятствие и бонус. Который умеет отображаться как на карте так и на экране. От него поражден класс динамический объект, который кроме всего остального имеет указатель на класс "контроллер", который он опрашивает на предмет расчета куда перемещаться.
Абстрактный класс контроллер, от которого порождаются контроллеры персонажей и контроллер игрока (осуществляющий опрос с клавиатуры), а так же контроллер "сетевой игрок"
1
|
25 / 25 / 23
Регистрация: 07.06.2015
Сообщений: 142
|
|
12.10.2015, 06:36 | 6 |
На вскидку:
я бы делал класс field - ячейка, наследуемый от него класс area - игровая площадка. В классе field зарезервировал бы место под класс object. От класса object - классы enemy, bonus, isEmpty, barrier. Соответствено enemy - Ваши волки, медведи, etc bonus - вишни, яблоки, грибы, etc isEmpty - мне кажется, что для пустого поля нужен отдельный класс, но имхо и на вскидку. barrier - деревья, камни, etc. Игрок - отдельный класс, наверное. и в нем обработка собыйтий, когда объект класса игрок сталкивается с объектом другого класса, обработка перемещений, etc. Как-то так ![]()
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,398
|
|
12.10.2015, 07:49 | 7 |
Ну и зачем плодить кучу классов, если игрок и противник соответствуют классу динамический объект а бонус и препятствие - статический. разница только в поведении, все остальное одинаковое. К каждому цепляется контроллер поведения, который можно легко переназначать не меняя всего остального, даже на лету, не пересоздавая объект. При этом сами контроллеры можно и в группы связывать для обеспечения противникам группового ИИ.
0
|
2 / 2 / 0
Регистрация: 11.05.2015
Сообщений: 45
|
|
12.10.2015, 16:20 [ТС] | 8 |
Fulcrum_013, я правильно понимаю, что класс карта - это главный класс, от которого все наследуются? Т.е. от него напрямую наследуется СтатическийКласс, а от статического - Динамический Класс?
Одно непонятно, собственно, у меня и до этого объяснения возникала подобная проблема: сама карта - как ее задать? Двумерный массив? Но массив чего? Я до этого пробовал создавать массив того же класса, но мне уже объснили, какую ошибку я тем самым совершал. ![]() Спасибо!
0
|
978 / 873 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
|
|
12.10.2015, 17:42 | 9 |
Нет, абсолютно неправильно. Читайте мой пост выше. Наследование существует для того, чтобы не писать лишний код. Наследник перенимает все методы/свойства класса, от которого происходит наследование. Как я уже писал, это можно выразить словом "является". Карта и объект на ней-это разные вещи, методы и свойства карты объекту ни к чему.
Самое простое-массив ссылок на объекты класса, который обозначен в данном посте как "СтатическийОбъектНаКарте"(имеется в виду объект на карте, который не двигается). "Статический класс" это совсем другое, не путайте ![]()
1
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,398
|
|
12.10.2015, 18:15 | 10 |
Нет, от него никто не наследуется, в него все отоброжаются, он только хранит двумерный массив, и при отображении в нем определяет коллизию. Наследуются объекты карты от базового "объекта", к примеру от "статический объект". Ну и от базового объекта "контроллер" наследуются специализированные контроллеры.
1
|
2 / 2 / 0
Регистрация: 11.05.2015
Сообщений: 45
|
|
12.10.2015, 20:47 [ТС] | 11 |
Сделал и сдал задачу успешно! Всем спасибо огромное!
![]()
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,398
|
|
12.10.2015, 20:52 | 12 |
В более сложных играх может быть и так, только в разных экземплярах класса. К примеру дом со своей картой помещений может быть более мелкомасштабной картой одной ячейки глобальной карты, а соответственно карта дома вместе с домом - статическим объектом на глобальной карте. Поэтому в общем то имеет смысл порождать карту от класса "статический объект".
0
|
12.10.2015, 20:52 | |
Помогаю со студенческими работами здесь
12
Как правильно реализовать логику программы? Как правильно отделить логику от вида Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |