3

背景

我有以下内容:

类火扩展元素,

类木材扩展元素,

合成元素的类瓷砖。

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

我想实现火蔓延的功能——当火元素“接触”木元素时,我希望木元素变成火。从逻辑上讲,这应该在火元素中完成,但是这样做,我无法更改给定的瓷砖元素(例如从木头到火)。

“世界”被初始化为由木元素组成的瓦片网格,除了一个具有应该传播的火元素的瓦片。

我试过的

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

我尝试将整个功能移至 Tile 类。虽然它确实解决了问题,但我不喜欢它有两个原因:

  1. 从逻辑上讲,我希望火自主行动,这意味着是蔓延的,而不是瓷砖

  2. 结果,Tile 类有很多只与火相关的方法(例如 spread()),这需要我检查 - “这个 tile 是由火元素组成的吗?”,这是不好的做法。

代码示例

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 块木头后,火停止蔓延。从某种意义上说,火可以跟踪它消耗的木材。

提前致谢!

4

1 回答 1

2

我的瞬间想到应该有一个类来管理火势蔓延。比方说,有一个World班级,一个了解瓷砖网格及其性质的班级。对, 它的位置, 它的邻居Fire一无所知。Wood也是如此Wood。它们是独立的对象,过着自己的生活。由World他们来决定他们住在哪里以及他们如何相互交流。

让我们想象一下Fire发布一个事件并告诉

我想传播。这是我想占据的位置。我的身高/我的强度/我的频率/我的[火的任何其他特征]是……”

World接收到消息,考虑到火的特性,并相应地修改网格。

好的。随着火的这种强度/高度/[任何其他特征],这个和这个Wood元素将被燃烧。我将用新实例替换它们Fire(或者我将复制现有Fire对象并将对它的引用放入预期将被烧毁的单元格中)。

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

Fire(Fire current, Elements... newlyTakenElements)

不过,您可以自由地找出自己的方式来记录它。

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


我正在考虑替代方案......我仍然认为提供太多信息(整个图块地图)Fire不是一种方法,Wood并且Fire单元格之间的任何交互都应该通过管理器类。

看看另一种场景,它表明它World提供了自身的部分视图,作为与火元素相邻的列表。

-我想传播。

-好的。这是相邻可燃元素的列表。我不知道你的特点。由您决定要燃烧多少个细胞(以及哪些细胞)。

-我把它们都烧掉了。给我多一点!

世界给出另一个清单,直到火被熄灭。

于 2019-04-22T20:40:00.490 回答