java-两个对象的双向依赖

背景

 

我有以下几点:

消防扩展元素类,

木材延伸元素类,

组成元素的Tile类.

Tile类表示世界/屏幕/画布中的图块,并具有一些图形和逻辑功能.
它合成一个Element对象,因为“世界”中的每个图块都是由某种物质(=元素)组成的.

我想实现火势蔓延的功能-当火元素“接触”木元素时,我希望木元素成为火.
从逻辑上讲,这应该在fire元素内完成,但是这样做我无法更改给定Tile的元素(例如,从Wood更改为Fire).

“世界”初始化为由Wood元素组成的图块网格,但其中一个具有Fire元素的图块应该散布.

我尝试过的

我尝试将元素链接在一起,这意味着每个元素都可以访问他的四个最近的邻居.这样,火可以进入附近的一块木头.
这不能解决在火接触到木头时更改Tile元素类型的问题.

我尝试将整个功能移至Tile类.尽管它确实可以解决问题,但由于两个原因,我不喜欢它:

>从逻辑上讲,我希望火势能够自主行动,这意味着火势是蔓延的,而不是地砖.
>因此,Tile类具有许多仅与火灾相关的方法(例如spread()),这需要我进行检查-“此tile是否由fire元素组成?”,这是一种不好的做法.

代码示例

 

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;

}

深入

>切片的“网格”由二维的Tiles数组(逻辑部分)和一个由所有切片组成的JavaFx Pane(可视部分)组成.
>火接触到相邻的瓦片并将其从“木材”转换为“火焰”时会“蔓延”.当消耗(=转换为火)给定的木材阈值时,火停止蔓延.它消耗了30块木头之后.从某种意义上说,火可以追踪消耗的木材.

提前致谢!

最佳答案

我立刻想到,应该有一个班级来管理火势蔓延.假设有一个世界级的类,它了解瓷砖的网格及其性质.火对木材,木材的位置和邻居一无所知.伍德也是如此.它们是生活的独立对象.世界将决定他们的居住地以及彼此之间的互动方式.

 

假设Fire发布了一个事件并告诉

 

I wanna spread. Here are the locations I’d like to occupy. My height/my intensity/my frequency/my [any other characteristic of fire] is …”

世界收到消息,考虑到火的特征,并相应地修改网格.

 

OK. With this intensity/height/[any other characteristic] of the fire, this and this Wood elements are going to be burnt. I will replace them with new Fire instances (or I will make a copy the existing Fire object and put a reference to it into the expected-to-be-burnt cells).

拥有一个Fire实例并跟踪其燃烧的所有元素将很有趣.我可以看到复制构造函数的修改版本.

 

Fire(Fire current, Elements... newlyTakenElements)

不过,您可以自由地以自己的方式记录它.

这样,当火灾结束时,您将能够(全部或部分)还原细胞.您还可以分析火势如何发展.我不确定这是否可以派上用场,但是设计很有趣.

我正在考虑替代方案…我仍然认为,向Fire提供过多的信息(整个图块)是不可行的,Wood和Fire单元之间的任何交互都应该通过经理类.

让我们看一下另一种场景,该场景暗示世界提供了一部分自身视图,作为与火元素相邻的列表.

 

-I wanna spread.

-OK. Here’s a list of adjacent burnable elements. I am not aware of your characteristics. It’s up to you to decide how many cells (and which ones) you are going to burn.

-I’ve burned them all. Give me more!

The world gives another list until the fire is sated.

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页