Двунаправленная зависимость двух объектов - PullRequest
3 голосов
/ 22 апреля 2019

ФОН

У меня есть следующее:

Класс Огнедышащий Элемент,

класс Древесный расширяющий элемент,

класс Плитка, из которой состоит элемент.

Класс Tile представляет плитку в мире / экране / холсте и имеет некоторую графическую и логическую функциональность. Он состоит из объекта Элемент, потому что каждая плитка в "мире" состоит из некоторой субстанции (= элемента).

Я хочу добиться функциональности распространения огня - когда элемент огня «касается» элемента дерева, я хочу, чтобы элемент дерева превратился в огонь. Логично, что это должно быть сделано внутри элемента огня, но я не могу изменить элемент данной плитки (например, с дерева на огонь).

«Мир» инициализируется как сетка плиток, состоящих из элементов дерева, за исключением одной плитки, в которой есть элемент Огня, который должен распространяться.

ЧТО Я ПРОБОВАЛ

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

Я попытался переместить всю функциональность в класс Tile. Хотя это решает проблему, мне это не нравится по двум причинам:

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

  2. В результате класс Tile имеет много методов, которые имеют отношение только к огню (например, spread ()), что требует от меня проверки - «эта плитка состоит из элемента огня?», Что плохо практика.

ПРИМЕР КОДА

class Fire extends Element{
    public void spread(){
        // Move to all four neighbors and turn them into Fire elements
    }
}

class Wood extends Element{
}

class Tile{
    private Element _element;

}

ГЛУБИНА

  1. «Сетка» плиток состоит из двумерного массива плиток (логическая часть) и панели JavaFx, состоящей из всех плиток (визуальная часть).

  2. Огонь «распространяется», когда он касается соседней плитки и превращает ее из дерева в огонь. Огонь перестает распространяться, когда он поглощает (= превращается в огонь) определенный порог древесины, например, после этого потребляется 30 кусков дерева. В каком-то смысле огонь может отследить количество потребляемой древесины.

Заранее спасибо!

1 Ответ

2 голосов
/ 22 апреля 2019

Мое мгновение пришло к выводу, что должен быть класс для управления распространением огня.Допустим, есть класс World, который знает о сетке плиток и их природе.Fire ничего не знает о Wood, его местонахождении, соседях.То же самое касается Wood.Это независимые объекты, которые живут своей жизнью.World решает, где они находятся и как они взаимодействуют друг с другом.

Давайте представим, Fire выпускает событие и сообщает

Я хочу распространяться.Вот места, которые я хотел бы занять.Мой рост / моя интенсивность / моя частота / моя [любая другая характеристика огня] равна ... "

World получает сообщение, принимает во внимание характеристики огня и изменяет сеткусоответственно.

ОК. С этой интенсивностью / высотой / [любой другой характеристикой] огня этот и этот Wood элементы будут сожжены. Я заменю их новыми Fireэкземпляры (или я сделаю копию существующего Fire объекта и вставлю ссылку на него в ожидаемые для сжигания ячейки).

Было бы интересно иметь один экземплярFire и отследите все сожженные элементы. Я вижу измененную версию конструктора копирования.

Fire(Fire current, Elements... newlyTakenElements)

Хотя вы можете сами придумать, как это записать.

С этим вы сможете восстановить клетки (полностью или частично), когда огонь закончится. Вы также можете проанализировать, как развивался огонь. Я не уверен, что это может пригодиться, ноэто увлекательнодизайн.


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

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

-Я хочу распространяться.

-Хорошо.Вот список соседних выгорающих элементов.Я не в курсе ваших характеристик.Вам решать, сколько клеток (и каких) вы собираетесь сжечь.

- Я сжег их все.Дай мне больше!

Мир дает другой список, пока огонь не погаснет.

...